Gy 521 arduino подключение: Обзор модуля GY-521 (MPU-6050) – RobotChip

Гироскоп-акселерометр GY-521 | 2 Схемы

Данный модуль представляет собой комбинированный датчик, объединяющий гироскоп, акселерометр и термометр. Акселерометр – это прибор, который измеряет ускорение тела. В состоянии покоя, либо равномерного прямолинейного движения на поверхности Земли акселерометр покажет только наличие ускорения, обусловленного действием поля силы тяжести Земли. Гироскоп способен реагировать на изменение ориентации тела в пространстве. И гироскоп, и акселерометр работают вдоль 3-х координатных осей. Для передачи информации устройство использует интерфейс I2C, это последовательный интерфейс позволяющий организовать обмен сообщениями по двухпроводной линии между 128 устройствами, одно из которых является главным, а остальные ведомыми [1-2]. Модуль гироскоп-акселерометр приобретен на Aliexpress.com

Модуль гироскоп-акселерометр на Aliexpress

Конструктивно модуль представляет собой печатную плату размером 20 х 15 мм, масса 1,5 г с припаянной гребенкой контактов.

Модуль гироскоп-акселерометр

Устройство поставляется в антистатическом пакете в комплекте с парой не припаянных контактных гребенок.

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

Естественно данное устройство относится к весьма сложным датчикам. Досконально разобраться в работе подобных устройств сложно, да и не всегда нужно, можно просто воспринимать устройство как «черный ящик», когда мы знаем только какие сигналы надо в этот черный ящик отправит, и какие сигналы в ответ из него мы можем получить. Хотя разумеется чем больше знаний, тем лучше.

Аппаратная платформа Arduino тем и хороша, что для большого количества стандартных датчиков можно найти готовые программные решения. Не является исключением и данное устройство [3-5].

Хотя в общей сложности GY-521 имеет 8 контактов для демонстрации совместной работы с Arduino UNO достаточно всего четырех проводов, остальные контакты нужны для более сложных вариантов взаимодействия [6].

В данном простейшем случае в качестве ведущего устройства выступает плата Arduino UNO. Выводы SDA и SLC гироскопа подключаются соответственно к контактам A4 и A5 платы Arduino [7]. Именно через эти выводы на Arduino UNO реализован данный интерфейс.

Вообще-то линии интерфейса I2C должны быть соединены с шиной питания через резисторы сопротивлением 4,7 кОм [1-2], но в случае одного датчика на макетной плате, все работало и так. Два варианта программы для Arduino, которые опрашивают гироскоп-акселерометр GY-521 можно скачать здесь [8].

Гироскоп-акселерометр питается напряжением 3,3 В от Arduino, ток потребления составляет около 5 мА.

На плате гироскопа-акселерометра располагается индикатор питания.

Испытания гироскопа

В мониторе последовательного порта Arduino IDE. Видно, что если прикоснуться к микросхеме на плате датчика рукой, то датчик покажет рост температуры.

Гироскоп-акселерометр GY-521

При изменении ориентации модуля в пространстве изменяется показания акселерометра, отображающие, вдоль какой оси (X,Y,Z соответственно) прибора действует ускорение свободного падения.

Влияние резкого поворота вдоль каждой из осей на показания гироскопа.

Помимо самого очевидного применения в летательных аппаратах гироскоп-акселерометр может оказаться полезным в умной одежде, всевозможных устройствах управления, балансирующих роботах [9], системах сигнализации и т.п. Одним словом интересное и недорогое устройство с широкими возможностями. Автор обзора – Denev.

  1. Блум Д. Изучаем Arduino: инструменты и методы технического волшебства: Пер. с англ. — СПб.: БХВ-Петербург, 2015. — 336 с.
  2. http://robocraft.ru/blog/communication/780.html
  3. http://forumdvrobot.ru/forum/3-41-1
  4. https://ngin.pro/index.php?newsid=188
  5. http://arduinoprojects.ru/2014/10/подключение-гироскопа-gy-521-mpu-6050-к-arduio/
  6. https://arduino-kit.ru/catalog/id/modul-3-h-osevogo-giroskopa-i-akselerometra-gy-521-mpu-6050
  7. https://mysku.ru/blog/china-stores/40178.html
  8. http://playground.arduino.cc/Main/MPU-6050#sketch
  9. http://robocraft. ru/blog/projects/570.html

