Акселерометр ADXL3xx: чтение данных через analogRead()
Подключаем акселерометр серии ADXL3xx к Arduino и читаем значения ускорения по трём осям через аналоговые входы.
В этом уроке разберёмся, как подключить акселерометр серии ADXL3xx (например, ADXL320, ADXL321, ADXL322, ADXL330) к Arduino, считать значения ускорения по трём осям и вывести их в Serial Monitor или в любую другую программу, принимающую данные через последовательный порт.
Урок написан на базе breakout boards from Sparkfun. Adafruit® accelerometer breakout board тоже подходит, но схема подключения у него отличается.
Акселерометр ADXL3xx выдаёт ускорение по каждой оси в виде аналогового напряжения от 0 до 5 В. Чтобы считать его, достаточно стандартной функции analogRead() — никаких специальных библиотек не нужно.
Необходимое оборудование
- Акселерометр ADXL3xx
Схема подключения
Акселерометр потребляет очень мало тока, поэтому его можно питать прямо от цифровых выходов Arduino — не нужно тянуть провода к пинам 5V и GND. Три аналоговых входа используются как цифровые I/O для питания и земли акселерометра (а также для пина самотестирования), а оставшиеся три аналоговых входа принимают аналоговые сигналы по осям X, Y, Z.

Принципиальная схема

Соединения для конфигурации, показанной выше:
| Breakout Board Pin | Self-Test | Z-Axis | Y-Axis | X-Axis | Ground | VDD |
|---|---|---|---|---|---|---|
| Arduino Analog Input Pin | 0 | 1 | 2 | 3 | 4 | 5 |
Если вы подключаете только сам акселерометр (без дополнительных компонентов):
| ADXL3xx Pin | Self-Test | ZOut | YOut | XOut | Ground | VDD |
|---|---|---|---|---|---|---|
| Arduino Pin | _None_ (unconnected) | Analog Input 1 | Analog Input 2 | Analog Input 3 | GND | 5V |
Важно: некоторые акселерометры рассчитаны на питание 3,3 В и могут выйти из строя при подаче 5 В. Перед подключением обязательно проверьте документацию на ваш конкретный модуль.
Код
Подключения акселерометра задаются константами в начале скетча. Аналоговые пины 4 и 5 используются как источник питания — для этого они переводятся в режим цифровых выходов D18 и D19. Если нужно, A0 соответствует D14, A1 — D15 и так далее.
const int groundpin = 18; const int powerpin = 19;
Пин 19 (A5) настраивается как HIGH, пин 18 (A4) — как LOW. Это обеспечивает акселерометру питание 5 В при токе в несколько миллиампер.
pinMode(groundpin, OUTPUT); pinMode(powerpin, OUTPUT); digitalWrite(groundpin, LOW); digitalWrite(powerpin, HIGH);
Такой подход позволяет подключить breakout boards from Sparkfun напрямую к плате без дополнительных проводов к шинам питания. На других платах акселерометр можно подключить к стандартным пинам 5V (или 3,3V) и GND — тогда строки выше в секции void setup() можно закомментировать.
/*
ADXL3xx
Считывает данные с акселерометра Analog Devices ADXL3xx и передаёт
значения ускорения на компьютер. Назначение пинов совместимо с платами
расширения от SparkFun, доступными по адресу:
http://www.sparkfun.com/commerce/categories.php?c=80
Схема подключения:
- analog 0: самотестирование акселерометра
- analog 1: z-axis
- analog 2: y-axis
- analog 3: x-axis
- analog 4: ground
- analog 5: vcc
создан 2 июля 2008
автор David A. Mellis
изменён 30 августа 2011
автор Tom Igoe
Этот пример кода находится в открытом доступе.
https://www.arduino.cc/en/Tutorial/ADXL3xx
*/
// константы для обозначения пинов (не изменяются):
const int groundpin = 18; // analog input pin 4 — земля
const int powerpin = 19; // analog input pin 5 — питание
const int xpin = A3; // ось X акселерометра
const int ypin = A2; // ось Y акселерометра
const int zpin = A1; // ось Z (только для трёхосевых моделей)
void setup() {
// инициализация последовательного порта:
Serial.begin(9600);
// Используем аналоговые входы как обычные цифровые пины для подачи GND и питания.
// Это позволяет подключить плату расширения напрямую к
// Arduino. Если используете стандартные пины 5V и GND на Arduino,
// эти строки можно удалить.
pinMode(groundpin, OUTPUT);
pinMode(powerpin, OUTPUT);
digitalWrite(groundpin, LOW);
digitalWrite(powerpin, HIGH);
}
void loop() {
// вывод значений датчика:
Serial.print(analogRead(xpin));
// разделитель между значениями — табуляция:
Serial.print("\t");
Serial.print(analogRead(ypin));
// разделитель между значениями — табуляция:
Serial.print("\t");
Serial.print(analogRead(zpin));
Serial.println();
// задержка перед следующим считыванием:
delay(100);
}
Практические замечания
- Если показания по всем осям нулевые или зашкаливают — проверьте правильность питания и не перепутаны ли пины X/Y/Z.
- Убедитесь, что скорость Serial Monitor совпадает со скоростью, заданной в
Serial.begin(). - Акселерометр чувствителен к вибрации и наклону платы. При отладке кладите плату на ровную поверхность и проверяйте, что одна из осей показывает около 512 (горизонталь, 0°).
- Если вы используете плату с логикой 3,3 В (например, Arduino Due или MKR-серию), убедитесь, что акселерометр также рассчитан на 3,3 В.
Данные и интерпретация
Ниже приведены значения, полученные при наклоне оси Y акселерометра ADXL322 (диапазон ±2g) под разными углами к горизонту. Для других осей значения должны быть аналогичными, однако могут незначительно отличаться из-за разброса характеристик конкретного экземпляра. При горизонтальном положении оси (параллельно земле, 0°) значение analogRead() должно быть около 512. Для акселерометра с другим диапазоном (например, ADXL302 ±5g) значения при тех же углах будут иными.
| Angle | -90 | -80 | -70 | -60 | -50 | -40 | -30 | -20 | -10 | 0 |
|---|---|---|---|---|---|---|---|---|---|---|
| Acceleration | 662 | 660 | 654 | 642 | 628 | 610 | 589 | 563 | 537 | 510 |
| Angle | 0 | 10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 | 90 |
|---|---|---|---|---|---|---|---|---|---|---|
| Acceleration | 510 | 485 | 455 | 433 | 408 | 390 | 374 | 363 | 357 | 355 |
Узнать больше
Дополнительные базовые уроки собраны в разделе built-in examples.
Также рекомендуем заглянуть в language reference — подробный справочник по языку программирования Arduino.
Последняя редакция: 28.07.2015, SM