Аналоговые акселерометры ADXL337, ADXL377 и Arduino
ADXL337 и ADXL377 - это компактные, тонкие, маломощные 3-х осевые акселерометры, которые на выходе дают аналоговый сигнал в вольтах.
Основная разница между этими акселерометрами - диапазон измерений. ADXL337 измеряет ускорения в диапазоне ±3 g, а ADXL377 работает в диапазоне ±200 g и может использоваться для измерения более резких изменений движений контролируемого объекта, может использоваться для оценки вибраций.
Эта статья поможет вам разобраться с особенностями использования данных акселерометров. Будут раскрыты вопросы подключения акселерометров к Arduino. В результате вы легко и непринужденно сможете их интегрировать в любой ваш проект.
На фото ниже приведены платы с установленными акселерометрами:

Обзор и технические характеристики акселерометров ADXL337 и ADXL377
Акселерометры ADXL337 и ADXL377 можно (и рекомендуется!) покупать уже интегрированными в отдельный модуль. На модуле предусмотрена необходимая минимальная обвязка и готовые контакты для подключения к Arduino или другому микроконтроллеру.

Как видите, на обоих модулях одинаковое количество контактов. В таблице ниже приведена краткая информация о каждом из контактов на модулях:

Питание акселерометров ADXL337 и ADXL377
Здесь надо быть предельно осторожным. ADXL337 и ADXL377 оба должны запитываться максимальным напряжением 3.6 В! Это напряжение подается к контакту питания и к контакту Self Test. Можно использовать Arduino 5 В или 3.3 В для считывания значений с отдельных осей акселерометра, а запитывать сам датчик ускорения от 3.3 В. Но не забывайте, что значения, которые вы получите с сенсора после аналогово-цифрового преобразования будут разными при 5 В и при 3.3 В! Поэтому надо уточнять диапазоны в зависимости от сигнала преобразования.
Одним из достоинств акселерометров ADXL337 и ADXL377 является то, что они потребляют мало тока для работы. Обычно это около 300 мА.
Необходимые пояснения по использованию ADXL337 и ADXL377
Если вы запитываете ADXL337 или ADXL377 от 3.3 В, значение 1.65 В на контакте оси X будет соответствовать ускорению 0 g. Если на пине X у вас показания напряжения составляют 3.3 В, то на ADXL337 это значит, что сила составляет 3g. В то время как при показаниях 3.3 В на ADXL377 означают, что нагрузка составляет 200g. По сути оба чипа используются и подключаются одинаково, но показания будут разными, так как они зависят от максимально допустимых значений, которые считывает акселерометр.
На модуле ADXL377 предусмотрены 4 отверстия для крепежа, так как этот датчик ускорения рассчитан на более экстремальные условия нагрузок.
На обоих модулях установлены конденсаторы на 0.01 мкФ возле выходов на оси X, Y, и Z. То есть, максимальные частоты, в пределах которых вы можете оценивать ускорение составляет 500 Гц.
Пример подключения к Arduino
Распайка
Перед тем как устанавливать акселерометр на макетную плату и подключать к Arduino, вам надо припаять контакты. Это могут быть отдельные рельсы или просто провода. Что именно распаивать зависит исключительно от того, где в дальнейшем вы планируете использовать датчик ускорения.
Если вы планируете использовать макетную плату или монтажную плату с расстоянием между контактами 0.1", рекомендуем припаять прямую рельсу контактов с выходом типа папа. Если в планах у вас подключать акселерометр сразу к контроллеру, без макеток и монтажных плат, используйте провода.
Подключаем акселерометр к Arduino
В этом примере мы рассмотрим как можно использовать контроллер Arduino Uno для сбора и обработки данных с модуля акселерометра ADXL337 или ADXL377. Так как выходной сигнал с датчика аналоговый, нам надо подключить три контакта с отдельных осей координат к контактам 'Analog In' на Arduino. На рисунке ниже показана схема подключения модуля ADXL337. ADXL377 подключается так же.

