Сегодня акселерометры находят широкое применение в навигационных устройствах, смартфонах, спортивных принадлежностях, робототехнике игрушках и т.п. Они позволяют измерять ускорение, которое является первой производной по скорости и второй производной по пути. Это значит, что с помощью одного такого инерциального датчика можно узнать не только ускорение объекта, но и скорость его перемещения, а также пройденный путь (с погрешностями интегрирования). Просто для этого нужно подключить вычислительное устройство, которое займется интегрированием и другими математическими расчетами.

Среди акселерометров одним из самых распространенных, недорогих, функциональных и простых в обращении является MMA7455L производства компании Freescale. Он может регистрировать ускорение по всем трем осям в пространстве и в любом направлении. У него есть три диапазона чувствительности ± 2g, ± 4g, ± 8g. Передача данных осуществляется с помощью интерфейсов SPI или I2C, а это значит, что мы можем подключить MMA7455L к большинству современных микроконтроллеров. И в данном случае мы подключим его к ATmega328p популярной платы Arduino.
Для того, чтобы подключить столь миниатюрный акселерометр к разъемам платы Arduino, желательно сделать небольшую печатную плату-переходник. Ее внешний вид, схема и расположение компонентов показаны на изображениях ниже.



Размеры платы составляют всего лишь 10 x 18 x 3.6 мм. При питании платы от VIO не забудьте про перемычку J1. Адрес модуля по шине I2C равен 00111011. Семиконтактный разъем с шагом 2.54 мм идеально подходит для подключения к Arduino. Плату можно подключить к шестивыводному разъему аналоговых линий, предварительно отогнув седьмой штырек платы (напряжение питания) и подключив его проводом к линии +3.3 В платы Arduino, как показано на рисунке ниже. В данном случае линия A0 будет выполнять роль VCC, а линия V1 будет задействована в качестве GND. Для взаимодействия Arduino с акселерометром MMA7455L по шине I2C используются линии A4 и A5.

Ниже представлен скетч, позволяющий Arduino работать с акселерометром MMA7455L. Работоспособность кода обеспечивается библиотеками Wire.h и MMA_7455.h. Код позволяет получить данные об ускорении по всем трем осям (X,Y,Z). Эти данные впоследствии выводятся в последовательный порт. Для большего понимания работы акселерометра MMA7455L желательно прочитать документацию.
#include <Wire.h> //Включаем библиотеку Wire
#include <MMA_7455.h> //Включаем библиотеку MMA_7455
const int vcc = A0;
const int gnd = A1;
MMA_7455 mySensor = MMA_7455();
char xVal, yVal, zVal; // переменные величин ускорения
float x, y, z;
void setup()
{
pinMode(gnd, OUTPUT);
pinMode(vcc, OUTPUT);
digitalWrite(gnd, LOW);
digitalWrite(vcc, HIGH);
delay (1000);
Serial.begin(9600);
Serial.println("start");
// устанавливаем чувствительность
// 2 = 2g, 4 = 4g, 8 = 8g
mySensor.initSensitivity(8);
// Настраиваем смещение
mySensor.calibrateOffset(0, 0, 0);
}
void loop()
{
long start = micros();
//xVal = mySensor.readAxis('x'); //Считываем данные по оси X
//yVal = mySensor.readAxis('y'); //Считываем данные по оси Y
//zVal = mySensor.readAxis('z'); //Считываем данные по оси Z
/* Serial.print("x: ");
Serial.print(xVal*0.016, 2);
Serial.print("\t y: ");
Serial.print(yVal*0.016, 2);
Serial.print("\t z: ");
Serial.println(zVal*0.016, 2);
Serial.print("x: ");
Serial.print(xVal,DEC);
Serial.print("\t y: ");
Serial.print(yVal,DEC);
Serial.print("\t z: ");
Serial.print(zVal,DEC);
Serial.print("\t summ: ");
Serial.println((abs(xVal)+abs(yVal)+abs(zVal)),DEC);*/
if (Serial.available() > 0) {
int inByte = Serial.read();
if (inByte==0x01){
Serial.print( average(5,'x')); //Serial.print( "\t" );
Serial.print( average(5,'y')); //Serial.print( "\t" );
Serial.print( average(5,'z')); //Serial.print( "\t" );
}
//Serial.print( micros() - start ); Serial.println();
}
}
char average(int num, char axis){
long tot=0;
char val;
for (int i=1; i<=num; i++){
val=mySensor.readAxis(axis);
tot += val;
//Serial.print( val,DEC );Serial.print( " " );
delay(2);
}
val=tot/num;
//Serial.println( val );
return(val);
}
© digitrode.ru