Подключаем акселерометр MMA7455

Иногда, например в летающей модели, полезно знать положение объекта относительно Земли. В этом могут помочь датчики, определяющие ускорение. Одним из таких, является акселерометр компании Freescale Semiconductor (или теперь уж NXP Semiconductors — кому как удобнее) MMA7455L. Это маленькая микросхемка способная, тем не менее, замерять ускорения по трем осям, оцифровывать результат, да еще и отправлять полученные данные по интерфейсам SPI или I2C. К питанию «штучка» довольно лояльна: 2,5 … 5,5 В. Точность замера ускорения — 10 бит. Чувствительность можно задать: 2g..8g.

Паять это «маленькое чудо» крайне неудобно.  Для  удобства «ленивых» радиолюбителей выпускаются готовые модули, где на небольшой плате с «нормальными» выводами помимо акселерометра есть стабилизатор напряжения и светодиодик в цепи питания.mma7455_dt


Контакты платы обозначены на рисунке ниже. IN1 и IN2 — выходы платы, которые можно использовать для формирования прерываний в системе (обычно не используются). С питанием — понятно — на плате есть стабилизатор 3,3 В, так что на плату можно подавать «почти все что есть в наличии». С другого торца платы — контакты для подключения цифровых интерфейсов. Справа на рисунке условно показаны направления осей, вдоль которых производятся замеры. На самом деле надо смотреть как оси нарисованы на плате. В общем случае: вдоль корпуса микросхемы — ось X; поперек — ось Y; перпендикулярно плоскости корпуса микросхемы — ось Z.mma7455_pc

Рассмотрим подключение платы. Очень хорошо это описано тут. Подключение производим по I2C. Схема подключения к UNO показана ниже (использованы только 4 контакта платы MMA7455).

arduino_7455

%d1%84%d0%be%d1%82%d0%be-1674
Тестовый скетч для экспериментов с платой практически без изменений взят с упомянутого выше сайта (он же легко может быть создан из тестового примера библиотеки для работы с MMA7455). В скетче для работы с акселерометром используется библиотека для работы с MMA7455 (можно взять там же). Надо отметить, что в этой библиотеке реализован довольно ограниченный функционал: чувствительность — только 2g, точность измерения — только 8 бит, фиксированный (тот, что «зашит в микросхеме по умолчанию») адрес устройства на шине I2C: 0x1D и проч.

// http://arduino-info.wikispaces.com/accelerometer-MMA7455
// Example which uses the MMA_7455 library
// Moritz Kemper, IAD Physical Computing Lab
// moritz.kemper@zhdk.ch
// ZHdK, 03/04/2012
// Released under Creative Commons Licence

#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; //Variables for the values from the sensor

void setup()
{
  Serial.begin(9600);
  // Set the sensitivity you want to use
  // 2 = 2g, 4 = 4g, 8 = 8g
  mySensor.initSensitivity(2);
  // Calibrate the Offset, that values corespond in 
  // flat position to: xVal = -30, yVal = -20, zVal = +20
  // !!!Activate this after having the first values read out!!!
  //mySensor.calibrateOffset(0.23, -43.2, 12.43);
  Serial.println("Hello! This is The Test accelerometer MAA7455.");
}

void loop()
{
  xVal = mySensor.readAxis('x'); //Read out the 'x' Axis
  yVal = mySensor.readAxis('y'); //Read out the 'y' Axis
  zVal = mySensor.readAxis('z'); //Read out the 'z' Axis
  Serial.print("x = ");
  Serial.print(xVal, DEC);
  Serial.print("  y = ");
  Serial.print(yVal, DEC);
  Serial.print("  z = ");
  Serial.println(zVal, DEC);
/*--( Show tilt [Assumes unit has been calibrated ] )----*/  
  if (xVal < -20) Serial.println("Tilted LEFT");
  if (xVal >  20) Serial.println("Tilted RIGHT");  
  if (yVal < -20) Serial.println("Tilted TOWARDS");  
  if (yVal >  20 ) Serial.println("Tilted AWAY");   
  if (zVal < -45 ) Serial.println("UPSIDE DOWN!");    
  delay(500);
}

Программка непрерывно (с периодом в пол-секунды) опрашивает датчик и результат выводит на экран (в монитор, скорость 9600). Интересна небольшая вставка в конце loop() , которая текстом сообщает нам положение датчика (в том случае, если проведена калибровка).

На фото с указанного сайта (свое уж больно не резкое вышло) показано исходное положение датчика. В таком положении по осям X и Y должны быть «нули», а по оси Z — максимум показаний.

mma7455-hold

Я калибровать датчик не стал, у меня в этом положении получились такие данные:
x = -6    y = -24    z = 74
(в идеале должно быть x = 0 y = 0 z = 63 — для достижения именно этих значений надо в строке  mySensor.calibrateOffset(0.23, -43.2, 12.43);   определить константы).

Опыт 1. Наклоняем датчик влево примерно на 45 градусов. У меня получились такие результаты:
x = -46   y = -19   z = 62
т.е. по оси X пошел рост, по Z — должно быть уменьшение, а по Y — остается примерно тоже.

Опыт 2. Ставим плату датчика вертикально, наклоняя ее дальше влево. Результат:
x = -72   y = -17   z = 9
т.е. вся сила тяжести теперь приходится вдоль оси X.

Опыт 3. Из исходного состояния наклоняем плату от себя на 45 градусов. Получаем:
x = -5   y = 23   z = 57
т.е. рост по Y и уменьшение по Z

Опыт 4. Переворачиваем плату «вверх контактами». Результат:
x = -13   y = -22   z = -48
т.е. по оси Z знак сменился на противоположный.

… можно «играться» дальше — до полного понимания «того, чего же показывает датчик». В интернете есть примеры игр с датчиком, дошедшие до создания светящегося шарика, меняющего цвет от своего положения и т.п.

В «опытах» я не привожу текстовые сообщения в мониторе — и без них ясно…

Про абсолютные значения: В нашем скетче установлена чувствительность в 2g. Это означает, что в исходном положении, когда вся тяжесть (1g) приходится «на ось Z«, выдаваемое по этой оси значение будет 63 (максимум для 2g — это 127, вспомним что «вторые пол-байта» работают на отрицательных значениях, т.е. когда «вверх ногами»).mma7455_mn

PS. Для работы с полным функционалом датчика MMA7455 следует изучить статью на arduino.cc, но для большинства задач достаточно вышеописанного…

Добавить комментарий

Ваш e-mail не будет опубликован.

Нажимая кнопку "Отправить" Вы даёте свое согласие на обработку введенной персональной информации в соответствии с Федеральным Законом №152-ФЗ от 27.07.2006 "О персональных данных".