Запитать акселерометр можно с помощью контакт 3.3 В и GND на Arduino. Контакты осей X, Y, и Z с датчика подключаются к ADC пинам (A0, A1, и A2 в рассматриваемом примере). Пин self test (ST) можно не подключать, а можно подключить к земле (GND). Если вы хотите использовать ST контакт для двойной проверки функционирования сенсора, подключите его к 3.3 В. Для дополнительной информации по этому поводу можете ознакомится с даташитами сенсоров: ADXL377 и ADXL377.
Программа для Arduino
После того как вы подключили акселерометр к Arduino, можно перейти к программированию. Полный скетч вы можете скачать с Github. Ссылка для ADXL337 и для ADXL377. Единственное отличие в этих скетчах - значение переменной scale.
Первые две строки кода в скетче служат для настройки параметров под ваш модуль датчика ускорения:
int scale = 3; boolean micro_is_5V = true;
Значение переменной scale устанавливается равным максимальному значению измеряемой силы g. Для ADXL337 это значение устанавливается равным 3, а для модели ADXL377 переменная принимает значение 200, так как сенсоры обеспечивают диапазоны измерений ±3g и ±200g соответственно. Переменной micro_is_5V присваивается значение true, если используется контроллер с 5 В (например, Arduino Uno) и значение false,using если вы используете контроллер на 3.3 В (например, Arduino Pro Mini). Это важный параметр, который напрямую влияет на дальнейшую интерпретацию данных с сенсора.
После этого используем функцию setup() для инициализации серийного соединения. Благодаря этому мы сможем выводить показания в окно серийного монитора Arduino IDE.
void setup() { // устанавливаем связь по серийному протоколу со скоростью передачи данных 115200 baud
Serial.begin(115200); }
В пределах функции loop(), мы собираем данные с датчика, масштабируем их для отображения в единицах измерения силы g и отображаем в окне серийного монитора изначальные и преобразованные данные. Для начала давайте взглянем на то, как считываются данные с датчика ускорения.
void loop() { // получаем данные с акселерометра для каждой отдельной оси координат
int rawX = analogRead(A0);
int rawY = analogRead(A1);
int rawZ = analogRead(A2);
Для того, чтобы получить числовое значение в диапазоне от 0 до 1023, которые соответствуют напряжению на входах Arduino, мы используем аналоговые входы A0, A1, и A2 и несколько считываемых значений. Эти значения напряжений отражают последнее измеренное значение ускорения с сенсора. Например, если ADXL337 показывает 3.3 В на контакте X, это означает, что сейчас ускорение вдоль оси X составляет +3g. Причем зависит это от вашей модели контроллера. Если вы используете микроконтроллер 3.3 В, считываемые аналоговые значения будут возвращать 1023 и храниться в переменной rawX. Если вы используете микроконтроллер 5 В, возвращаемые аналоговые значения будут равны 675. Храниться они будут в той же переменной. Именно поэтому важно корректно настроить переменную micro_is_5V, чтобы мы знали как правильно интерпретировать текущие показания.
Зная напряжение вашей платы Arduino, мы можем масштабировать полученные int значения и получить показания измерений в единицах измерения g. Ниже приведен кусок куда, с помощью которого мы приводим полученные показания к необходимым единицам измерения:
float scaledX, scaledY, scaledZ; // масштабированные значения для каждой оси
if (micro_is_5V) // микроконтроллер работает с 5 В
{ scaledX = mapf(rawX, 0, 675, -scale, scale); // 3.3/5 * 1023 =~ 675
} else // микроконтроллер 3.3 В
{ scaledX = mapf(rawX, 0, 1023, -scale, scale); }
Масштабированные значения хранятся в виде типа данных float. После этого мы проверяем, какой у нас контроллер (3.3 В или 5 В), с помощью булевой переменной micro_is_5V. По результатам проверки мы масштабируем целое значение x - rawX и превращаем его в значение со знаком после запятой, которое соответствует силе g. Переменная для хранения новых значений называется scaledX. То же самое мы делаем для осей Y и Z. Детально рассматривать эти оси мы не будем, так как процесс преобразования совершенно идентичный. Важно запомнить, что на Arduino 5 В мы получаем 675 при напряжении на пине 3.3 В, а Arduino 3.3 В интерпретирует измерения, которые соответствуют 3.3 В в виде значения 1023.
Функция mapf(), которая используется в скетче, работает так же как и стандартная Arduino функция map(). Основная причина, по которой используется именно mapf( ) - она может работать с десятичными значениями, а стандартная функция - только с целыми типа int.
После преобразования, мы выводим в окно серийного монитора текущие и преобразованные данные. Вероятно, вас будут интересовать только преобразованные, масштабированные значения ускорения, но потоковые данные оставлены специально, чтобы вы могли их сравнить с результатом и лучше понять принцип работы акселерометра. Часть кода, которая отвечает за вывод данных по каждой из осей чувствительности акселерометра ADXL337 или ADXL377 приведена ниже:
// выводим в окно серийного монитора текущие показания акселерометра по осям чувствительности X,Y,Z
Serial.print("X: ");
Serial.println(rawX); // выводим преобразованные показания с акселерометра по осям X,Y,Z
Serial.print("X: ");
Serial.print(scaledX);
Serial.println(" g");
Это позволяет нам увидеть данные в двух видах.
Перед снятием новых показаний, делаем задержку:
delay(2000);
В примере выставлена задержка в 2 секунды (2000 миллисекунды), так как мы просто выводим показания сенсора в окно серийного монитора в целях ознакомления с акселерометром. В реальных проектах вы можете считывать данные с датчика с частотой 500 Гц. То есть, значение задержки можно сократить вплоть до 2 миллисекунд.
После этого возвращаемся в начало нашего цикла loop().
Надеемся, что эта статья поможет вам освоить работу акселерометров в связке с Arduino и вы используете полученные знания в ваших личных проектах. Кстати, с помощью акселерометра вы можете определять не только ускорение, но и перемещения, которое совершает объект. Подробная статья по определению угловых перемещений с помощью акселерометра и гироскопа: Arduino и MPU6050 для определения угла наклона.
Оставляйте Ваши комментарии, вопросы и делитесь личным опытом ниже. В дискуссии часто рождаются новые идеи и проекты!