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

 

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, акселерометр



   Благодарим Вас за интерес к информационному проекту digitrode.ru.
   Если Вы хотите, чтобы интересные и полезные материалы выходили чаще, и было меньше рекламы,
   Вы можее поддержать наш проект, пожертвовав любую сумму на его развитие.


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

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

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