Страница 1 из 1

Акселерометр ADXL345 (GY-291)

Добавлено: 08 янв 2018, 22:18
jafar-xxl
Это одна из немногих попыток создать пользовательский блок из кода примера от библиотеки. Не знаю на сколько удачно получилось, но валяется давно приобретённый 3-х осевой акселерометр на чипе adxl345. По темам ничего не нашёл. Блоки видимо за ненадобностью тоже никто не делал. Но чтобы как-то использовать имеющуюся железку решил пошаманить. Вот что получилось...
Прилагаю проект с OLED дисплеем 128х64 точки для визуального контроля положения датчика
и пользовательский блок без настроек с выводом значений по осям.
Изображение
Изображение
И видео с примером работы:
https://youtu.be/sQ5OXVzTFCk
P.S. не знаю правильно ли создал тему, но к новому сайту и правилам ещё не адаптировался. :senile:

ADXL345

Добавлено: 10 янв 2018, 20:41
Markys
Китайцы по ошибке положили

ADXL345

Добавлено: 06 фев 2018, 00:12
flett
направление везра возможно определять??

ADXL345

Добавлено: 10 фев 2018, 22:06
jafar-xxl
Для направления другой датчик.

ADXL345

Добавлено: 11 фев 2018, 09:48
AlexCrane
[ref]jafar-xxl[/ref], [ref]Markys[/ref], не приложены библиотеки, проект не компилируется

ADXL345

Добавлено: 11 фев 2018, 23:49
Markys
библиотеки

ADXL345

Добавлено: 26 авг 2018, 12:05
Selya
Апну тему вопросом о датчике adxl345.
Можно ли с помощью блока, присутствующего в этой теме, подучать данные о перегрузке и использовать их в управлении чего либо?
Нашёл пример в сети, где используются эти данные, именно так как и я собираюсь. Речь идёт о ускорении (перегрузке) в следствии торможения автомобиля, где при достижении заданной отрицательного ускорения (перегрузки) (здесь 0.5G), имитируется ESS, система предупреждения о экстренном торможении.
Но как это реализовать в FLProg?
Пожалуйста, подскажите.
Пример:
[spoiler]
#include <Adafruit_NeoPixel.h>
#include <Adafruit_ADXL345_U.h>

//несколько общих комментариев
// я отключил по одному крайнему светодиоду, т.к. они отсвечивали на декоративные панели стоек
//видно на примере этого цикла for (int i=1; i<143; i++ )
//если отключать не нужно, заменяем на for (int i=0; i<144; i++ )

//задний ход и аварийка у меня не используются, т.к. в первом случае яркость никакая, во втором надо подключать входы к лампам поворотников

//поворотники и стоп-сигнал одновременно не включаются, чтобы это реализовать, нужно переписывать соответствующий код скетча (делить ленту на три секции, подбирать тайминги миганий, менять диапазон переменных циклов).
//Дерзайте - все в ваших руках

// Пин для подключения управляющего сигнала светодной ленты
const int PinLS = 2;

//Пины для подключения датчиков
//если более удобно будет подключать контакты в другом порядке - просто поменяйте значения переменных
const int buttonPinL = 3;
const int buttonPinR = 4;
const int buttonPinS = 6;
const int buttonPinD = 5;

//начальные статусы входов (подтянуты к плюсу)
int buttonStateS = HIGH;
int buttonStateD = HIGH;
int buttonStateL = HIGH;
int buttonStateR = HIGH;

// пауза pause_pov1 (в миллисекундах) нужна, чтобы синхронизировать циклы "пробегания" полоски и включения лампочки поворотника
// такое может быть, если используется меньше половины светодиодов
// в моем случае паузы нет (pause_pov1 = 0)
int pause_pov1 = 1;

// этой паузой регулируем длительность состояния, когда все светодиоды выключены
//я определял опытным путем - включал поворотник, засекал по отдельности время ста мыргов лампочкой и ста беганий полоски, разницу делил на 100, на полученное время увеличивал или уменьшал значение переменной (в зависимости от того, отставали или убегали вперед лампочки)
int pause_pov2 = 62;

// переменная для получения значения ускорения
int ix;

Adafruit_NeoPixel strip = Adafruit_NeoPixel(144, PinLS, NEO_GRB + NEO_KHZ800);
Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(12345);

void setup() {
pinMode(buttonPinS, INPUT);
pinMode(buttonPinD, INPUT);
pinMode(buttonPinL, INPUT);
pinMode(buttonPinR, INPUT);

strip.begin();
// гасим ленту
for (int i=0; i<144; i++ ) strip.setPixelColor(i, strip.Color(0,0,0));
strip.show();

accel.begin();

// ограничиваем измеряемый диапазон четырьмя G (этого хватит с большим запасом)
accel.setRange(ADXL345_RANGE_4_G);
accel.setDataRate(ADXL345_DATARATE_100_HZ);
}

