Как работает акселерометр? Подключение ADXL335 к Arduino

Как работает акселерометр? Подключение ADXL335 к Arduino

Вы когда-нибудь задумывались, как ваш смартфон волшебным образом знает, когда переключить экран из портретного в альбомный режим? Или как фитнес-трекеры знают, когда вы ходите, бегаете или просто стоите? Секрет этих умных функций — крошечное, но мощное устройство, называемое акселерометром.

Акселерометры встроены в большинство современных гаджетов и отвечают за обнаружение движения, наклона и ориентации. Один популярный и доступный пример — модуль ADXL335 — компактный, маломощный и недорогой датчик, используемый в бесчисленных электронных проектах для измерения ускорения в трёх направлениях (X, Y и Z).

В этом руководстве мы подробно рассмотрим модуль акселерометра ADXL335. Вы узнаете, что это такое, как он работает и, самое главное, как подключить его к Arduino, чтобы начать создавать собственные проекты с обнаружением движения. Независимо от того, создаёте ли вы робота с определением наклона, простой шагомер или просто хотите понять, как работает обнаружение движения, это руководство — идеальное место для начала.

Давайте начнём!

Как работает акселерометр?

Чтобы понять, как работают акселерометры, представьте маленький прозрачный куб с шариком, подвешенным в его центре пружинами, подключёнными к каждой внутренней стенке — передней, задней, левой, правой, верхней и нижней.

Как работает акселерометр? Подключение ADXL335 к Arduino

Когда куб не движется, шарик остаётся точно в центре. Но как только куб движется или ускоряется в любом направлении, шарик слегка отстаёт из-за инерции (тенденции объектов сопротивляться изменениям движения). Это отставание растягивает одни пружины больше других, и измеряя натяжение каждой пружины, можно определить направление и силу приложенной силы.

Акселерометры часто выражают силу в единицах g — например, 1g, 2g или 3g. Прежде чем идти дальше, давайте поговорим о том, что означает «1g».

Когда мы говорим «1g», мы имеем в виду ускорение свободного падения на поверхности Земли — около 9,8 м/с². Даже когда ваш телефон просто лежит на столе, он всё равно ощущает силу 1g, направленную прямо вниз из-за гравитации. Важно знать, что акселерометры не различают гравитационное ускорение и ускорение от фактического движения — они просто обнаруживают общее ускорение во всех направлениях.

Возвращаясь к нашему примеру, представьте куб, парящий в открытом космосе, в невесомости. Шарик просто парил бы неподвижно в центре. Поскольку нет ни гравитации, ни движения, пружины не растягивались бы, и акселерометр зарегистрировал бы 0g по всем трём осям — X, Y и Z.

Как работает акселерометр? Подключение ADXL335 к Arduino

Если бы вы внезапно быстро сдвинули куб влево, шарик отстал бы и надавил на правую пружину. Акселерометр ощутил бы силу вправо, что означает ускорение куба влево. В этом случае вы увидели бы ускорение 1g по оси X, хотя гравитации по-прежнему нет — это чисто от движения.

Как работает акселерометр? Подключение ADXL335 к Arduino

Посмотрим, что происходит, когда мы помещаем куб на Землю. Если положить куб на стол и оставить его, гравитация тянет шарик вниз, растягивая нижнюю пружину. Движения нет, но одна только сила гравитации заставляет датчик показывать 1g по оси Z. Оси X и Y будут показывать 0g, потому что в этих направлениях нет действующей силы.

Как работает акселерометр? Подключение ADXL335 к Arduino

Становится интересно, когда вы наклоняете куб. Представьте наклон так, что он расположен под углом 45 градусов между осью Z и осью X. Гравитация по-прежнему тянет прямо вниз к Земле, но поскольку куб наклонён, это притяжение теперь распределяется между направлениями Z и X. Акселерометр регистрирует это и показывает около 0,71g по обеим осям. Значение 0,71 не случайное — это косинус 45 градусов, умноженный на 1g. Шарик фактически тянет одинаково две пружины, поэтому оба датчика X и Z регистрируют силу.

Как работает акселерометр? Подключение ADXL335 к Arduino

Хотя эта модель с кубом и шариком не совсем точно отражает устройство реальных акселерометров, она помогает понять, почему акселерометры измеряют силы в единицах g, почему они показывают 1g по оси Z в состоянии покоя, и какие показания можно увидеть при удержании устройства под разными углами.

В реальном мире акселерометры создаются с использованием технологии МЭМС (микроэлектромеханических систем). Давайте рассмотрим, как работает МЭМС-акселерометр.

Как работает МЭМС-акселерометр?

