Как использовать 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();
        }
       }

Я изменил код, но значения продолжают повторяться, когда я включаю жесткое торможение, и оно продолжает повторяться, даже если я отпустил тормоз.

Вот результат

, 👍-1

Обсуждение

Резкое торможение-это не что иное, как сильное отрицательное ускорение, поэтому вы можете сравнить свои значения ускорения с пороговым значением. Как это связано с усреднением?, @chrisl

Кстати, я новичок в arduino, не могли бы вы поделиться со мной некоторыми примерами., @Rajbir

Примеры чего? Ваш титул и ваш вопрос кажутся мне совершенно разными? Непонятно, о чем вы на самом деле просите, @chrisl

как я могу использовать этот датчик для обнаружения резкого торможения автомобиля с помощью Arduino nano?, @Rajbir


1 ответ


0

Резкое торможение-это не что иное, как сильное отрицательное ускорение, поэтому вы можете сравнить свои значения ускорения с пороговым значением. Давайте предположим, что положительная ось 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