void loop() {

// СТОПЫ: если включены - высший приоритет
//Чтобы сделать меняющуюся по ширине полоску в зависимости от интенсивности торможения
//(уточнение - никакой светомузыки, ширина полосы после нажатия на тормоз не меняется!)
//от плавного торможения до тапки в пол.
//Добавляем еще одну переменную, например, ix2,
//присваиваем ей значение ix с коэффициентом умножения,
//заодно инвертируем и округляем до целого
//ix = event.acceleration.x;
//ix2 = -round(ix*10);
//ограничиваем для плавного торможения в пробках
//(чтобы не менялась при каждом продвижении на 5 метров)
//if (ix2<10) ix2 = 0;
//и для резкого торможения.
//Реальный диапазон изменения переменной ix — от 0 до -5
//для максимальной ширины полосы при G равном или большем 0.5
//if (ix2 >50) ix2 = 50;
//затем меняем циклы в блоке СТОП for (int i=1; i<143; i++ ) на for (int i=51-ix2; i<93+ix2; i++ )
//Получаем минимальную ширину полоски ~30 см (для стояния в пробке) и максимальную для резкого торможения
//конец комментария

buttonStateS = digitalRead(buttonPinS);
if (buttonStateS == LOW)
{
sensors_event_t event;
accel.getEvent(&event);
ix = event.acceleration.x;

// проверка резкого торможения - мигающий режим
// значение 5 - это 0,5G, минус - торможение
if (ix < -5)
{
for (int is=0; is<15; is++ ) {
for (int i=1; i<143; i++ ) strip.setPixelColor(i, strip.Color(240,0,0));
strip.show();
delay(10 + is*10);
for (int i=1; i<143; i++ ) strip.setPixelColor(i, strip.Color(0,0,0));
strip.show();
delay(10 + is*3);
buttonStateS = digitalRead(buttonPinS);
if ( buttonStateS == HIGH ) return;
}
}

// помигали - и хватит, включаем постоянный режим, если педаль тормоза еще нажата
// или если не было резкого торможения и предыдущее условие не сработало

if (buttonStateS == LOW) {
for (int i=1; i<143; i++ ) strip.setPixelColor(i, strip.Color(200,0,0));
strip.show();
while(buttonStateS == LOW){
buttonStateS = digitalRead(buttonPinS);
delay(50);
}
// плавно гасим
for (int is=0; is<20; is++ ) {
for (int i=1; i<143; i++ ) strip.setPixelColor(i, strip.Color(190 - is*10,0,0));
strip.show();
delay(10);
} // СТОПЫ конец
}
}
else // если СТОПЫ выключены
{

// ЗАДНИЙ ХОД: если включен - средний приоритет
buttonStateD = digitalRead(buttonPinD);
if (buttonStateD == LOW) {
for (int i=1; i<37; i++ ) strip.setPixelColor(i, strip.Color(63,63,63));
for (int i=107; i<143; i++ ) strip.setPixelColor(i, strip.Color(63,63,63));
strip.show();
while(buttonStateD == LOW){
buttonStateD = digitalRead(buttonPinD);
delay(50);
}
//плавно гасим
for (int is=0; is<16; is++ ) {
for (int i=1; i<37; i++ ) strip.setPixelColor(i, strip.Color(60 - is*4,60 - is*4,60 - is*4));
for (int i=107; i<143; i++ ) strip.setPixelColor(i, strip.Color(60 - is*4,60 - is*4,60 - is*4));
strip.show();
delay(10);
}
}

buttonStateL = digitalRead(buttonPinL);
buttonStateR = digitalRead(buttonPinR);

// если включена аварийка
if (buttonStateL == LOW && buttonStateR == LOW) {
for (int il=0; il<71; il++ ) {
strip.setPixelColor(71-il, strip.Color(63,31,0));
strip.setPixelColor(il+72, strip.Color(63,31,0));
strip.show();
delay(pause_pov1);
}
for (int il=0; il<71; il++ ) {
strip.setPixelColor(71-il, strip.Color(0,0,0));
strip.setPixelColor(il+72, strip.Color(0,0,0));
strip.show();
delay(pause_pov1);
}
delay(pause_pov2);
}

// если включен ЛЕВЫЙ ПОВОРОТНИК
if (buttonStateL == LOW && buttonStateR == HIGH) {
for (int il=0; il<71; il++ ) {
strip.setPixelColor(il+72, strip.Color(220,120,0));
strip.show();
delay(pause_pov1);
}
for (int il=0; il<71; il++ ) {
strip.setPixelColor(il+72, strip.Color(0,0,0));
strip.show();
delay(pause_pov1);
}
delay(pause_pov2);
}
// если включен ПРАВЫЙ ПОВОРОТНИК
if (buttonStateL == HIGH && buttonStateR == LOW) {
for (int il=0; il<71; il++ ) {
strip.setPixelColor(71-il, strip.Color(220,120,0));
strip.show();
delay(pause_pov1);
}
for (int il=0; il<71; il++ ) {
strip.setPixelColor(71-il, strip.Color(0,0,0));
strip.show();
delay(pause_pov1);
}
delay(pause_pov2);
} //правый поворотник конец

} //конец условия else Стоп

// задержка для следующего опроса датчиков
delay(10);
}
[/spoiler]
Так же есть польские работы с этим датчиком adxl345, с использованием данных G:
[spoiler]
Сайт иностранный, и если размещение ссылки на него противоречит правилам, просьба к админам - удалить ссылку.
http://www.jarzebski.pl/arduino/czujnik ... xl345.html
[/spoiler]