МЭМС-акселерометр — это по сути микроскопическая механическая система, изготовленная непосредственно на кремниевом чипе.

В его основе находится маленькая масса, часто называемая «пробной массой». Эта масса подвешена между неподвижными пластинами на гибких балках или пружинах. И пробная масса, и неподвижные пластины спроектированы для совместной работы как части конденсатора.

Как работает акселерометр? Подключение ADXL335 к Arduino Как работает акселерометр? Подключение ADXL335 к Arduino

Когда акселерометр перемещается или испытывает ускорение в определённом направлении, пробная масса стремится остаться на месте из-за инерции, в то время как остальная часть устройства перемещается вокруг неё. Это движение изменяет расстояние между пробной массой и неподвижными пластинами. Поскольку ёмкость напрямую зависит от расстояния между пластинами, значение ёмкости соответственно изменяется.

Встроенная схема обнаруживает это изменение ёмкости и преобразует его в электрический сигнал. Затем схема рассчитывает, какое именно ускорение произошло, на основе этого изменения.

Обзор оборудования модуля ADXL335

В центре этого модуля находится ADXL335 — маленький, маломощный и малошумный 3-осевой МЭМС-акселерометр производства Analog Devices. Этот датчик может обнаруживать как статическое ускорение (из-за гравитации, когда датчик неподвижен), так и динамическое ускорение (вызванное движением, тряской или резкими ударами).

Как работает акселерометр? Подключение ADXL335 к Arduino

Модуль разработан для удобной установки на макетную плату и выводит все выводы ADXL335 на 6-контактный разъём с шагом 2,54 мм. Эти выводы включают три аналоговых выхода для измерения ускорения по осям X, Y и Z, два вывода питания и один вывод самопроверки.

Питание

ADXL335 работает с напряжением от 1,8 В до 3,6 В постоянного тока, при этом типичное рабочее напряжение — 3,3 В. К счастью, модуль включает встроенный стабилизатор напряжения 3,3 В, что упрощает его использование с 5-вольтовыми микроконтроллерами, такими как Arduino.

Датчик очень энергоэффективен, потребляя лишь около 350 мкА при нормальной работе — это гораздо меньше, чем потребляет маленький светодиод!

Диапазон измерений

ADXL335 может измерять ускорение в диапазоне ±3g. Это означает, что он может обнаруживать ускорение до 3 раз больше силы тяжести в любом направлении. Если датчик испытывает более 3g, он не сломается, но показание достигнет максимума в 3g.

Датчик удивительно прочен и может выдержать экстремальное ускорение до 10 000g. Однако воздействие чего-либо выше может привести к его необратимому повреждению.

Ратиометрический выход

Выход ADXL335 является «ратиометрическим», что означает, что выходное напряжение изменяется прямо пропорционально обнаруженному ускорению.

  • При отсутствии ускорения (0g) выходное напряжение обычно составляет около половины напряжения питания 3,3 В (~1,65 В).

  • При обнаружении -3g напряжение падает до 0 В

  • При обнаружении +3g напряжение поднимается до 3,3 В

  • Напряжение плавно масштабируется между этими значениями в зависимости от величины ускорения.

Технические характеристики

Вот технические характеристики.

Рабочее напряжение

1.8V – 3.6V

Рабочий ток

350μA (типичный)

Диапазон измерений

±3g (полная шкала)

Диапазон температур

−40 to +85°C

Оси измерения

3 оси

Чувствительность

270 to 330mV/g (ратиометрическая)

Ударостойкость

До 10,000g

Размеры

4mm x 4mm x 1.45mm

Для получения дополнительной информации обратитесь к техническому описанию ниже.

Распиновка акселерометра ADXL335

Прежде чем перейти к подключению и примеру кода, давайте рассмотрим его распиновку.

Как работает акселерометр? Подключение ADXL335 к Arduino

VCC обеспечивает питание модуля. Подключите его к выходному выводу 5V на плате Arduino.

X-Out выводит аналоговое напряжение, пропорциональное ускорению по оси X.

Y-Out выводит аналоговое напряжение, пропорциональное ускорению по оси Y.

Z-Out выводит аналоговое напряжение, пропорциональное ускорению по оси Z.

GND — это вывод заземления.

ST (Self-Test) — вывод самопроверки, используемый для проверки правильности работы датчика в вашем проекте. Подробнее об использовании этой функции мы расскажем в конце руководства.

Схема подключения акселерометра ADXL335 к Arduino

Теперь, когда мы понимаем, как работает акселерометр ADXL335, давайте перейдём к его подключению к Arduino.

