Андрей Смирнов
Время чтения: ~8 мин.
Просмотров: 22

Как подключить цифровой акселерометр ADXL345 к Arduino

b5b56b2ae93d3dc958cf0c21c9383b18_L.jpg

Arduino Подключаем к Arduino модуль цифрового акселерометра на базе микросхемы ADXL345 с управлением по последовательным интерфейсам I2C и SPI.

Нам понадобятся:

  • Arduino UNO или иная совместимая плата;
  • модуль GY-291 или аналогичный с цифровым акселерометром ADXL345;
  • соединительные провода (рекомендую вот такой набор);
  • макетная плата (breadboard);
  • персональный компьютер со средой разработки Arduino IDE.

1Описание модуля GY-291 с акселерометром ADXL345

Акселерометр – это устройство, которое позволяет измерить динамическое и статическое ускорение по трём осям X, Y и Z. Благодаря статическому ускорению можно определить положение в пространстве (акселерометр как датчик поворота), а благодаря динамическому (движение или встряска) – направление ускорения.

Цифровой акселерометр ADXL345 – это 3-осевой акселерометр с высоким разрешением (13 бит) по осям с пределом до ±16g. Модуль обладает пониженным энергопотреблением и малыми размерами. Информационный обмен с модулем осуществляется по последовательным интерфейсам I2C или SPI (3- или 4-проводной).

Существует множество модулей для Arduino с акселерометром ADXL345. Модуль может выглядеть, например, так:

03.jpg
Внешний вид модуля GY-291 с цифровым акселерометром ADXL345

Показанный модуль имеет название GY-291. У модуля имеются следующие выводы:

Вывод модуля Назначение Подключать к выводу Arduino
SPI I2C
GND Земля GND GND
VCC Питание +3,3V +3,3V
CS Выбор ведомого интерфейса SPI 10
INT1 Выход прерывания 1 (*)
INT2 Выход прерывания 2 (*)
SDO Данные от ведомого 12
SDA 11 A4
SCL Шина тактирования 13 A5

(*) Работы с прерываниями ADXL345 касаться в этой статье не будем. Вот есть хорошая статья, в которой достаточно подробно описан вопрос работы с прерываниями.

В зависимости от выбранного интерфейса – SPI или I2C – подключение модуля будет соответствующим, как показано в таблице. Но в обоих случаях очень простым.

Рассмотрим структуру регистров микросхемы ADXL345:

reg_map.png
Карта регистров цифрового акселерометра ADXL345

Кроме того, нас интересует регистр управления питанием, т.к. он отвечает за режим работы устройства:

Регистр управления питанием цифрового акселерометра ADXL345

Как видим, бит D3 (Measure) переключает акселерометр в режим измерения.

2Работа с цифровым акселерометром ADXL345 по интерфейсу SPI

Акселерометр ADXL345 поддерживает 3- и 4-проводные варианты интерфейса SPI. Мы рассмотрим только 4-проводное подключение. Кроме того, акселерометр работает в режиме 3 интерфейса SPI (помните, мы уже обсуждали: CPOL=1, CPHA=1). Диаграмма, показывающая обмен с акселерометром ADXL345 по 4-проводному интерфейсу SPI:

Работа с ADXL345 по SPI

Здесь бит MB – это признак того, что мы собираемся читать много байтов за раз (если бит установлен в 1). Для тестирования работы с SPI устройствами и быстрого освоения порядка обмена с ними я обычно использую отладочную плату с микросхемой FT2232H. Эта микросхема поддерживает множество режимов, в том числе I2C и SPI. Управление работой микросхемы FT2232H – с помощью программы SPI via FTDI, о которой я уже неоднократно рассказывал.

Подключим акселерометр к отладочной плате и прочитаем регистр DEVID, в котором хранится постоянное значение-идентификатор акселерометра ADXL345. Значение идентификатора должно быть 0xE5.

ADXL345 соединён с отладочной платой на FT2232H

Не забудем перед чтением записать команду 0x80, которая укажет акселерометру, что мы собираемся читать, начиная с регистра по адресу 0x0 (см. диаграмму выше, рисунок 38 – SPI 4-Wire Read):

Чтение регистра ID акселерометра ADXL345 по SPI

