MPU-6050 - гироскоп - акселерометр
Трехосевой гироскоп с трехосевым акселерометром MPU-6050 очень доступен по цене, чем и приобрел себе популярность. Этот датчик применяется для определения положения в пространстве, в системах стабилизации положения, стабилизации прямолинейного движения и движения по заданной кривой. Например, в балансирных роботах, в игровых приставках, применяется в робототехнике, для измерения углов наклона, скорости вращения, в авиамоделизме его применяют в автопилотах. Датчик может применяться для измерения перегрузок и тому подобное.
Схема подключения
Для подключения к контроллеру или микрокомпьютеру, у датчика имеется шина I2C.Документация по датчику скачать здесь: MPU-6000 and MPU-6050 Product Specification Revision 3.2 Описание регистров здесь: MPU-6000 and MPU-6050 Register Map and Descriptions Revision 4.0
Для Raspberry Pi (OS: Raspbian) примеры скриптов можно скачать и развернуть так:
git clone https://github.com/avislab/sensorstest.git
Калибровка
Если считать данные с датчика можно заметить некоторую погрешность. Например, при абсолютном покое датчика показания гироскопа будут отличаться от нуля. А показания акселерометра по модулю могут превышать 1. См. работу скрипта mpu6050_get_raw_no_calibr.py. Дело в том, что каждый экземпляр датчика требует калибровки. У некоторых цифровых датчиков можно встретить корректировочные коэффициенты, которые для каждого экземпляра прошивают в память датчика на этапе производства. К сожалению, в этом датчике такого нет, и мы сами должны позаботиться о калибровке. Показания датчиков имеют некоторое смещение относительно нуля, что и вносит погрешность в измерения. Нам нужно учесть это смещение для каждой оси гироскопа и каждой оси акселерометра и вносить корректировку при расчетах.На самом деле присутствуют и другие погрешности. Например, трехосевые датчики должны располагаться взаимно перпендикулярно. Но при производстве трудно добиться абсолютной точности, поэтому этот угол также имеет определенные допуски и влияет на погрешность. Кроме того показания датчиков с трех осей могут иметь разную пропорциональность. В данном случае наибольшая погрешность из-за смещения относительно нуля.
В примере я предусмотрел процедуру калибровки. Скрипт калибровки: mpu6050_calibr.py. Калибровка выполняется в два этапа. Сначала датчик должен быть неподвижен. Подразумевается, что угловые скорости равны нулю. Калибруется гироскоп. Затем калибруется акселерометр. Нужно его не спеша поворачивать во всех направлениях. Эта процедура занимает около минуты. После чего функция калибровки выдает вычисленные значения, которые нужно прописать в скрипте. На этом калибровка закончена. После калибровки погрешность значительно снизится. См. Скрипт: mpu6050_get_raw.py. В этом скрипте в следующих строках указываются калибровочные данные:
mpu.gyro_offs = {`x`: -178, `y`: 259, `z`: -104}
mpu.accel_offs = {`y`: -354, `x`: 389, `z`: -1482}
Гироскоп
Гироскоп измеряет угловые скорости по трем осям с разными пределами измерений: 250, 500, 1000, и 2000 градусов в секунду. Пределы измерения могут быть выставлены в соответствии с Вашими задачами. Не стоит устанавливать без необходимости максимальные пределы, если у вас достаточно медленная система. Правильно выбранные пределы повысят точность измерений.Для тех, кто ранее был знаком с механическими гироскопами, могут возникнуть некоторые неопределенности. Дело в том, что механические гироскопы стабилизируются в пространстве за счет своих физических свойств. Электронные гироскопы этого делать не могут, они лишь измеряют скорость вращения вокруг осей и ничего не могут сообщить о текущем положении системы.
С помощью электронного гироскопа можно определить положение системы следующим образом. При включении принять начальное положение за нулевую позицию. Затем опрашивать гироскоп с заданным интервалом, зная интервал и скорость вращения, вычислять смещение и добавлять к текущему положению. При этом мы предполагаем, что между двумя опросами датчика система поворачивалась с постоянной скоростью. Такой подход ведет к неизбежному накоплению ошибки. Что видно на примере. Смотри работу скрипта: mpu5060_gyro.py или скрипта, графически отображающего положение гироскопа pyplay_gyro.py.
Акселерометр
Для определения положения системы можно использовать трехосевой акселерометр. Акселерометр также имеет настраиваемые пределы измерений ±2g, ±4g, ±8g і ±16g. Эти пределы устанавливаются в зависимости от динамичности Вашей системы. Напомню, что на любое тело действует сила притяжения. В состоянии покоя g=1. В состоянии свободного падения, когда тело движется к земле с ускорением 9,81 м/с2 - g=0. При разных ускорениях g будет разным. Чем выше ускорение, тем больше g. Поэтому если у Вас достаточно медленная, задемпфированная система, которая физически не способна быстро ускоряться, не стоит устанавливать максимальные пределы измерений. Правильно выбранный диапазон измерений упростит в будущем фильтрацию показаний датчика.Когда мы поворачиваем датчик в пространстве, показания акселерометра на каждой из трех осей будет изменяться в зависимости от положения. Так, с помощью трехосевого акселерометра под воздействием силы тяжести можно определить положение системы. См. работу скрипта mpu6050_accel_no_filter.py.
Мы видим, что значения достаточно зашумлены. Попробуем их фильтровать. Я применил очень упрощенный фильтр Калмана. См. работу скрипта mpu6050_accel_kf.py. Показания стали более стабильными, однако в нашем случае фильтр малополезен. Если датчик потрясти, мы увидим, что показания углов изменяются и иногда очень сильно, хотя мы его не поворачиваем, а перемещаем с ускорением вдоль осей. Это логично, поскольку на акселерометр теперь кроме силы тяжести действует дополнительная сила, и результирующий вектор изменяет направление. Наглядно это видно на примере скрипта pyplay_accel.py (в этом скрипте фильтрация не используется). Здесь простая фильтрация только частично улучшает ситуацию. В решении этой проблемы нам поможет гироскоп. Именно он может нам сказать, что система-то не вращалась, и поэтому мы можем эти колебания отфильтровать.
Совместное использование гироскопа и акселерометра
Использование отдельно акселерометра или отдельно гироскопа не даст желаемого результата, только их совместное использование с применением фильтрации с учетом показаний двух датчиков дает приемлемый результат. В примере реализован один из способов комплементарного фильтра. Он достаточно прост и работает следующим образом. За первоначальное положение принимается положение, вычисленное на основании данных акселерометра. Затем с заданным интервалом вычисляются положение на основе данных гироскопа и положение на основе данных акселерометра. Затем вычисленные показания сводятся в общий финальный результат. При этом акселерометр корректирует "дрейф" гироскопа, а гироскоп сглаживает скачки акселерометра при вибрациях и ускорениях. Математически это представляется следующей формулой.См. работу скрипта mpu6050_final.py или скрипта pyplay_final.py, который графически изображает процесс работы MPU-6050
MotionApps
Если Вам не хочется усложнять себе жизнь с реализацией собственного фильтра, или вычислительных мощностей не достаточно для его работы, можно пойти другим путем. Применительно к этому датчику существует понятие MotionApps. Это некий бинарный код, который записывается в память датчика. Код записывается в энергозависимую память, поэтому его нужно записывать каждый раз после подачи питания. Это занимает около секунды. Код собирает и фильтрует показания со всех осей акселерометра и гироскопа. Данные складываются в буфер FIFO. Собственно, Вам остается дождаться готовности данных и считать буфер со всеми показаниями. Пример на Питоне, который я нашел на GiHub: https://github.com/cTn-dev/PyComms/tree/master/MPU6050Кто использует Arduino, тоже без труда найдут в интернете аналогичные примеры.
В особенности работы MotionApps я не вникал. Думаю, это тема для отдельной статьи. Меня больше интересовала собственная реализация на Python.
Визуализация
Для наглядности я привел несколько простых примеров для графического отображения положения системы. В этих примерах используется pygame. Запуск этих скриптов рекомендуется выполнять из графической оболочки.Успехов.
Смотри также:
- Raspberry Pi — Что это такое?
- Raspberry Pi — GPIO
- Raspberry Pi — UART
- Raspberry Pi — FT232
- Raspberry Pi — ШИМ и Сервопривод
- Raspberry Pi — DHT11
- Raspberry Pi - FM Transmitter
- Прошивка AVR микроконтроллеров с помощью Raspberry Pi
- Raspberry Pi — LCD дисплей 1602
- Raspberry Pi — Wi-Fi
- Raspberry-Pi — I2C (TWI)
- Raspberry Pi - DS18B20
- Raspberry Pi Camera
- nRF24L01+ ATMEGA + Raspberry Pi
- BMP180 + Raspberry Pi + WH1602
- Wi-Fi Метео станция
- Raspbian. Apache + PHP + Python + MySQL
- Устанавливаем Raspbian на Raspberry Pi без клавиатуры и монитора
- ИК-дистанционное управление. Использование LIRC в Python
- Raspberry Pi. Raspbian. Отправка почты через аккаунт Gmail
- Neoway M590 – GSM/GPRS modem
- MPU-6050 – гироскоп – акселерометр
- HMC5883L Магнитометер
- PWM контролер на базе микросхемы PCA9685
- Метеостанция на Raspberry Pi своими руками
- Raspberry Pi. Live-stream video
Недавні записи
- Своя бібліотека для векторного керування безколекторними моторами
- Not Allowed
- Адаптивний ПІД регулятор
- Конструктор регуляторів моторів. Структура.
- Конструктор регуляторів моторів. Анонс.
- Golang + Vue + PostgreSQL #2
- Golang + Vue + SQLite #1
- FOC Position Control. Векторне управління - Стабілізація положення
- Flask & Vue. Завантаження файлів. Приклад № 2.10
- Рекуперація. FOC і цікаві досліди
Tags
gpio piezo hih-4000 bme280 mpu-6050 options watchdog capture led brushless foc docker wifi dc-dc flask tim gps mpu-9250 sms bldc java-script examples solar smd max1674 rfid ethernet raspberry-pi sensors usart lcd dht11 displays motor websocket timer flash pwm stm32 python bmp280 battery eb-500 web html css mongodb books git ssd1306 i2c dma exti atmega pmsm meteo avr mpx4115a remap eeprom encoder rs-232 soldering bluetooth esp8266 ngnix ssd1331 rtc bkp servo st-link programmator uart 3d-printer usb adc nvic nodemcu barometer
Архіви