цифровая электроника
вычислительная техника
встраиваемые системы

 

Arduino и акселерометр MMA7455L: принцип работы, схема, код

Автор: Mike(admin) от 13-09-2016, 12:01

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


Arduino и акселерометр MMA7455L: принцип работы, схема, код

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


Для того, чтобы подключить столь миниатюрный акселерометр к разъемам платы Arduino, желательно сделать небольшую печатную плату-переходник. Ее внешний вид, схема и расположение компонентов показаны на изображениях ниже.


Arduino и акселерометр MMA7455L: принцип работы, схема, код

Arduino и акселерометр MMA7455L: принцип работы, схема, код

Arduino и акселерометр MMA7455L: принцип работы, схема, код

Размеры платы составляют всего лишь 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: принцип работы, схема, код

Ниже представлен скетч, позволяющий 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


<Via>


Теги: Arduino, акселерометр



Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий