Вам понадобится
  • - Arduino;
  • - акселерометр ADXL335;
  • - персональный компьютер со средой разработки Arduino IDE.
Инструкция
1
Акселерометры используют для определения вектора ускорения. Акселерометр ADXL335 имеет три оси, и благодаря этому он может определять вектор ускорения в трёхмерном пространстве. Ввиду того, что сила земного притяжения - это тоже вектор, то акселерометр может определять свою собственную ориентацию в трёхмерном пространстве относительно центра Земли.
На иллюстрации приведены рисунки из паспорта (http://www.analog.com/static/imported-files/data_sheets/ADXL335.pdf) на акселерометр ADXL335. Здесь изображены координатные оси чувствительности акселерометра по отношению к геометрическому размещению корпуса устройства в пространстве, а также таблица значений напряжения с 3-х каналов акселерометра в зависимости от его ориентации в пространстве. Данные в таблице приводятся для находящегося в состоянии покоя датчика.
Рассмотрим подробнее, что же показывает нам акселерометр. Пусть датчик лежит горизонтально, например, на столе. Тогда проекция вектора ускорения будет равна 1g по оси Z, или Zout = 1g. По остальным двум осям будут нули: Xout = 0 и Yout = 0. При повороте датчика "на спину", он будет направлен в противоположную сторону относительно вектора силы тяжести, т.е. Zout = -1g. Аналогично измерения снимаются по всем трём осям. Понятно, что акселерометр может быть расположен как угодно в пространстве, поэтому со всех трёх каналов мы будем снимать отличные от нуля показания.
Если датчик сильно тряхнуть вдоль вертикальной оси Z, то значение Zout будет больше, чем "1g". Максимальное измеряемое ускорение - "3g" по каждой из осей в любом из направлений (т.е. как с "плюсом", так и с "минусом").
Оси чувствительности акселерометра и таблица выходных значений
2
Думаю, с принципом работы акселерометра разобрались. Теперь рассмотрим схему подключения.
Чип аналогового акселерометра ADXL335 довольно мелкий и помещён в BGA корпус, и в домашних условиях его сложно смонтировать на плату. Поэтому я буду использовать готовый модуль GY-61 с акселерометром ADXL335. Такие модули в китайских интернет-магазинах стоят практически копейки.
Для питания акселерометра необходимо подать на вывод VCC модуля напряжение +3,3 В. Измерительные каналы датчика подключаются к аналоговым выводам Arduino, например, "A0", "A1" и "A2". Это вся схема :)
Схема подключения акселерометра ADXL335 к Arduno
3
Загрузим вот такой скетч в память Arduino. Будем считывать с аналоговых входов показания по трём каналам, преобразовывать их в напряжение и выводить их в последовательный порт.
Arduino имеет 10-разрядный АЦП, а максимальное допустимое напряжение на выводе - 5 вольт. Измеренные напряжения кодируются битами, которые могут принимать только 2 значения - 0 или 1. Это значит, что весь диапазон измерений будет поделён на (1+1) в 10-ой степени, т.е. на 1024 равных отрезка.
Для того чтобы перевести снимаемые показания в вольты, нужно каждое измеренное на аналоговом входе значение поделить на 1024 (отрезка), а затем умножить на 5 (вольт).
Посмотрим, что же реально приходит с акселерометра на примере оси Z (последний столбец). Когда датчик расположен горизонтально и смотрит вверх, приходят числа (2,03 +/-0,01). Значит, это должно соответствовать ускорению "+1g" по оси Z и углу 0 градусов. Перевернём датчик. Приходят числа (1,69 +/-0,01), что должно соответствовать "-1g" и углу 180 градусов.
Скетч для считывания показаний акселерометра
4
Снимем значения с акселерометра при углах 90 и 270 градусов и занесём в таблицу. Таблица показывает углы поворота акселерометра (столбец "A") и соответствующие им значения Zout в вольтах (столбец "B").
Для наглядности приведён график напряжений на выходе Zout в зависимости от угла поворота. Голубое поле - это область значений в спокойном состоянии (при ускорении 1g). Розовое поле на графике - это запас для того чтобы мы могли измерять ускорение до +3g и до -3g.
При повороте 90 градусов на ось Z приходится нулевое ускорение. Т.е. значение 1,67 вольт - это условный ноль Zo для оси Z. Тогда найти ускорение можно так:
g = Zout - Zo / sensitivity_z, здесь Zout - измеренное значение в милливольтах, Zo - значение при нулевом ускорении в милливольтах, sensitivity_z - чувствительность датчика по оси Z. Чувствительность приведена в паспорте и равна в среднем 300 мВ/g, но вообще лучше провести калибровку акселерометра и вычислить значение чувствительности конкретно для вашего датчика по формуле:
sensitivity_z = [Z(0 град.) - Z(90 град.)] * 1000. В данном случае чувствительность акселерометра по оси Z = (2,03 - 1,68)*1000 = 350 мВ. Аналогично чувствительность нужно будет посчитать для осей X и Y.
В столбце "С" таблицы приводится ускорение, вычисленное для пяти углов при чувствительности, равной 350. Как видно, они практически совпадают с теми, которые показаны на рисунке 1.
Соответствие  углов поворота акселерометра снимаемым показаниям
5
Вспомнив базовый курс геометрии, получим формулу для вычисления углов поворота акселерометра:
angle_X = arctg[ sqrt(Gz^2 + Gy^2) / Gx ].
Значения получаются в радианах. Чтобы перевести их в градусы, поделим на число "Пи" и умножим на 180.
В итоге полный скетч, вычисляющий ускорения и углы поворота акселерометра по всем осям, приведён на иллюстрации. В комментариях даны пояснения к коду программы.
При выводе в порт "Serial.print()" символ "\t" обозначает знак табуляции, чтобы столбцы были ровные и значения располагались друг под другом. "+" означает конкатенацию (соединение) строк. Причём оператор "String()" явно указывает компилятору, что численное значение нужно преобразовать в строку. Оператор "round()" округляет угол с точностью до 1 градуса.
Скетч, вычисляющий ускорения и углы поворота акселерометра
6
Итак, мы с вами научились снимать и обрабатывать данные с аналогового акселерометра ADXL335 при помощи Arduino. Теперь мы можем использовать акселерометр в своих разработках.
Аналоговый акселерометр ADXL335 подключён к Arduino