Подключение довольно простое. Начните с размещения акселерометра на макетной плате. Затем подключите вывод VCC акселерометра к выводу 5V на Arduino, а вывод GND — к земле.

Теперь подключите выводы X-Out, Y-Out и Z-Out к аналоговым входным выводам Arduino A0, A1 и A2 соответственно.

Для получения более точных показаний от акселерометра нам нужно изменить аналоговое опорное напряжение (AREF) Arduino. Это можно сделать, подключив вывод 3.3V Arduino к его выводу AREF. Это указывает Arduino использовать 3,3 В в качестве опорного для чтения аналоговых сигналов, что лучше соответствует выходному диапазону ADXL335.

Вот краткая справочная таблица подключений:

ADXL335 ModuleArduino
VCC5V
GNDGND
X-OutA0
Y-OutA1
Z-OutA2

Обратитесь к изображению ниже для правильной схемы подключения.

Как работает акселерометр? Подключение ADXL335 к Arduino

Пример кода Arduino — чтение акселерометра ADXL335

Вот простой скетч, который считывает и отображает показания акселерометра ADXL335 по каждой оси (X, Y и Z).

Прежде чем разбирать, как работает код, загрузите его на Arduino.

const int xInput = A0;
const int yInput = A1;
const int zInput = A2;

// initialize minimum and maximum Raw Ranges for each axis
int RawMin = 0;
int RawMax = 1023;

// Take multiple samples to reduce noise
const int sampleSize = 10;

void setup() {
  analogReference(EXTERNAL);
  Serial.begin(9600);
}

void loop() {
  //Read raw values
  int xRaw = ReadAxis(xInput);
  int yRaw = ReadAxis(yInput);
  int zRaw = ReadAxis(zInput);

  // Convert raw values to 'milli-Gs"
  long xScaled = map(xRaw, RawMin, RawMax, -3000, 3000);
  long yScaled = map(yRaw, RawMin, RawMax, -3000, 3000);
  long zScaled = map(zRaw, RawMin, RawMax, -3000, 3000);

  // re-scale to fractional Gs
  float xAccel = xScaled / 1000.0;
  float yAccel = yScaled / 1000.0;
  float zAccel = zScaled / 1000.0;

  Serial.print("X, Y, Z  :: ");
  Serial.print(xRaw);
  Serial.print(", ");
  Serial.print(yRaw);
  Serial.print(", ");
  Serial.print(zRaw);
  Serial.print(" :: ");
  Serial.print(xAccel, 0);
  Serial.print("G, ");
  Serial.print(yAccel, 0);
  Serial.print("G, ");
  Serial.print(zAccel, 0);
  Serial.println("G");

  delay(200);
}

// Take samples and return the average
int ReadAxis(int axisPin) {
  long reading = 0;
  analogRead(axisPin);
  delay(1);
  for (int i = 0; i < sampleSize; i++) {
    reading += analogRead(axisPin);
  }
  return reading / sampleSize;
}

После загрузки кода на Arduino откройте монитор последовательного порта и установите скорость передачи данных 9600 бод. Теперь вы можете увидеть, как акселерометр реагирует на перемещение в разных направлениях.

Как работает акселерометр? Подключение ADXL335 к Arduino Как работает акселерометр? Подключение ADXL335 к Arduino Как работает акселерометр? Подключение ADXL335 к Arduino Как работает акселерометр? Подключение ADXL335 к Arduino Как работает акселерометр? Подключение ADXL335 к Arduino Как работает акселерометр? Подключение ADXL335 к Arduino

Объяснение кода

В начале скетча мы указываем Arduino, какие выводы подключены к акселерометру. Мы подключили выходы X, Y и Z ADXL335 к выводам A0, A1 и A2 на Arduino. Эти выводы будут считывать данные с датчика.

const int xInput = A0;
const int yInput = A1;
const int zInput = A2;

Далее мы создаём две переменные для минимального и максимального значений необработанных показаний датчика: RawMin и RawMax. Поскольку Arduino имеет 10-битный аналого-цифровой преобразователь (АЦП), он берёт выходные напряжения от ADXL335 (в диапазоне от 0 до 3,3 вольт) и преобразует их в целые числа от 0 до 1023. Вот почему мы устанавливаем RawMin в 0 и RawMax в 1023.

// initialize minimum and maximum Raw Ranges for each axis
int RawMin = 0;
int RawMax = 1023;

Для стабилизации показаний и снижения шума (случайных колебаний) скетч делает несколько считываний с каждой оси. Мы устанавливаем переменную sampleSize в 10, что означает, что Arduino сделает 10 выборок на ось и усреднит их для более точных результатов.

