Аналоговый акселерометр (Troyka-модуль)

Используйте аналоговый трёхосный акселерометр (Troyka-модуль) для определения ускорения действующее в направлении осей X, Y, Z и применения для определения ориентации объекта в пространстве: углов крена и тангажа.
Видеообзор
Подключения и настройка

Датчик общается с управляющей электроникой по трём аналоговым выходам X , Y и Z . При подключении к Arduino или Iskra JS удобно использовать Troyka Shield.
В связи с тем, что выходные данные акселерометра завязаны на опорное напряжение управляющей платы, его необходимо калибровать .
Калибровка акселерометра
Так как данные с акселерометра завязаны на опорное напряжение управляющей платы, каждый акселерометр необходимо калибровать индивидуально. Рассмотрим калибровку модуля.
Железная часть
Прошейте управляющую платформу скетчем приведённым ниже. Если вы используете платформу Arduino, скачайте и установите библиотеку TroykaAccelerometer.
Код для Arduino
// библиотека для работы с аналоговым акселерометром #include // пины подключения осей акселерометра #define PIN_X A1 #define PIN_Y A2 #define PIN_Z A0 // создаём объект для работы с аналоговым акселерометром TroykaAccelerometer accel(PIN_X, PIN_Y, PIN_Z); void setup() { // открываем последовательный порт Serial.begin(9600); } void loop() { // выводим сырые некалиброваные значения акселерометра в Serial-порт Serial.print(accel.readVoltageX(),3); Serial.print(","); Serial.print(accel.readVoltageY(),3); Serial.print(","); Serial.println(accel.readVoltageZ(),3); delay(100); }
Код для Iskra JS
Программная часть

Скачайте и запустите утилиту AccelCalibration .

В открывшимся окне выберите номер «COM-порта» управляющей платы и нажмите «Open».

Последовательно нажимайте на вопросительные знаки и устанавливайте акселерометр в положение, соответствующее всплывающей картинке.

После каждого замера сохраняйте текущие значения компаса с помощью кнопки «Save».
Далее нажмите на кнопку «Calculate Calibration Data», после чего получите данные по каждой Оси (X, Y, Z) в вольтах:
Минимальные и максимальные значения ускорения;
Значения при нулевом ускорении;

Чувствительность.
Сохраните полученные значения для дальнейшего использования акселерометра.
Примеры для Arduino
Для получения данных с аналогового акселерометра скачайте и установите библиотеку TroykaAccelerometer. Она переводит полученное напряжения с аналоговых портов в единицы измерения, доступ к которым осуществляется через простые и понятные функции.
В качестве примера выведем в Serial порт направление и величину ускорения свободного падения по осям X, Y, Z.
// библиотека для работы с аналоговым акселерометром #include // пины подключения осей акселерометра #define PIN_X A1 #define PIN_Y A2 #define PIN_Z A0 // калибровочные значения одного из акселерометров // для получения своих калибровочных значений воспользуйтесь скетчем «AccelerometerCalibration» #define MIN_X 1.20 #define MAX_X 1.80 #define MIN_Y 1.20 #define MAX_Y 1.80 #define MIN_Z 1.25 #define MAX_Z 1.85 // создаём объект для работы с аналоговым акселерометром TroykaAccelerometer accel(PIN_X, PIN_Y, PIN_Z); void setup() { // открываем последовательный порт Serial.begin(9600); Serial.println("Serial begin is OK"); // каждый акселерометр необходмо калибровать индивидуально // для получения калибровочных значений воспользуйтесь скетчем «AcelerometerCalibration» // калибруем акселерометр по калибровочным значениям одного из партии accel.calibrate(MIN_X, MAX_X, MIN_Y, MAX_Y, MIN_Z, MAX_Z); } void loop() { // выводим направление и величины ускорения в единицах «g» Serial.print(accel.readGX()); Serial.print("\t"); Serial.print(accel.readGY()); Serial.print("\t"); Serial.print(accel.readGZ()); Serial.print("\t"); // выводим направление и величины ускорения в «м/с²» Serial.print(accel.readAX()); Serial.print("\t"); Serial.print(accel.readAY()); Serial.print("\t"); Serial.println(accel.readAZ()); delay(100); }
Увеличение точности показаний
Акселерометр (Troyka-модуль) основан на чипе ADXL335, который в свою очередь работает от 3,3 вольт. Это значит, что на выходных пинах модуля будет максимум 3,3 вольта. В итоге с управляющими платами с 5 вольтовой логикой, например Arduino Uno, мы теряем практически половину значений АЦП, что уменьшаем точность показаний почти в два раза. Мы предлагаем небольшой лайфхак.
По умолчанию за опорное напряжение АЦП берётся опорное напряжение управляющей платы, что в случае Arduino Uno 5 вольт. Это можно изменить, тем самым увеличить точность датчика.

