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 раз в секунду. Спасибо.
Недавні записи
- Text to speech. Українська мова
- LCD Display ST7567S (IIC)
- Розпізнавання мови (Speech recognition)
- Selenium
- Комп'ютерний зір (Computer Vision)
- Деякі думки про точність вимірювань в електроприводі
- Датчики Холла 120/60 градусів
- Модуль драйверів напівмосту IGBT транзисторів
- Драйвер IGBT транзисторів на A316J
- AS5600. Варіант встановлення на BLDC мотор
Tags
docker sensors rtc led timer wifi remap sms css websocket mongodb bme280 rfid bluetooth esp8266 nodemcu bkp piezo bmp280 i2c mpu-6050 encoder examples avr brushless ngnix nvic displays bldc java-script pmsm barometer pwm lcd ethernet stm32 raspberry-pi capture usart gpio exti atmega meteo solar smd dma adc eeprom eb-500 flask python ssd1306 uart options flash mpx4115a html gps st-link 3d-printer servo dc-dc foc git books battery hih-4000 watchdog dht11 web tim programmator ssd1331 mpu-9250 usb rs-232 motor max1674 soldering
Архіви