// Take multiple samples to reduce noise
const int sampleSize = 10;

В разделе setup мы указываем Arduino использовать внешнее опорное напряжение вместо стандартного с помощью функции analogReference(EXTERNAL).

analogReference(EXTERNAL);

Предупреждение:

Поскольку мы подключили вывод 3.3V Arduino к выводу AREF, использование analogReference(EXTERNAL) абсолютно необходимо. Если вы забудете этот шаг, вы можете повредить Arduino, закоротив внутренне генерируемое активное опорное напряжение и вывод AREF. Подробнее о функции analogReference() можно узнать на официальном сайте Arduino.

В разделе loop() мы считываем значения с выводов X, Y и Z каждые 200 мс. Вместо прямого использования analogRead() мы используем пользовательскую функцию ReadAxis(), которая делает 10 считываний, суммирует их и возвращает среднее значение. Это помогает отфильтровать случайные колебания в показаниях.

//Read raw values
int xRaw = ReadAxis(xInput);
int yRaw = ReadAxis(yInput);
int zRaw = ReadAxis(zInput);

Преобразование выходных данных ADXL335 в ускорение (g)

Следующая часть кода — самая важная. Она преобразует аналоговые выходные напряжения датчика в гравитационное ускорение (g), которое используется для измерения силы тяжести.

// Convert raw values to 'milli-Gs"
long xScaled = map(xRaw, RawMin, RawMax, -3000, 3000);
long yScaled = map(yRaw, RawMin, RawMax, -3000, 3000);
long zScaled = map(zRaw, RawMin, RawMax, -3000, 3000);

Преобразование использует встроенную функцию Arduino map(). Когда мы вызываем map(xRaw, RawMin, RawMax, -3000, 3000), она отображает значение RawMin (0) в -3000, значение RawMax (1023) в 3000, а промежуточные значения — в числа от -3000 до 3000.

Например:

  • Если датчик выдаёт 0 вольт по оси x (xRaw=0), функция map() даёт нам -3000, что равно -3g.

  • Если датчик выдаёт 1,65 вольт по оси x (xRaw=511), функция map() даёт нам 0, что равно 0g.

  • Если датчик выдаёт 3,3 вольт по оси x (xRaw=1023), функция map() даёт нам 3000, что равно +3g.

Это и есть «ратиометрический» выход — напряжение изменяется прямо пропорционально ускорению во всём диапазоне. При увеличении ускорения напряжение увеличивается с той же скоростью.

Числа -3000 и 3000 не случайны — они представляют ускорение в милли-g, то есть в тысячных долях g. Поскольку ADXL335 может измерять от -3g до +3g, этот диапазон равен от -3000 до +3000 милли-g.

Наконец, мы делим значения в милли-g на 1000 для преобразования в обычные значения g (например, 1.2g, -0.8g и т.д.) и отображаем эти показания в мониторе последовательного порта.

// re-scale to fractional Gs
float xAccel = xScaled / 1000.0;
float yAccel = yScaled / 1000.0;
float zAccel = zScaled / 1000.0;

Serial.print("X, Y, Z  :: ");
Serial.print(xRaw);
Serial.print(", ");
Serial.print(yRaw);
Serial.print(", ");
Serial.print(zRaw);
Serial.print(" :: ");
Serial.print(xAccel,0);
Serial.print("G, ");
Serial.print(yAccel,0);
Serial.print("G, ");
Serial.print(zAccel,0);
Serial.println("G");

Функция самопроверки ADXL335

Акселерометр ADXL335 поставляется с полезной функцией самопроверки, которая позволяет проверить правильность работы датчика. Эта функция работает через специальный вывод ST (self-test) на модуле.

Как работает акселерометр? Подключение ADXL335 к Arduino

Когда вы хотите проверить акселерометр, просто подключите вывод ST к 3,3 В. Это подключение создаёт небольшую электростатическую силу внутри чипа, которая перемещает крошечную механическую балку внутри акселерометра. Это движение имитирует то, что происходит, когда датчик испытывает реальное ускорение, позволяя проверить, отвечает ли датчик правильно.

Во время успешной самопроверки вы должны заметить определённые изменения в выходных значениях датчика:

  • −1,08 g (−325 мВ) по оси X

  • +1,08 g (+325 мВ) по оси Y

  • +1,83 g (+550 мВ) по оси Z

После завершения тестирования помните, что при нормальной работе вашего проекта вывод ST должен быть либо не подключён, либо подключён к выводу заземления (GND).

Предупреждение:

Будьте осторожны и никогда не подключайте вывод ST к напряжению выше 3,6 В. Это может привести к необратимому повреждению акселерометра.