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

Тестовый скетч для экспериментов с платой практически без изменений взят с упомянутого выше сайта (он же легко может быть создан из тестового примера библиотеки для работы с 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 — максимум показаний.
Я калибровать датчик не стал, у меня в этом положении получились такие данные:
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, вспомним что «вторые пол-байта» работают на отрицательных значениях, т.е. когда «вверх ногами»).
PS. Для работы с полным функционалом датчика MMA7455 следует изучить статью на arduino.cc, но для большинства задач достаточно вышеописанного…