101 применение шлюза UART-to-I2C/SPI/1W (RH-0004). Часть 6. Подключение 3-осевого гироскопа/акселерометра MPU6050 к компьютеру — radiohlam.ru

Насмотрелся я в ютубе видосов про всякие гироскопы, ну и захотелось мне тоже с ними поиграться. Одной из самых популярных оказалась платка GY-521 с чипом MPU6050 (фотка справа). Дёшево и сердито. Что из этого в итоге получилось, я сейчас попробую рассказать.

Итак, чип MPU6050 включает в себя:

  • 3-осевой гироскоп c 16-битным АЦП
    настраиваемый диапазон: ±250, ±500, ±1000, ±2000 0/sec (dps)
  • 3-осевой акселерометр с 16-битным АЦП
    настраиваемый диапазон: ±2g, ±4g, ±8g, ±16g
  • температурный сенсор
  • digital motion processor (DMP)
  • буфер FIFO (1024 байта)

Приятные и полезные «плюшки»:

  • ток потребления в нормальном режиме всего 4 мА (а есть ещё режим пониженного потребления)
  • система прерываний (детектор движения с программируемым порогом срабатывания, переполнение буфера FIFO…)
  • выбор источника тактирования из нескольких вариантов, включая внешний источник и внутренний генератор 8 MHz
  • программируемый низкочастотный фильтр (DLPF)
  • программируемая частота сэмплирования (Sample Rate = Gyroscope Output Rate / (1+ SMPLRT_DIV), где Gyroscope Output Rate = 1 kHz при включенном DLPF и 8 kHz при выключенном)
  • возможность подключить внешний трехосевой магнитометр

Работа с чипом происходит через регистры, посредством интерфейсов SPI или I2C, в зависимости от модификации чипа. Мне достался чип с интерфейсом I2C (что, собственно, без разницы). Документ с картой регистров можно скачать в конце статьи, а схема показана на рисунке справа.

Как правило, модуль GY-521 используют совместно с Arduino, либо с чем-то подобным, имеющим на борту достаточно «толстый» контроллер. «Толстый» контроллер нужен ввиду того, что данные гироскопа и акселерометра (мгновенные скорости вращения и ускорения по трём осям) обычно нафиг никому не нужны. Всем интересно положение тела в пространстве, а для того, чтобы его получить — нужно данные гироскопа и акселерометра интегрировать.

Есть второй путь, — использовать встроенный Digital Motion Processor. Он может сам проводить интегрирование и отдавать нам уже положение тела в пространстве в виде кватерниона (это такая математическая сущность, которой очень удобно описывать всякие вращения, подробнее как-нибудь отдельно про неё напишу).

Я решил использовать DMP. Это позволяло обойтись без сложных вычислений и подключить модуль напрямую к компьютеру с помощью шлюза UART-to-I2C/SPI/1W (шлюз, как всегда, был дополнен преобразователем USB-to-UART, чтобы подключаться к компьютеру по USB).

Запитать плату также можно прямо от шлюза, — для этого надо установить перемычку выбора питания на шлюзе (JP1) в положение +5В. Контакты соединяем следующим образом:

  • SCL Clock (тактирование I2C)
  • SDA Data (данные I2C)
  • VCC Supply (питание)
  • GND COM (общий)

