MPU-6050 - гіроскоп - акселерометр


24.11.2015

Трьохосьовий гіроскоп з трьохосьовим акселерометром MPU6050 дуже доступний за ціною чим і придбав собі популярність. Цей датчик застосовується для визначення положення в просторі, в системах стабілізації положення, стабілізації прямолінійного руху і руху по заданій кривій. Наприклад, в балансирних роботах, в ігрових приставках, застосовується у робототехніці, для вимірювання кутів нахилу, швидкості обертання, у авіамоделізмі його використовують в автопілотах. Датчик може застосовуватися для вимірювання перевантажень, тощо.

Схема підключення

Для підключення до контролера або мікрокомп`ютера, датчик має шину I2C.

MPU-6050-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. Справа у тому, що кожен екземпляр датчика вимагає калібрування. У деяких цифрових датчиків можна зустріти коригувальні коефіцієнти, які для кожного екземпляра прошивають в пам`ять датчика на етапі виробництва. На жаль, в цьому датчику такого немає, і ми самі повинні подбати про калібрування. Показання датчиків мають деякий зсув відносно нуля, що і вносить похибку у виміри. Нам потрібно врахувати це зміщення для кожної осі гіроскопа і кожної осі акселерометра і вносити поправку у розрахунки.

Насправді, присутні й інші фактори, які впливають на похибки. Наприклад, трьохосьові датчики повинні розташовуватися взаємно перпендикулярно. Але при виробництві важко добитися абсолютної точності, тому цей кут також має певні допуски і впливає на похибку. Крім того, показання датчиків з трьох осей можуть мати різну пропорційність. У даному випадку найбільша похибка - через зміщення відносно нуля.

 

MPU-6050-offset1MPU-6050-offset2MPU-6050-offset3 У прикладі я передбачив процедуру калібрування. Скрипт калібрування: 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 (в цьому скрипті фільтрація не використовується). Тут проста фільтрація тільки частково покращує ситуацію. У вирішенні цієї проблеми нам допоможе гіроскоп. Саме він може нам сказати, що система не оберталася, і тому ми можемо ці коливання відфільтрувати.

Спільне використання гіроскопа і акселерометра

Використання окремо акселерометра або окремо гіроскопа не дає бажаного результату, тільки їх спільне використання з застосуванням фільтрації з урахуванням даних двох датчиків дає прийнятний результат. У прикладі реалізовано один із способів комплементарного фільтра. Він досить простий і працює наступним чином. За початкове положення приймається положення, обчислене на підставі даних акселерометра. З заданим інтервалом обчислюють положення на основі даних гіроскопа і положення на основі даних акселерометра. Потім обчислені показання зводяться в загальний фінальний результат. При цьому акселерометр коригує "дрейф" гіроскопа, а гіроскоп згладжує скачки акселерометра від вібрації та при прискореннях. Математично це описує наступна формула:

MPU-6050-filter

Дивись роботу скрипта 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. Запуск цих скриптів рекомендується виконувати з графічної оболонки.

MPU-6050-x

Успіхів.

Дивись також:

Raspberry Pi Корисно знати Схеми і прошивки
Коментарі:
Nick говорить:
10.08.2016 16:03
Вопрос по калибровке.
А если датчик жестко закреплен в машине, как можно провести его калибровку.

andre говорить:
10.08.2016 21:49
Снать, откалибровать, поставить назад. Если демонтаж датчика невозможен, то не знаю.

foxit говорить:
23.09.2021 11:20
Хочу использовать два датчика BME280 и MPU6050 вместе.
Подскажите как организовать опрос BME280 - 1 раз в секунду MPU6050 - 10 раз в секунду.
Спасибо.

Додати коментар
Code
* - обов'язкові поля

Архіви