Возьмём за опорное напряжение АЦП пин AREF и соединим его с помощью провода папа-папа с пином 3,3 вольта.
В скетче необходимо сообщить Arduino, что опорное напряжение для АЦП будет браться с пина AREf . Для этого необходимо вызвать метод из библиотеки setAnalogReference с параметром EXTERNAL :
accel.setAnalogReference(EXTERNAL);
Теперь диапазон АЦП от нуля до 3,3 вольт. Что повышает точность показаний акселерометра почти в два раза.
Код прошивки
// библиотека для работы с аналоговым акселерометром #include // пины подключения осей акселерометра #define PIN_X A1 #define PIN_Y A2 #define PIN_Z A0 // калибровочные значения одного из акселерометров // для получения своих калибровочных значений воспользуйтесь скетчем «AccelerometerCalibration» #define MIN_X 1.20 #define MAX_X 1.80 #define MIN_Y 1.20 #define MAX_Y 1.80 #define MIN_Z 1.25 #define MAX_Z 1.85 // создаём объект для работы с аналоговым акселерометром TroykaAccelerometer accel(PIN_X, PIN_Y, PIN_Z); void setup() { // открываем последовательный порт Serial.begin(9600); Serial.println("Serial begin is OK"); // каждый акселерометр необходмо калибровать индивидуально // для получения калибровочных значений воспользуйтесь скетчем «AcelerometerCalibration» // калибруем акселерометр по калибровочным значениям одного из партии accel.calibrate(MIN_X, MAX_X, MIN_Y, MAX_Y, MIN_Z, MAX_Z); // изменяем источник опорного напряжения, на пин AREF accel.setAnalogReference(EXTERNAL); } void loop() { // выводим направление и величины ускорения в единицах «g» Serial.print(accel.readGX()); Serial.print("\t"); Serial.print(accel.readGY()); Serial.print("\t"); Serial.print(accel.readGZ()); Serial.print("\t"); // выводим направление и величины ускорения в «м/с²» Serial.print(accel.readAX()); Serial.print("\t"); Serial.print(accel.readAY()); Serial.print("\t"); Serial.println(accel.readAZ()); delay(100); }
Пример для Espruino
// создаём объект для работы с акселерометром и передаём ему пины подключения по трём осям var accel = require("ADXL335").connect(A1, A2, A0); setInterval(function() { // считываем данные с акселерометра в единицах g var data = accel.readG(); // выводим данные в консоль console.log("x: " + data[0] + " y: " + data[1] + " z: " + data[2]); }, 100);
Элементы платы
Аналоговый акселерометр ADXL335

Преобразователь питания
Стабилизатор NCP582 с выходом 3,3 вольта. Обеспечивает питание акселерометра ADXL335. Максимальный выходной ток составляет 150 мА.
Светодиодная индикация
Светодиод g — индикатор ускорения действующее на ось Z .
Акселерометр: инструкция, схемы и примеры использования
Используйте акселерометр для определения величины ускорения свободного падения по осям X, Y, Z. Датчик отвечает за поворот дисплея в современном телефоне или подсчёт шагов в фитнес-браслете.

Если вам необходимо определить положение вашего девайса в пространстве, обратите внимания на IMU-сенсор на 10 степеней свободы.
Видеообзор
Акселерометр в обзоре IMU-модуля.
Пример работы для Arduino и XOD
В качестве мозга для считывания показаний с датчика рассмотрим платформу из серии Arduino, например, Uno.
На аппаратном уровне инерционный модуль общается с управляющей электроникой по шине I²C. Но не переживайте о битах и байтах: используйте библиотеку TroykaIMU и на выходе получите готовы данные.
Схема устройства

