MPU-6050 - гіроскоп - акселерометр
Трьохосьовий гіроскоп з трьохосьовим акселерометром MPU6050 дуже доступний за ціною чим і придбав собі популярність. Цей датчик застосовується для визначення положення в просторі, в системах стабілізації положення, стабілізації прямолінійного руху і руху по заданій кривій. Наприклад, в балансирних роботах, в ігрових приставках, застосовується у робототехніці, для вимірювання кутів нахилу, швидкості обертання, у авіамоделізмі його використовують в автопілотах. Датчик може застосовуватися для вимірювання перевантажень, тощо.
Схема підключення
Для підключення до контролера або мікрокомп`ютера, датчик має шину I2C.Документацію датчика MPU-6050 качайте тут: MPU-6000 and MPU-6050 Product Specification Revision 3.2 Призначення регістрів MPU-6050 тут: MPU-6000 and MPU-6050 Register Map and Descriptions Revision 4.0
Завантажити приклади на Python
Для Raspberry Pi (OS: Raspbian) приклади скриптів можна завантажити так:
git clone https://github.com/avislab/sensorstest.git
Калібрування
Якщо зчитати дані з датчика буде помітно деяку похибку. Наприклад, у датчика у стані cпокою показання гіроскопа будуть відмінні від нуля. А показники акселерометра по модулю можуть перевищувати 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 — PWM і Сервопривод
- Raspberry Pi — DHT11
- Raspberry Pi - FM Transmitter
- Прошивка AVR мікроконтролерів за допомогою Raspberry Pi
- Raspberry Pi — LCD display 1602
- Raspberry Pi — WiFi
- 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 без клавіатури та монітору
- IR-дистанційне керування. Використання LIRC у Python
- Raspberry Pi. Raspbian. Відправлення пошти через аккаунт Gmail
- Neoway M590 – GSM/GPRS modem
- MPU-6050 – гіроскоп – акселерометр
- HMC5883L Магнітометр
- PWM контролер з інтерфейсом I2С на базі мікросхеми PCA9685
- Метеостанція на Raspberry Pi своїми руками
- Raspberry Pi. Live-stream video
Вопрос по калибровке. А если датчик жестко закреплен в машине, как можно провести его калибровку.
Снать, откалибровать, поставить назад. Если демонтаж датчика невозможен, то не знаю.
Хочу использовать два датчика BME280 и MPU6050 вместе. Подскажите как организовать опрос BME280 - 1 раз в секунду MPU6050 - 10 раз в секунду. Спасибо.
Недавні записи
- LCD Display ST7567S (IIC)
- Розпізнавання мови (Speech recognition)
- Selenium
- Комп'ютерний зір (Computer Vision)
- Деякі думки про точність вимірювань в електроприводі
- Датчики Холла 120/60 градусів
- Модуль драйверів напівмосту IGBT транзисторів
- Драйвер IGBT транзисторів на A316J
- AS5600. Варіант встановлення на BLDC мотор
- DC-DC для IGBT драйверів ізольований 2 W +15 -8 вольт
Tags
battery soldering java-script ngnix adc rs-232 flask esp8266 watchdog web exti solar mongodb rtc sms pwm usart books ethernet smd git websocket meteo css python dc-dc displays led ssd1306 eeprom gpio barometer max1674 mpx4115a brushless motor mpu-6050 timer sensors remap servo bldc atmega pmsm 3d-printer flash encoder examples dma raspberry-pi tim ssd1331 piezo mpu-9250 rfid eb-500 foc bme280 gps nvic dht11 bluetooth hih-4000 stm32 st-link docker uart avr html wifi bmp280 bkp nodemcu options usb lcd programmator i2c capture
Архіви