Видно, что в регистре содержится число 0xE5, которое и является значением идентификатора акселерометра ADXL345, согласно техническому описанию (datasheet). Вот как это выглядит на временной диаграмме:

Временная диаграмма чтения регистра ID акселерометра ADXL345 по SPI

Устройство отвечает, всё нормально. Теперь нам нужно перевести акселерометр в режим измерений. Для этого необходимо записать в регистр POWER_CTL (адрес регистра 0x2D) число 0x08 (установить бит Measure в HIGH). После этого можно начинать читать регистры с 0x32 по 0x37, в которых хранятся данные об ускорениях по трём осям. Сделаем это с помощью Arduino. Напишем такой скетч:

Скетч для чтения данных ADXL345 по SPI (разворачивается)

Вот так выглядит временная диаграмма работы этого скетча:

Временная диаграмма чтения значений по осям X, Y, Z акселерометра ADXL345

Ясно, почему первый байт передачи от Arduino при чтении значений ускорений по осям – число 0xF2? Это адрес первого регистра, с которого начинаем чтение (0x32), объединённый по ИЛИ с 0x80 – маркером чтения READ – и с 0x40 – маркером многобайтовой передачи MB: 0x32 OR 0x80 OR 0x40 = 0011_0010 OR 1000_0000 OR 0100_0000 = 1110_1101 = 0xF2

Что означают считанные значения? Этот вопрос рассматривается в последнем разделе статьи. Кроме того, существует ряд библиотек для Arduino, которые упрощают настройку и чтение данных с акселерометра, позволяя не думать о таких низкоуровневых вещах как регистры, биты и байты. Ссылки на библиотеки также приведены в конце статьи.

3Работа с цифровым акселерометром ADXL345 по интерфейсу I2C

Временная диаграмма информационного обмена с ADXL345 по интерфейсу I2C выглядит так:

Диаграмма обмена с ADXL345 по I2C

Давайте перепишем скетч для Arduino, который будет делать всё то же самое, только с обменом по интерфейсу I2C:

Скетч для чтения данных ADXL345 по I2C (разворачивается)

Диаграмма чтения регистра DEVID цифрового акселерометра ADXL345 при обмене по последовательному интерфейсу I2C будет в этом случае такой:

Диаграмма чтения регистра DEVID акселерометра ADXL345 по I2C

Как видно, ADXL345 возвращает нам ожидаемое значение 0xE5. А вот так будет выглядеть диаграмма чтения регистров, в которых хранятся данные по осям XYZ:

Диаграмма чтения регистров данных X, Y, Z акселерометра ADXL345 по I2C

Тут всё ещё проще, чем при работе с интерфейсом SPI.

4Разбор показаний цифрового акселерометра ADXL345

Посмотрите на фотографию ниже. На плате модуля нарисованы три оси: X, Y и Z. Они показывают направление осей акселерометра. Направления осей обусловлены расположением микросхемы ADXL345 на плате. В данном случае ось X акселерометра направлена горизонтально вправо, ось Z направлена горизонтально на нас, ось Y – вертикально вверх.

Акселерометр ADXL345 на макетной плате

А вот что выводит наш скетч в монитор последовательного порта среды Arduino IDE (надо уточнить, что данный вывод наблюдается в режиме покоя – акселерометр неподвижно лежит на столе в положении, как на приведённом фото):

Данные ускорений по X, Y, Z акселерометра ADXL345 в мониторе последовательного порта Arduino IDE

В трёх столбцах представлено значение статического ускорения, измеренное акселерометром по осям X, Y и Z, соответственно. В среднем столбце – показания оси Y – значения больше, чем в двух других. Эти значения даны в условных отсчётах, как они записаны в регистрах акселерометра. Акселерометр ADXL345 имеет несколько диапазонов измерений. Давайте посмотрим на сводную таблицу диапазонов и разрешений датчика акселерометра:

Параметры датчика ADXL345

Напомню, что g – это ускорение свободного падения, численно равное примерно 9,81 метр в секунду за секунду (м/с2).

Диапазон по умолчанию – от −16g до +16g (размах 32g). Согласно таблице, на этот диапазон ускорений приходится 13 бит точности или 213 = 8192 отсчёта. Таким образом, на 1 отсчёт приходится ускорение 32g/8192 = 0,00390625g=0,00390625×9,81 ≈ 0,038 м/с2. Имея это в виду, получается, что в данном выводе скетча ускорение составляет:

Ось акселерометра Ускорение по оси, м/с2
X 0,76
Y 10,4
Z −0,12

Что ж, вполне логично. Ось Y направлена вертикально, т.е. вдоль вектора силы земного притяжения, и значение ускорения примерно равно константе g. Ускорения по осям X и Z, которые лежат в одной горизонтальной плоскости, примерно одинаковы и находятся около 0. Из-за кривизны стола, на котором стоит датчик, значения немного отличаются. Если бы я выровнял акселерометр по уровню, то его показания были бы более точные. В идеальном случае по оси Y должно быть ускорение 9,8 м/с2, а по осям X и Z – 0.

Кроме того, датчик ADXL345 имеет возможность тонкой настройки и калибровки. В данном примере мы этого не делали, а использовали акселерометр с заводскими настройками, как есть. Отсутствие калибровки также может вносить некоторые искажения в показания датчика. Рекомендую применять специальные библиотеки Arduino, которые упрощают взаимодействие с акселерометром ADXL345, в частности, позволяют проводить тонкую настройку.

Скачать библиотеку ADXL345

В архиве также лежит техническое описание (datasheet) на цифровой акселерометр ADXL345. Установка библиотеки производится путём копирования разархивированной папки с библиотекой в директорию libraries среды Arduino IDE.

  • скачать библиотеку Arduino для акселерометра ADXL345 с Depositfiles.

Скачать вложения:

  • Скачать библиотеку Arduino для акселерометра ADXL345(706 Скачиваний)

Последнее изменениеПонедельник, 14 Октябрь 2019 10:32 Прочитано 8424 раз

Статья о принципах работы модуля GY-291 на микросхеме ADXL345. Это цифровой трехосевой акселерометр.

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

На иллюстрации приведены рисунки из паспорта на акселерометр ADXL335.

Посмотреть даташит микросхемы ADXL345 (формат PDF размер 847 КБ)

Здесь изображены координатные оси чувствительности акселерометра по отношению к геометрическому размещению корпуса устройства в пространстве, а также таблица значений напряжения с 3-х каналов акселерометра в зависимости от его ориентации в пространстве. Данные в таблице приводятся для находящегося в состоянии покоя датчика.

Рассмотрим подробнее, что же показывает нам акселерометр.

Пусть датчик лежит горизонтально, например, на столе. Тогда проекция вектора ускорения будет равна 1g по оси Z, или Zout = 1g. По остальным двум осям будут нули: Xout = 0 и Yout = 0.

При повороте датчика «на спину», он будет направлен в противоположную сторону относительно вектора силы тяжести, т.е. Zout = -1g.

Аналогично измерения снимаются по всем трём осям.

Понятно, что акселерометр может быть расположен как угодно в пространстве, поэтому со всех трёх каналов мы будем снимать отличные от нуля показания.

Если датчик сильно тряхнуть вдоль вертикальной оси Z, то значение Zout будет больше, чем «1g». Диапазон измерения от 2g до 16g по каждой из осей в любом из направлений (т.е. как с «плюсом», так и с «минусом»).

Чип аналогового акселерометра ADXL335 довольно мелкий и помещён в BGA корпус, и в домашних условиях его сложно смонтировать на плату.

Рассмотрим подключение акселерометра ADXL335 на примере готового модуля GY-291.

Принципиальная схема модуля GY-291 на базе микросхемы ADXL345.

Для питания акселерометра необходимо подать на вывод VCC модуля напряжение 3,3 В или 5 В. Измерительные каналы датчика подключаются к аналоговым выводам Arduino.

Библиотеки для подключения 3-осевого акселерометра GY-291 на чипе ADXL345.

Скачать ADXL345 library (архив zip 11,5 КБ) =>>

Скачать Sensor Library (архив zip 7 КБ) =>>

Рекомендуемые товары Используемые источники:

  • https://soltau.ru/index.php/arduino/item/525-kak-podklyuchit-tsifrovoj-akselerometr-adxl345-k-arduino
  • https://robot-kit.ru/article/accelerometer-arduino-adxl345/

Рейтинг автора
5
Подборку подготовил
Максим Уваров
Наш эксперт
Написано статей
171
Ссылка на основную публикацию
Похожие публикации