Подключите акселерометр к пинам питания и шины I²C — SDA и SCL платформы Arduino Uno. Для коммуникации используйте соединительные провода «мама-папа».

Для быстрой сборки и отладки устройства возьмите плату расширения Troyka Shield, которая одевается сверху на Arduino Uno методом бутерброда. Для коммуникации используйте трёхпроводной шлейф «мама-мама», который идёт в комплекте с датчиком.

С Troyka Slot Shield провода не понадобятся вовсе.
Вывод данных
В качестве примера выведем в Serial-порт величины ускорения свободного падения по осям X, Y и Z.
// библиотека для работы I²C #include // библиотека для работы с модулями IMU #include // создаём объект для работы с акселерометром Accelerometer accel; void setup() { // открываем последовательный порт Serial.begin(115200); // выводим сообщение о начале инициализации Serial.println("Accelerometer init. "); // инициализация акселерометра accel.begin(); // устанавливаем чувствительность акселерометра // 2g — по умолчанию, 4g, 8g accel.setRange(RANGE_2G); // выводим сообщение об удачной инициализации Serial.println("Initialization completed"); } void loop() { // вывод направления и величины ускорения в м/с² по оси X Serial.print(accel.readAX()); Serial.print("\t\t"); // вывод направления и величины ускорения в м/с² по оси Y Serial.print(accel.readAY()); Serial.print("\t\t"); // вывод направления и величины ускорения в м/с² по оси Z Serial.print(accel.readAZ()); Serial.print("\t\t"); Serial.println(""); delay(100); /* // вывод направления и величины ускорения в м/с² по X, Y и Z float x, y, z; accel.readAXYZ(&x, &y, &z); Serial.print(x); Serial.print("\t\t"); Serial.print(y); Serial.print("\t\t"); Serial.print(z); Serial.println(""); delay(100); */ }
Пример для Espruino
В качестве мозга для считывания показаний с датчика рассмотрим платформы из серии Espruino, например, Iskra JS.
Схема устройства

Подключите акселерометр к пинам питания и шины I²C — SDA и SCL платформы Iskra JS. Для коммуникации используйте соединительные провода «мама-папа».

Для быстрой сборки и отладки устройства возьмите плату расширения Troyka Shield, которая одевается сверху на Iskra JS методом бутерброда. Для коммуникации используйте трёхпроводной шлейф «мама-мама», который идёт в комплекте с датчиком.

С Troyka Slot Shield провода не понадобятся вовсе.
Вывод данных
В качестве примера выведем в консоль величины ускорения свободного падения по осям X, Y и Z.
// Настраиваем шину I2C I2C1.setup({sda: SDA, scl: SCL, bitrate: 400000}); // Подключаем модуль var accel = require('@amperka/accelerometer').connect(I2C1); // Инициализируем модуль accel.init(); setInterval(function(){ // Отображаем силы, действующие на акселерометр print(accel.read('G')); }, 500);
Пример для Raspberry Pi
В качестве мозга для считывания показаний с датчика рассмотрим одноплатные компьютеры Raspberry Pi, например, Raspberry Pi 4.
Схема устройства

Подключите акселерометр к пинам SDA и SCL шины I²C компьютера Raspberry Pi.

Для быстрой сборки и отладки устройства возьмите плату расширения Troyka Cap, которая надевается сверху на малину методом бутерброда.
Программная настройка
Вывод данных
А написать пример кода для Raspberry Pi оставим вам домашним заданием.
Элементы платы

