Гироскоп-акселерометр 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.
- Блум Д. Изучаем Arduino: инструменты и методы технического волшебства: Пер. с англ. — СПб.: БХВ-Петербург, 2015. — 336 с.
- http://robocraft.ru/blog/communication/780.html
- http://forumdvrobot.ru/forum/3-41-1
- https://ngin.pro/index.php?newsid=188
- http://arduinoprojects.ru/2014/10/подключение-гироскопа-gy-521-mpu-6050-к-arduio/
- https://arduino-kit.ru/catalog/id/modul-3-h-osevogo-giroskopa-i-akselerometra-gy-521-mpu-6050
- https://mysku.ru/blog/china-stores/40178.html
- http://playground.arduino.cc/Main/MPU-6050#sketch
- 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_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) выглядит следующим образом:
- выходим из спящего режима, — функция mpu6050_setSleepDisabled() сбрасывает бит MPU6050_PWR1_SLEEP_BIT в регистре MPU6050_RA_PWR_MGMT_1
- выбираем источник тактирования, — я выбрал XGYRO (прописываем соответствующие биты в регистр MPU6050_RA_PWR_MGT_1)
- настраиваем низкочастотный фильтр (прописываем соответствующие биты в регистр MPU6050_RA_CONFIG), я настроил фильтр на 42 Hz
- настраиваем частоту сэмплирования (прописываем соответствующие биты в регистр MPU6050_RA_SMPLRT_DIV), я использовал частоту 200 Hz
- настраиваем диапазон шкалы гироскопа (прописываем соответствующие биты в регистр MPU6050_RA_GYRO_CONFIG)
- настраиваем диапазон шкалы акселерометра (прописываем соответствующие биты в регистр MPU6050_RA_ACCEL_CONFIG)
Собственно, после описанных выше манипуляций чип заработает и можно будет читать с него «живые» данные гироскопа и акселерометра по всем трём осям. Жаль, что эти данные без обработки, как мы уже говорили, никому не нужны. Для обработки придётся включить и настроить ещё и DMP. Алгоритм инициализации и настройки DMP несколько длиннее, поэтому здесь я его приводить не буду. Этот алгоритм можно посмотреть в логах демонстрационной программы.
Демонстрационная программа для компьютера, позволяющая вычитывать из чипа данные от DMP и визуализировать угловое положение чипа в пространстве, была написана на C++ Builder-е. Для визуализации использовалась библиотека OpenGL. Программу с исходниками, документацию на чип MPU6050 и ссылку на видео в youtube, демонстрирующее работу программы, можно найти ниже.
Программа | MPU6050_Demo.zip |
Исходники | MPU6050_Demo_sources.zip |
Документация на чип | даташит карта регистров |
Демонстрационное видео | MPU6050 Demo |
- Часть 1. USB программатор микросхем EPROM с интерфейсом I2C
- Часть 2. USB программатор микросхем EPROM с интерфейсом SPI
- Часть 3. USB-термометр на DS18B20 с передачей данных по сети
- Часть 4. USB программатор микросхем EPROM DS2430
- Часть 5. USB-программатор микросхем EPROM DS24B33
- Часть 6. Подключение 3-осевого гироскопа/акселерометра MPU6050 к компьютеру
- Часть 7. USB-программатор микросхем EPROM DS2431
- Часть 8. USB-программатор микросхем 1-Wire
- Часть 9. USB программатор SPI-flash серии W25Qxx
- Часть 10. USB программатор для микроконтроллеров AVR (последовательное программирование через SPI)
Взаимодействие модуля GY-521 с evive
Об этом учебном пособии
В этом учебном пособии мы свяжем модуль GY-521 с evive. Модуль GY-521 содержит 3-осевой акселерометр, 3-осевой гироскоп, датчик температуры и цифровой процессор движения. Мы будем отображать значение каждого датчика на последовательном мониторе.
Учебное пособие
- Платформа для программирования: Arduino IDE
- Сложность: Тяжело
- Расчетное время: 3 часа
- Выжить
Необходимые компоненты
ВведениеВ этом руководстве объясняется, как подключить модуль GY-521 к evive. На модуле установлен MPU6050 с 3-осевым акселерометром, 3-осевым гироскопом и цифровым процессором движения. Этот модуль работает по принципу MEMS (микроэлектромеханическая система).
Прежде чем углубляться в тонкости работы с модулем, для начала следует иметь представление о том, что такое акселерометр или гироскоп. Начнем с акселерометра: он измеряет ускорение по всем трем осям — x, y и z. Каждый модуль акселерометра имеет микроэлектромеханическую структуру, которая подвергается смещению из-за ускорения. Это смещение ощущается с точки зрения изменения емкости, которое изменяет напряжение, подаваемое блоком акселерометра. Модуль GY-521 имеет регистры, в которых хранятся значения ускорения всех осей.
Аналогично, гироскоп дает величину вращения по каждой из осей x, y и z. Вращение по осям x, y и z широко известно как крен, тангаж и рыскание соответственно. Датчик гироскопа также имеет специальную структуру, которая вибрирует из-за вращения датчика, что приводит к изменению емкости и, следовательно, изменению выходного напряжения.
Приложения- Навигация
- Автомобили
- Робототехника
- Смартфоны
- Самолеты
- Соедините «VCC» GY-521 с «VCC» evive
- Соедините «GND» GY-521 с «GND» evive
- Соедините «SDA» GY-521 с «SDA» evive (серийные данные)
- Соедините «SCL» GY-521 с «SCL» evive (последовательные часы)
Код Arduino
Этот код демонстрирует взаимодействие модуля GY-521 с evive. Мы собираемся отображать показания акселерометра, гироскопа и датчика температуры на последовательном мониторе. В этом коде мы использовали библиотеку Wire, которая используется для связи «I2C» (связь Inter Integrated Circuit)
Ожидаемый результат
[tutorialRelatedProjects]
Поделиться этим руководством
Поделиться на facebook
Поделиться в Твиттере
Твиттер
Поделиться на Pinterest
Поделиться на Reddit
Поделиться в печати
Печать
Избранные проекты
MPU6050 (GY-521 Breakout) + Приложение Arduino Mega 2560 Акселерометр и гироскоп
Привет всем,
Сегодня я покажу вам, как мы можем использовать GY-521. Прорыв с Arduino Mega 2560, чтобы получить показания с датчика.
Во-первых, я должен сказать, что я совершенно новичок в Arduino, и я имеют ограниченные знания в работе с регистрами и всякими глубокими вещами. Я пытаюсь выучить их, и да, это будет началом. Дж
Итак, сначала позвольте мне показать вам, что я уже купил.
Первый GY-521 Отрыв для MPU-6050
Позвольте мне представить вам краткое введение об этом товар.
Датчик InvenSense MPU-6050 содержит МЭМС акселерометр и MEMS-гироскоп в одном чипе. Это очень точно, так как содержит 16-битное аналогово-цифровое преобразование для каждого канала. Поэтому он захватывает каналы x, y и z одновременно.
— Чип: MPU-6050
— Питание: 3,5В (Но так как на коммутации есть регулятор напряжения
плата, вы можете использовать 5В напрямую)
— Режим связи: стандартный протокол связи IIC
— Чип встроенный 16-битный АЦП, 16-битный вывод данных
— Диапазон гироскопов: +/- 250 500 1000 2000 градусов/сек
— Диапазон ускорения: +/- 2 г, +/- 4 г, +/- 8 г, +/- 16 г
Техническое описание MPU-6050 можно найти здесь. Карту регистрации можно найти здесь.
Вот схема GY-521
Теперь нам нужно получить плату Arduino Mega 2560.
Всю информацию, связанную с этим продуктом, можно найти здесь.
Итак, у нас есть наши предметы, и следующая важная вещь — это соединить этих двоих вместе. Обратите внимание на проводку отличается для Arduino UNO. Эта проводка предназначена для Arduino Mega 2560.
Здесь соединения
GY-521 Arduino Мега
VCC 3,3 В или 5В
GND GND
SCL Контакт 21 (СКЛ)
SDA Контакт 20 (ПДД)
INT Контакт 2 (Прерывание 0) — для получения дополнительных контактов прерывания в Arduino нажмите здесь.
Теперь для программа. Поскольку у нас есть много ресурсов по использованию Arduino, давайте попробуйте код от них (Хотя пришлось потратить несколько часов на работу с ними :П ).
Сначала давайте попробуем найти, связано ли наше устройство с Arduino. Для этого мы можем используйте код сканера I2C от Krodal, чтобы узнать подключенные устройства I2C к Ардуино. Вы можете найти код здесь.
Также следует это код. Скомпилируйте код и загрузите его в Arduino. Откройте последовательный монитор и перезагрузить Ардуино.
Он найдет ваш GY-521 по адресу 0x68 или 0x69. Если он не находит IMU в этом месте, может быть проблема с вашим проводка. Пожалуйста, проверьте еще раз.
Теперь мы можем используйте следующий код Кродала, чтобы получить необработанные выходные данные датчика. Кродаль эскиз можно найти здесь. Пожалуйста, прокрутите страницу до конца, и вы сможете найти код. Также Я буду публиковать это здесь.
Вот результат.
Теперь мы готов попробовать код от Джеффа Роуберга. Загрузите библиотеку I2C с github. Вот ссылка.
Теперь распаковать файл и найдите папку Arduino. Скопируйте библиотеки I2Cdev и MPU6050 в ваши библиотеки Arduino, расположенные в C:\Program Files (x86)\Arduino\libraries.
Теперь вы готов к использованию библиотек I2Cdev и MPU6050. Найдите пример кода в папке \Arduino\MPU6050\Examples\MPU6050_DMP6. и загрузить его в Ардуино. Теперь вы получите вывод из Serial монитор. Выход предоставляет вам разумные значения от датчика в отличие от сырые выходы. Здесь Джефф использовал встроенный процессор Digital Motion Processor™. (DMP™), способный обрабатывать комплекс 9алгоритмы MotionFusion. Вы можете найти работу Джеффа здесь. |
Теперь мы можем используйте демонстрацию обработки, предоставленную Джеффом, с примером MPU6050.