Как использовать 3-осевой линейный акселерометр H3LIS331DL с arduino для обнаружения резкого торможения автомобиля
Я здесь новичок, недавно я работал с 3-осевым линейным акселерометром H3LIS331DL с мини-модулем I2C
Вот код для осей X, Y, Z.
#include <movingAvg.h>
#include <Wire.h>
// Адрес I2C H3LIS331DL равен 0x18(24)
#define Addr 0x18
movingAvg xAxisAverage(5);
int readingIndex=0;
int readingArray[10];
int firstFiveReadingAverage;
int lastFiveReadingAverage;
void setup()
{
// Инициализация связи I2C в качестве ВЕДУЩЕГО
Wire.begin();
// Инициализируйте последовательную связь, установите скорость передачи данных = 9600
Serial.begin(9600);
// Начать передачу I2C
Wire.beginTransmission(Addr);
// Select control register 1
Wire.write(0x20);
// Включить оси X, Y, Z, режим включения питания, скорость вывода данных 50 Гц
Wire.write(0x27);
// Остановить передачу I2C
Wire.endTransmission();
// Start I2C Transmission
Wire.beginTransmission(Addr);
// Select control register 4
Wire.write(0x23);
// Set full scale, +/- 100g, continuous update
Wire.write(0x00);
// Stop I2C Transmission
Wire.endTransmission();
delay(300);
}
void loop()
{
unsigned int data[6];
for(int i = 0; i < 6; i++)
{
// Start I2C Transmission
Wire.beginTransmission(Addr);
// Select data register
Wire.write((40+i));
// Stop I2C Transmission
Wire.endTransmission();
// Request 1 byte of data
Wire.requestFrom(Addr, 1);
// Read 6 bytes of data
// xAccl lsb, xAccl msb, yAccl lsb, yAccl msb, zAccl lsb, zAccl msb
if(Wire.available() == 1)
{
data[i] = Wire.read();
}
}
delay(300);
// Convert the data
int xAccl = ((data[1] * 256) + data[0]);
int yAccl = ((data[3] * 256) + data[2]);
int zAccl = ((data[5] * 256) + data[4]);
if(readingIndex<10)
{
readingArray[readingIndex]=xAccl;
readingIndex++;
if(readingIndex == 10)
{
firstFiveReadingAverage=(readingArray[0]+readingArray[1]+readingArray[2]+readingArray[3]+readingArray[4])/5;
lastFiveReadingAverage= (readingArray[5]+readingArray[6]+readingArray[7]+readingArray[8]+readingArray[9])/5 ;
if(lastFiveReadingAverage>firstFiveReadingAverage)
{
Serial.print("Hardbrake Pressed");
Serial.println();
}
readingIndex=0;
}
}
//int avg = avgAccl.reading(xAccl);
// calculate the moving average
// Output data to serial monitor
Serial.print("Acceleration in X-Axis : ");
Serial.println(xAccl);
Serial.print("Acceleration in Y-Axis : ");
Serial.println(yAccl);
Serial.print("Acceleration in Z-Axis : ");
Serial.println(zAccl);
delay(300);
Serial.println();
int average=xAxisAverage.reading(xAccl);
if (average < -1000)
{
Serial.print("Hardbraking: ");
//Serial.print(average/100.0);
Serial.print(average);
Serial.println();
}
}
Я изменил код, но значения продолжают повторяться, когда я включаю жесткое торможение, и оно продолжает повторяться, даже если я отпустил тормоз.
Вот результат
@Rajbir, 👍-1
Обсуждение1 ответ
Резкое торможение-это не что иное, как сильное отрицательное ускорение, поэтому вы можете сравнить свои значения ускорения с пороговым значением. Давайте предположим, что положительная ось x-это направление движения вашего автомобиля. Это означает, что торможение даст ускорение в отрицательном направлении x. Затем вы сначала определяете определенный порог ускорения. Ускорение в отрицательном направлении x выше этого уровня означает, что это "резкое" торможение (вам придется проверить себя, какое значение вы хотите для этого). Затем вы проверяете, находятся ли значения считывания ниже отрицательного нашего порога (так как ускорение в отрицательном направлении будет представлено отрицательным числом).
int braking_threshold=1000;
...
void loop(){
...
// Преобразование данных
int xAccl = ((data[1] * 256) + data[0]);
int yAccl = ((data[3] * 256) + data[2]);
int zAccl = ((data[5] * 256) + data[4]);
if(xAccl < -1*braking_threshold){
// Делайте все, что хотите, при резком торможении здесь
}
...
}
Обратите внимание, что часто данные акселерометра довольно шумные, особенно при установке на транспортное средство, которое будет вибрировать во время движения (из-за двигателей и тому подобного). Возможно, вам потребуется применить некоторый фильтр к считанным значениям, прежде чем вы сможете их использовать. Это может быть так же просто, как усреднение некоторых значений, но также может перейти к более сложным алгоритмам фильтрации, в зависимости от того, насколько вам нужны данные без шума. Вам нужно будет проверить, какие значения вы реально получаете в своем приложении и насколько они шумные. Но снижение шума данных-это совершенно другая тема и, следовательно, не по теме для этого вопроса.
Также обратите внимание, что ваш акселерометр измеряет диапазон 200g. Это довольно много, я бы сказал. При измерении относительно низких ускорений соотношение сигнал / шум будет довольно плохим. Поэтому я надеюсь, что вы действительно хотите измерить ускорения, которые заполняют этот диапазон, а не использовать только очень небольшой процент диапазона.
Спасибо за помощь, я думаю только об этом, но не знаю, как использовать. и я думаю сохранить значения в массиве, скажем, 5 сохраненных значений, а затем берется среднее из этих 5 значений, а затем сохраняются новые 5 значений и берется среднее из этих значений.После этого мы сравним среднее значение, и эта вещь происходит в цикле.Как написать код для этого?, @Rajbir
Вы можете поискать в Google "скользящую среднюю". В Интернете и на этом сайте есть много примеров кода., @chrisl
Спасибо за помощь., @Rajbir
Я сделал этот код, но при сильном нажатии тормоза среднее значение продолжает повторяться, даже если я его отпустил., @Rajbir
Вы можете проверить приведенный выше код.., @Rajbir
Что вы подразумеваете под "продолжает повторяться"? Пожалуйста, будьте более ясны и добавьте пример вывода с описанием того, что вы сделали, чтобы получить этот вывод, @chrisl
Я загрузил результат выше.., @Rajbir
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- как быстро loop() работает в Arduino
- Использовать Arduino Nano V3 для программирования другого Arduino (Pro Mini)?
- Как прочитать значение PIN PWM-выхода?
- Как мигать светодиодом и одновременно запускать другой код?
- Arduino Nano IOT LSM6DS3 получить угол гироскопа в градусах
- Подключение Arduino Nano к Raspberry Pi Zero
- Как автоматически сбросить модуль NRF24L01
Резкое торможение-это не что иное, как сильное отрицательное ускорение, поэтому вы можете сравнить свои значения ускорения с пороговым значением. Как это связано с усреднением?, @chrisl
Кстати, я новичок в arduino, не могли бы вы поделиться со мной некоторыми примерами., @Rajbir
Примеры чего? Ваш титул и ваш вопрос кажутся мне совершенно разными? Непонятно, о чем вы на самом деле просите, @chrisl
как я могу использовать этот датчик для обнаружения резкого торможения автомобиля с помощью Arduino nano?, @Rajbir