Акселерометр на LIS331DLH
Акселерометр выполнен на чипе LIS331DLH и представляет собой миниатюрный датчик ускорения, разработанный по технологии MEMS от компании STMicroelectronics. Адрес устройства по умолчанию равен 0x18, но может быть изменен на 0x19. Подробности читайте в разделе смена адреса модуля.
Регулятор напряжения
Линейный понижающий регулятор напряжения NCP698SQ33T1G обеспечивает питание MEMS-чипа и других компонентов сенсора. Диапазон входного напряжения от 3,3 до 5 вольт. Выходное напряжение 3,3 В с максимальным выходным током 150 мА.
Преобразователь логических уровней
Преобразователь логических уровней PCA9306DCT необходим для сопряжения датчика с разными напряжениями логических уровней от 3,3 до 5 вольт. Другими словами сенсор совместим как с 3,3 вольтовыми платами, например, Raspberry Pi, так и с 5 вольтовыми — Arduino Uno.
Troyka-контакты
Датчик подключается к управляющей электронике через две группы Troyka-контактов:
Питание (V) — соедините с рабочим напряжением микроконтроллера.
Земля (G) — соедините с землёй микроконтроллера.
Сигнальный (D) — пин данных шины I²C. Подключите к пину SDA микроконтроллера.
Сигнальный (C) — пин тактирования шины I²C. Подключите к пину SCL микроконтроллера.
Смена адреса модуля
Иногда в проекте необходимо использовать несколько акселерометров. Для этого на модуле предусмотрены контактная площадка. Для смена адреса капните каплей припоя на отведённую контактную площадку.
| Модуль | Адрес без перемычки | Адрес с перемычкой |
|---|---|---|
| Акселерометр | 0x18 | 0x19 |
Акселерометр: инструкция, схемы и примеры использования
Используйте акселерометр для определения величины ускорения свободного падения по осям X, Y, Z. Датчик отвечает за поворот дисплея в современном телефоне или подсчёт шагов в фитнес-браслете.

Если вам необходимо определить положение вашего девайса в пространстве, обратите внимания на IMU-сенсор на 10 степеней свободы.
Видеообзор
Акселерометр в обзоре IMU-модуля.
Пример работы для Arduino и XOD
В качестве мозга для считывания показаний с датчика рассмотрим платформу из серии Arduino, например, Uno.
На аппаратном уровне инерционный модуль общается с управляющей электроникой по шине I²C. Но не переживайте о битах и байтах: используйте библиотеку TroykaIMU и на выходе получите готовы данные.
Схема устройства

Подключите акселерометр к пинам питания и шины I²C — SDA и SCL платформы Arduino Uno. Для коммуникации используйте соединительные провода «мама-папа».

Для быстрой сборки и отладки устройства возьмите плату расширения Troyka Shield, которая одевается сверху на Arduino Uno методом бутерброда. Для коммуникации используйте трёхпроводной шлейф «мама-мама», который идёт в комплекте с датчиком.

С Troyka Slot Shield провода не понадобятся вовсе.
Вывод данных
В качестве примера выведем в Serial-порт величины ускорения свободного падения по осям X, Y и Z.
// библиотека для работы I²C #include // библиотека для работы с модулями IMU #include // создаём объект для работы с акселерометром Accelerometer accel; void setup() { // открываем последовательный порт Serial.begin(115200); // выводим сообщение о начале инициализации Serial.println("Accelerometer init. "); // инициализация акселерометра accel.begin(); // устанавливаем чувствительность акселерометра // 2g — по умолчанию, 4g, 8g accel.setRange(RANGE_2G); // выводим сообщение об удачной инициализации Serial.println("Initialization completed"); } void loop() { // вывод направления и величины ускорения в м/с² по оси X Serial.print(accel.readAX()); Serial.print("\t\t"); // вывод направления и величины ускорения в м/с² по оси Y Serial.print(accel.readAY()); Serial.print("\t\t"); // вывод направления и величины ускорения в м/с² по оси Z Serial.print(accel.readAZ()); Serial.print("\t\t"); Serial.println(""); delay(100); /* // вывод направления и величины ускорения в м/с² по X, Y и Z float x, y, z; accel.readAXYZ(&x, &y, &z); Serial.print(x); Serial.print("\t\t"); Serial.print(y); Serial.print("\t\t"); Serial.print(z); Serial.println(""); delay(100); */ }
Пример для Espruino
В качестве мозга для считывания показаний с датчика рассмотрим платформы из серии Espruino, например, Iskra JS.
Схема устройства

Подключите акселерометр к пинам питания и шины I²C — SDA и SCL платформы Iskra JS. Для коммуникации используйте соединительные провода «мама-папа».