С DMP есть только одна проблема — на него совершенно нет документации. Её в принципе и на сам чип не много, но на DMP вообще нет. Перерыв кучу разных источников, я обнаружил, что все работающие варианты сходятся к одному источнику — библиотеке под AVR Дэвида Джирони (Davide Gironi) от 2012 года, который, в свою очередь, ссылается на библиотеку для ардуино от Джефа Роуберга (Jeff Rowberg).

Как этот DMP работает, какие фильтры использует, — никто толком не знает (кто-то конечно знает, но кто знает — не рассказывает). В DMP просто заливается в виде бинарников эн-цать блоков кода, в процессе чего необходимо сделать несколько включений, выключений, переключений (этот алгоритм я опишу ниже), и всё, — остаётся только читать данные из буфера FIFO.

Размер буфера, как уже отмечалось, 1024 байта. Есть двухбайтный регистр-счётчик, содержащий количество байт в буфере (FIFO_COUNTH, FIFO_COUNTL). Чтобы эти регистры корректно обновлялись нужно обязательно вычитывать оба регистра, причём первым обязательно FIFO_COUNTH. Кроме того, можно настроить прерывания по переполнению буфера и по поступлению в буфер очередной порции данных.

Данные от DMP имеют вид блоков по 42 байта следующей структуры:

Как видите, размер буфера FIFO не кратен размеру пакета от DMP, то есть надо считывать данные быстрее, чем буфер успеет переполниться, ну или в случае переполнения придётся что-то придумывать для определения начала пакета от DMP. Я решил, что успею сделать это даже по USB, если выбрать частоту сэмплирования поменьше, скажем 200 Гц и ниже.

Итак, мне оставалось просто портировать нужные функции из C для AVR в С++ Builder, что и было в итоге сделано. Задача сильно облегчалась тем, что я, в своё время, написал специальную динамически подключаемую библиотеку (rh0004. dll) для работы со шлюзом и теперь для общения по I2C пользовался стандартными функциями из этой библиотеки. Функции я портировал следующие:

  • mpu6050_readBytes — прочитать указанное число байт, начиная с определённого адреса
  • mpu6050_readByte — прочитать один байт по указанному адресу
  • mpu6050_writeBytes — записать указанное число байт, начиная с определённого адреса
  • mpu6050_writeByte — записать один байт по указанному адресу
  • mpu6050_readBits — прочитать указанные биты из байта по определённому адресу
  • mpu6050_readBit — прочитать один бит из байта по определённому адресу
  • mpu6050_writeBits — записать указанные биты в байт по определённому адресу
  • mpu6050_writeBit — записать один бит в байт по определённому адресу
  • mpu6050_setMemoryBank — выбор банка памяти
  • mpu6050_setMemoryStartAddress — установка указателя адреса в выбранном банке памяти
  • mpu6050_readMemoryBlock — чтение блока памяти
  • mpu6050_writeMemoryBlock — запись блока памяти
  • mpu6050_writeDMPConfigurationSet — запись блока конфигурации DMP
  • mpu6050_getFIFOCount — чтение количества байт, находящихся в буфере FIFO
  • mpu6050_getFIFOBytes — чтение заданного количества байт из буфера FIFO
  • mpu6050_getIntStatus — чтение регистра INT_STATUS (статус прерываний)
  • mpu6050_resetFIFO — очистить буфер FIFO
  • mpu6050_getXGyroOffset
  • mpu6050_setXGyroOffset
  • mpu6050_getYGyroOffset
  • mpu6050_setYGyroOffset
  • mpu6050_getZGyroOffset
  • mpu6050_setZGyroOffset
  • mpu6050_setSleepDisabled — выйти из спящего режима
  • mpu6050_setSleepEnabled — перейти в спящий режим
  • mpu6050_testConnection — прочитать регистр MPU6050_RA_WHO_AM_I
  • mpu6050_init — инициализация акселерометра и гироскопа
  • mpu6050_dmpInitialize — инициализация DMP
  • mpu6050_dmpEnable — включение DMP
  • mpu6050_dmpDisable — отключение DMP

