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

Пользовательские блоки расширяющие базовый функуионал программы по работе с различными датчиками и энкодерами
Правила форума
Рекомендации по размещению блоков:
Автор блока создает подробное описание блока, отличие от подобных(если есть на данный момент).Сложные блоки очень желательно с примерами.
При выходе новых версий редактирует/дополняет свой первый пост с указанием даты, версии, причины.
В каждой теме обсуждается только выложенный автором блок - баги, возможность (или предложение) доработки и прочие хотелки.
Свои блоки, переработанные, с другими библиотеками, протоколами и т.д.- размещаем либо сами отдельно, либо обсуждаем и дорабатываем в форуме Разработка блоков.
Пользователи улучшив блок автора и проверив его работоспособность - могут обратиться к автору или модераторам с просьбой добавить их версию блока в первое сообщение темы.
Ответить
Аватара пользователя
jafar-xxl
Рядовой
Сообщения: 4
Зарегистрирован: 15.10.2016{, 09:32}
Репутация: 1
Откуда: Москва

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

#1

Сообщение jafar-xxl » 08.01.2018{, 22:18}

Это одна из немногих попыток создать пользовательский блок из кода примера от библиотеки. Не знаю на сколько удачно получилось, но валяется давно приобретённый 3-х осевой акселерометр на чипе adxl345. По темам ничего не нашёл. Блоки видимо за ненадобностью тоже никто не делал. Но чтобы как-то использовать имеющуюся железку решил пошаманить. Вот что получилось...
Прилагаю проект с OLED дисплеем 128х64 точки для визуального контроля положения датчика
и пользовательский блок без настроек с выводом значений по осям.
Изображение
Изображение
И видео с примером работы:
https://youtu.be/sQ5OXVzTFCk
P.S. не знаю правильно ли создал тему, но к новому сайту и правилам ещё не адаптировался. :senile:
Вложения
ADXL345_(CODE).ubi
(14.85 КБ) 466 скачиваний
ADXL345_OLED 128x64 I2C.flp
(786.35 КБ) 338 скачиваний

Markys
Рядовой
Сообщения: 16
Зарегистрирован: 30.04.2017{, 09:38}
Репутация: 2
Откуда: Дмитров

ADXL345

#2

Сообщение Markys » 10.01.2018{, 20:41}

Китайцы по ошибке положили
Вложения
GY-291_(CODE).ubi
(46.72 КБ) 227 скачиваний

flett
Рядовой
Сообщения: 5
Зарегистрирован: 24.10.2015{, 21:45}
Репутация: 0

ADXL345

#3

Сообщение flett » 06.02.2018{, 00:12}

направление везра возможно определять??

Аватара пользователя
jafar-xxl
Рядовой
Сообщения: 4
Зарегистрирован: 15.10.2016{, 09:32}
Репутация: 1
Откуда: Москва

ADXL345

#4

Сообщение jafar-xxl » 10.02.2018{, 22:06}

Для направления другой датчик.

Аватара пользователя
AlexCrane
Капитан
Сообщения: 895
Зарегистрирован: 20.10.2017{, 13:22}
Репутация: 294
Откуда: Ульяновск
Имя: Александр

ADXL345

#5

Сообщение AlexCrane » 11.02.2018{, 09:48}

jafar-xxl, Markys, не приложены библиотеки, проект не компилируется
Если не знаю, то не скажу. Если скажу, то сначала проверю...
Если нет возможности отблагодарить материально, хотя бы оцени пост....

Markys
Рядовой
Сообщения: 16
Зарегистрирован: 30.04.2017{, 09:38}
Репутация: 2
Откуда: Дмитров

ADXL345

#6

Сообщение Markys » 11.02.2018{, 23:49}

библиотеки
Вложения
Desktop.rar
(16.39 КБ) 245 скачиваний

Selya
Рядовой
Сообщения: 3
Зарегистрирован: 26.08.2018{, 00:33}
Репутация: 0
Имя: Сергей

ADXL345

#7

Сообщение Selya » 26.08.2018{, 12:05}

Апну тему вопросом о датчике adxl345.
Можно ли с помощью блока, присутствующего в этой теме, подучать данные о перегрузке и использовать их в управлении чего либо?
Нашёл пример в сети, где используются эти данные, именно так как и я собираюсь. Речь идёт о ускорении (перегрузке) в следствии торможения автомобиля, где при достижении заданной отрицательного ускорения (перегрузки) (здесь 0.5G), имитируется ESS, система предупреждения о экстренном торможении.
Но как это реализовать в FLProg?
Пожалуйста, подскажите.
Пример:
СпойлерПоказать
#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);
}
Так же есть польские работы с этим датчиком adxl345, с использованием данных G:
СпойлерПоказать
Сайт иностранный, и если размещение ссылки на него противоречит правилам, просьба к админам - удалить ссылку.
http://www.jarzebski.pl/arduino/czujnik ... xl345.html

Ответить

Вернуться в «Датчики и энкодеры»