Для быстрой сборки и отладки устройства возьмите плату расширения Troyka Shield, которая одевается сверху на Iskra JS методом бутерброда. Для коммуникации используйте трёхпроводной шлейф «мама-мама», который идёт в комплекте с датчиком.

С Troyka Slot Shield провода не понадобятся вовсе.
Вывод данных
В качестве примера выведем в консоль величины ускорения свободного падения по осям X, Y и Z.
// Настраиваем шину I2C I2C1.setup({sda: SDA, scl: SCL, bitrate: 400000}); // Подключаем модуль var accel = require('@amperka/accelerometer').connect(I2C1); // Инициализируем модуль accel.init(); setInterval(function(){ // Отображаем силы, действующие на акселерометр print(accel.read('G')); }, 500);
Пример для Raspberry Pi
В качестве мозга для считывания показаний с датчика рассмотрим одноплатные компьютеры Raspberry Pi, например, Raspberry Pi 4.
Схема устройства

Подключите акселерометр к пинам SDA и SCL шины I²C компьютера Raspberry Pi.

Для быстрой сборки и отладки устройства возьмите плату расширения Troyka Cap, которая надевается сверху на малину методом бутерброда.
Программная настройка
Вывод данных
А написать пример кода для Raspberry Pi оставим вам домашним заданием.
Элементы платы

Акселерометр на LIS331DLH
Акселерометр выполнен на чипе LIS331DLH и представляет собой миниатюрный датчик ускорения, разработанный по технологии MEMS от компании STMicroelectronics. Адрес устройства по умолчанию равен 0x18, но может быть изменен на 0x19. Подробности читайте в разделе смена адреса модуля.
Регулятор напряжения
Линейный понижающий регулятор напряжения NCP698SQ33T1G обеспечивает питание MEMS-чипа и других компонентов сенсора. Диапазон входного напряжения от 3,3 до 5 вольт. Выходное напряжение 3,3 В с максимальным выходным током 150 мА.
Преобразователь логических уровней
Преобразователь логических уровней PCA9306DCT необходим для сопряжения датчика с разными напряжениями логических уровней от 3,3 до 5 вольт. Другими словами сенсор совместим как с 3,3 вольтовыми платами, например, Raspberry Pi, так и с 5 вольтовыми — Arduino Uno.
Troyka-контакты
Датчик подключается к управляющей электронике через две группы Troyka-контактов:
Питание (V) — соедините с рабочим напряжением микроконтроллера.
Земля (G) — соедините с землёй микроконтроллера.
Сигнальный (D) — пин данных шины I²C. Подключите к пину SDA микроконтроллера.
Сигнальный (C) — пин тактирования шины I²C. Подключите к пину SCL микроконтроллера.
Смена адреса модуля
Иногда в проекте необходимо использовать несколько акселерометров. Для этого на модуле предусмотрены контактная площадка. Для смена адреса капните каплей припоя на отведённую контактную площадку.
| Модуль | Адрес без перемычки | Адрес с перемычкой |
|---|---|---|
| Акселерометр | 0x18 | 0x19 |
Как подключить аналоговый акселерометр ADXL335 к Arduino

В этот раз мы займёмся подключением аналогового трёхосного акселерометра ADXL335 к Arduino.
Инструкция по подключению акселерометра ADXL335 к Arduino
Нам понадобится:
- плата Arduino UNO или иная совместимая;
- модуль с акселерометром ADXL335;
- соединительные провода (рекомендую вот такой набор);
- макетная плата (breadboard);
- персональный компьютер со средой разработки Arduino IDE.
1 Принцип действияцифрового акселерометра
Акселерометры используют для определения вектора ускорения. Акселерометр ADXL335 имеет три оси, и благодаря этому он может определять вектор ускорения в трёхмерном пространстве.
Ввиду того, что сила земного притяжения – это тоже вектор, мы можем определять ориентацию акселерометра в трёхмерном пространстве относительно центра Земли.
На иллюстрации приведены рисунки из паспорта на акселерометр ADXL335. Здесь изображены координатные оси чувствительности акселерометра по отношению к геометрическому размещению корпуса устройства в пространстве, а также значения ускорений, принимаемые с 3-х каналов акселерометра в зависимости от его ориентации в пространстве. Данные приводятся для находящегося в состоянии покоя датчика, на который действует только сила земного тяготения.

