Датчик наклона или ударов на модуле акселерометра MMA_7455 для мото (авто) сигнализаций.

Нет ответов
Orbis64
Offline
Зарегистрирован: 18.11.2015

Доброго времени суток друзья. Являясь владельцем скутера, однажды мне пришла в голову идея оснастить его сигнализацией. Мото сигнализация была приобретена у наших китайских друзей. Сигнализация имеет встроенный датчик ударов он хоть и имеет регулировку чувствительности, но на плавные перемещения не реагирует.

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

В моём представлении всё это должно работать так. Питние ардуины должно появляться при постановке под охрану, после чего  считываем показания акселерометра и сохраняем их. Затем читаем показания из датчика и как только текущие показания по любой из осей отклонилось, от сохранённого на заданную величину включаем вибро мотор на заданное время. (В скетче вместо мотора стоит пищать пъезо динамиком). Так же есть мысль, если текущие показания датчика превысили сохранённые и вибро мотор отработал, перезаписать показания датчика. Так как в моей жизни это первый акселерометр то меня немного озадачило то, что в состоянии покоя показания датчика колеблются +/- 2,3 ед. Интересно это нормально? 

В программировании я полный ламер и Ардуино по большей части полезное хобби, я накропал следующий код и представляю его на Ваш суд. За основу взял пример из библиотеки MMA_7455. В общем весь сей опус выкладываю ради Вашей критики, может научите чему хорошему. Бросание тапками и конструктивная критика преветствуется.

[code]

#include <Wire.h> //Include the Wire library
#include <MMA_7455.h> //Include the MMA_7455 library

MMA_7455 mySensor = MMA_7455(); //Make an instance of MMA_7455

///////////////////Декларируем переменные////////////////////
char xVal, yVal, zVal; // Переменные для текущих значений от датчика
char xMem, yMem, zMem; // Переменные для сохранённых значений
int flag = 0; //введем новую переменную flag
int sens = 5; // переменная для настройки чувствительности

void setup()   /****** SETUP: RUNS ONCE ******/
{
  Serial.begin(9600);
  //delay(500);
  Serial.println("MMA7455 ТЕСТ");

  // Устанавливаем нужную чувствительность
  // 2 = 2g, 4 = 4g, 8 = 8g
  mySensor.initSensitivity(8); // Вводим необходимое значение

  /*Калибровка датчика. Калибровка в плоском положении, попытайтесь получить: xVal = 0, yVal = 0, zVal = +63 (1 G) !!!
    Запустить со смещениями = 0,0,0 и посмотреть необходимую коррекцию
  */
  //mySensor.calibrateOffset(0,0,0); // Раскомментируйте для первого раза: чтобы найти поправки
  mySensor.calibrateOffset(0, 14, -9); // Введите поправки и раскоментируйте

}
void loop()
{
  if (flag == 0) // если flag==0, то....
  {
    xMem = mySensor.readAxis('x'); // считываем из датчика значение оси X и записываем её в переменную xMem
    yMem = mySensor.readAxis('y'); // считываем из датчика значение оси Y и записываем её в переменную xMem
    zMem = mySensor.readAxis('z'); // считываем из датчика значение оси Z и записываем её в переменную xMem
    flag = 1; // Меняем значение в переменной flag с 0 на 1
  }

  // Выводим в порт значеия датчика которые записами в переменные xyzMem//
  Serial.print("X Mem = ");
  Serial.print(xMem, DEC);
  Serial.print("   Y Mem = ");
  Serial.print(yMem, DEC);
  Serial.print("   Z Mem = ");
  Serial.println(zMem, DEC);
  //delay(1000);

  xVal = mySensor.readAxis('x'); // Считываем ось X
  yVal = mySensor.readAxis('y'); // Считываем ось Y
  zVal = mySensor.readAxis('z'); // Считываем ось Z

  // Выводим в порт текущие значеия с датчика //
  Serial.print("X Val = ");
  Serial.print(xVal, DEC);
  Serial.print("   Y Val = ");
  Serial.print(yVal, DEC);
  Serial.print("   Z Val = ");
  Serial.println(zVal, DEC);
  //delay(1000);

  if (xVal <= (xMem - sens) || xVal >= (xMem + sens)) // Если текущие значение датчика оси X меньше или равно Mem - sens или больше или равно Mem + sens то...
  {
    tone(7, 2500, 500); // Пищим пъезой
    Serial.println("Движение оси X"); // Отправляем в порт
    //flag = 0; // Меняем значение в переменной flag с 1 на 0 чтобы записать в переменную Mem новые значения с датчика (подстраиваемся под изменения)
    //delay(1000);
  }

  if (yVal <= (yMem - sens) || yVal >= (yMem + sens)) // Если текущие значение датчика оси Y меньше или равно Mem - sens или больше или равно Mem + sens то...
  {
    tone(7, 2500, 500); // Пищим пъезой
    Serial.println("Движение оси Y"); // Отправляем в порт
    //flag = 0; // Меняем значение в переменной flag с 1 на 0 (подстраиваемся под изменения)
    //delay(1000);
  }

  if (zVal <= (zMem - sens) || zVal >= (zMem + sens)) // Если текущие значение датчика оси Z меньше или равно Mem - sens или больше или равно Mem + sens то...
  {
    tone(7, 2500, 500); // Пищим пъезой
    Serial.println("Движение оси Z"); // Отправляем в порт
    //flag = 0; // Меняем значение в переменной flag с 1 на 0 (подстраиваемся под изменения)
    //delay(1000);
  }
}


[/code]