Как вы наверное заметили, часть функций (такие как get(set)X(Y,Z)GyroOffset) не описана вообще, а часть описана непонятно (скажем, про блоки и банки памяти). Это спасибо документации, в ней вообще отсутствуют описания регистров с нулевого по 12-й, а так же со 109-го по 113-й (судя по препарируемой библиотеке, они имеют отношение к начальной калибровке и DMP). Эту часть пришлось тупо скопировать, без какого-либо понимания почему, зачем и как.

Переходим к самому интересному. Алгоритм инициализации акселерометра и гироскопа (функция mpu6050_init) выглядит следующим образом:

  1. выходим из спящего режима, — функция mpu6050_setSleepDisabled() сбрасывает бит MPU6050_PWR1_SLEEP_BIT в регистре MPU6050_RA_PWR_MGMT_1
  2. выбираем источник тактирования, — я выбрал XGYRO (прописываем соответствующие биты в регистр MPU6050_RA_PWR_MGT_1)
  3. настраиваем низкочастотный фильтр (прописываем соответствующие биты в регистр MPU6050_RA_CONFIG), я настроил фильтр на 42 Hz
  4. настраиваем частоту сэмплирования (прописываем соответствующие биты в регистр MPU6050_RA_SMPLRT_DIV), я использовал частоту 200 Hz
  5. настраиваем диапазон шкалы гироскопа (прописываем соответствующие биты в регистр MPU6050_RA_GYRO_CONFIG)
  6. настраиваем диапазон шкалы акселерометра (прописываем соответствующие биты в регистр MPU6050_RA_ACCEL_CONFIG)

Собственно, после описанных выше манипуляций чип заработает и можно будет читать с него «живые» данные гироскопа и акселерометра по всем трём осям. Жаль, что эти данные без обработки, как мы уже говорили, никому не нужны. Для обработки придётся включить и настроить ещё и DMP. Алгоритм инициализации и настройки DMP несколько длиннее, поэтому здесь я его приводить не буду. Этот алгоритм можно посмотреть в логах демонстрационной программы.

Демонстрационная программа для компьютера, позволяющая вычитывать из чипа данные от DMP и визуализировать угловое положение чипа в пространстве, была написана на C++ Builder-е. Для визуализации использовалась библиотека OpenGL. Программу с исходниками, документацию на чип MPU6050 и ссылку на видео в youtube, демонстрирующее работу программы, можно найти ниже.

ПрограммаMPU6050_Demo.zip
ИсходникиMPU6050_Demo_sources.zip
Документация на чипдаташит
карта регистров
Демонстрационное видеоMPU6050 Demo
  1. Часть 1. USB программатор микросхем EPROM с интерфейсом I2C
  2. Часть 2. USB программатор микросхем EPROM с интерфейсом SPI
  3. Часть 3. USB-термометр на DS18B20 с передачей данных по сети
  4. Часть 4. USB программатор микросхем EPROM DS2430
  5. Часть 5. USB-программатор микросхем EPROM DS24B33
  6. Часть 6. Подключение 3-осевого гироскопа/акселерометра MPU6050 к компьютеру
  7. Часть 7. USB-программатор микросхем EPROM DS2431
  8. Часть 8. USB-программатор микросхем 1-Wire
  9. Часть 9. USB программатор SPI-flash серии W25Qxx
  10. Часть 10. USB программатор для микроконтроллеров AVR (последовательное программирование через SPI)

Взаимодействие модуля GY-521 с evive

Об этом учебном пособии

В этом учебном пособии мы свяжем модуль GY-521 с evive. Модуль GY-521 содержит 3-осевой акселерометр, 3-осевой гироскоп, датчик температуры и цифровой процессор движения. Мы будем отображать значение каждого датчика на последовательном мониторе.

Учебное пособие

  • Платформа для программирования: Arduino IDE
  • Сложность: Тяжело
  • Расчетное время: 3 часа