Рассмотрим подробнее, что же показывает нам акселерометр. Пусть датчик лежит горизонтально, например, на столе. Тогда проекция вектора ускорения будет равна «1g» по оси Z, или Zout = 1g. По остальным двум осям будут нули: Xout = 0 и Yout = 0. При повороте датчика «на спину», он будет направлен в противоположную сторону относительно вектора силы тяжести, т.е. Zout = −1g. Аналогично измерения снимаются по всем трём осям. Понятно, что акселерометр может быть расположен как угодно в пространстве, поэтому со всех трёх каналов мы будем снимать отличные от нуля показания.
Если датчик сильно тряхнуть вдоль вертикальной оси Z, то значение Zout будет больше, чем «1g». Максимальное измеряемое ускорение составляет «±3g» по каждой из осей («плюс» и «минус» тут обозначают направление ускорения).
Думаю, с принципом работы акселерометра разобрались. Теперь рассмотрим схему подключения.
2 Схема подключения акселерометра к Arduino
Чип аналогового акселерометра ADXL335 довольно мелкий и помещён в BGA корпус, и в домашних условиях его сложно смонтировать на плату. Поэтому я буду использовать готовый модуль GY-61 с акселерометром ADXL335.
Для питания акселерометра необходимо подать на вывод VCC модуля напряжение +3,3 В . Измерительные каналы датчика подключаются к аналоговым выводам Arduino, например, «A0», «A1» и «A2». Это вся схема 🙂

3 Калибровкааналогового акселерометра ADXL335
Arduino имеет 10-разрядный АЦП , а максимальное допустимое напряжение на выводе – 5 вольт. Измеренные напряжения кодируются битами, которые могут принимать только 2 значения – 0 или 1. Это значит, что весь диапазон измерений будет поделён на (1+1) 10 , т.е. на 1024 равных отрезка. Для того чтобы перевести снимаемые показания в вольты, нужно каждое измеренное на аналоговом входе значение поделить на 1024 (отрезка), а затем умножить на 5 (вольт).
Загрузим вот такой скетч в память Arduino. Будем считывать с аналоговых входов показания по трём каналам, преобразовывать их в напряжение и выводить в последовательный порт.
//определяем аналоговые пины: const int xPin = A0; const int yPin = A1; const int zPin = A2; void setup() //инициализируем послед. порт: Serial.begin(9600); > void loop() // считываем показания: int xRead = analogRead(xPin); int yRead = analogRead(yPin); int zRead = analogRead(zPin); //Выводим показания в порт в Вольтах: Serial.print("x: "); Serial.print(xRead * 5 / 1024.0); Serial.print(" | y: "); Serial.print(yRead * 5 / 1024.0); Serial.print(" | z: "); Serial.println(zRead * 5 / 1024.0); delay(100); //задержка 100 мс >
Посмотрим, что же реально приходит с акселерометра на примере оси Z (см. последний столбец на иллюстрации). Когда датчик расположен горизонтально и смотрит вверх, приходят числа (2,03±0,01). Это должно соответствовать ускорению «1g» по оси Z и углу 0° согласно паспорту на ADXL335. Перевернём датчик. Приходят числа (1,69±0,01), что должно соответствовать «−1g» и углу 180°.

4 Определение ускоренийпо трём осям акселерометра
Снимем значения с акселерометра при углах 90° и 270° и занесём в таблицу. Таблица показывает углы поворота акселерометра (столбец «A») и соответствующие им значения Zout в вольтах (столбец «B»).

Для наглядности приведён график напряжений на выходе Zout в зависимости от угла поворота. Голубое поле – это область значений в спокойном состоянии (при ускорении 1g). Розовое поле на графике – это запас для того чтобы мы могли измерять ускорение до +3g и до −3g.
При угле поворота 90° на ось Z приходится нулевое ускорение. Т.е. значение 1,67 вольт – это условный ноль Z0. Тогда определим ускорение так: g = Zout – Z0 / Sz, здесь Zout – измеренное значение в милливольтах, Z0 – значение при нулевом ускорении в милливольтах, Sz – чувствительность датчика по оси Z, измеренная в мВ/g.
Чувствительность акселерометра приведена в паспорте и равна в среднем 300 мВ/g или 0,3 В/g, но вообще лучше провести калибровку акселерометра и вычислить значение чувствительности конкретно для вашего датчика по формуле: Sz = Z(0°) – Z(90°) В данном случае чувствительность акселерометра по оси Z = 2,03 – 1,68 = 0,35 В/g. Аналогично чувствительность нужно будет посчитать для осей X и Y.
В столбце «С» таблицы приводится расчётное ускорение при чувствительности, равной 350 мВ/g. Как видно, расчёты практически совпадают с номинальными величинами, которые даются на первом рисунке из паспорта на датчик ADXL335, т.е. наш датчик довольно точно показывает свою ориентацию в пространстве (я показал это просто для самопроверки, дальше это не пригодится).
5 Определение углов поворота акселерометра
Вспомнив базовый курс школьной геометрии, выведем формулу для вычисления углов поворота акселерометра: angle_X = arctg[ √(Gz 2 + Gy 2 ) / Gx ]. Значения получаются в радианах. Чтобы перевести радианы в градусы, поделим результат на число π и умножим на 180°.
В итоге полный скетч, вычисляющий ускорения и углы поворота акселерометра по всем осям, приведён на врезке. В комментариях даны пояснения к коду программы.
const int xPin = A0; //определяем аналоговые пины, const int yPin = A1; //к которым подключим const int zPin = A2; //три канала акселерометра const float Vmax = 5.0; //макс. допустимое напряжение на аналоговом входе const float x0 = 1.71; //значения по осям при нулевых "g"; const float y0 = 1.69; //эти значения вы должны определить const float z0 = 1.68; //самостоятельно (см.шаг 4) const float sens_x = 0.35; //чувствительность по осям в В/g; const float sens_y = 0.35; //эти значения вы должны определить const float sens_z = 0.35; //самостоятельно (см.шаг 4) void setup() Serial.begin(9600); //инициализация последовательного порта > void loop() unsigned int value_x = analogRead(xPin); //считываем значения с акселерометра unsigned int value_y = analogRead(yPin); unsigned int value_z = analogRead(zPin); float Gx=(value_x*Vmax/1024.0 − x0)/sens_x; //определяем ускорения по осям float Gy=(value_y*Vmax/1024.0 − y0)/sens_y; float Gz=(value_z*Vmax/1024.0 − z0)/sens_z; Serial.print("Gx:\t" + String(Gx)); //выводим ускорения в послед. порт Serial.print("\t| Gy:\t" + String(Gy)); Serial.println("\t| Gz:\t" + String(Gz)); float angle_x = atan(sqrt(Gz*Gz + Gy*Gy) / Gx)*180 / PI; //ищем углы поворота float angle_y = atan(sqrt(Gx*Gx + Gz*Gz) / Gy)*180 / PI; float angle_z = atan(sqrt(Gx*Gx + Gy*Gy) / Gz)*180 / PI; Serial.print("x:\t" + String(round(angle_x))); //выводим углы поворота акселерометра Serial.print("o\t| y:\t" + String(round(angle_y))); Serial.println("o\t| z:\t" + String(round(angle_z)) + "o"); Serial.println(); delay(500); >
При выводе в порт Serial.print() символ \t обозначает знак табуляции, чтобы столбцы были ровные, и значения располагались друг под другом. Символ + означает конкатенацию (объединение) нескольких строк. Оператор String() явно указывает компилятору, что численное значение нужно преобразовать в строку. Оператор round() округляет угол с точностью до 1°.

Итак, мы с вами научились снимать и обрабатывать данные с аналогового акселерометра ADXL335 при помощи Arduino.
Полезный совет
Определите «нулевые» значения напряжений и чувствительности по осям X, Y и Z для вашего датчика с помощью скетча, описанного в разделе «Калибровка аналогового акселерометра ADXL335». Иначе углы и ускорения будут вычисляться со значительными ошибками.