HMC5883L Магнітометр
Трьохосьовий магнітометр HMC5883L досить поширений. Іноді його помилково називають компасом. Але його важко назвати справжнім компасом. Спробуємо розібратися чому, та що треба зробити щоб перетворити його на електронного компаса. У попередній статті я писав про гіроскоп і акселерометр MPU 6050, за допомогою якого ми визначали нахили по двох осях. Але визначення положення відносно вертикальної осі залишилося без уваги. Безумовно, для цього можна було використати гіроскоп. Але у гіроскопа є дрейф і він не може визначати сторони світу. Для цього спробуємо застосувати трьохосьовий магнітометр HMC5883L.
Приклади написані на Python для мікрокомп`ютера Raspberry Pi A+ під керуванням операційної системи Raspbian. Для візуалізації використовується бібліотека pygame. Приклади можна закачати за наступним посиланням:
https://github.com/avislab/sensorstest/archive/master.zip
або за допомогою git:
git clone https://github.com/avislab/sensorstest.git
Схема підключення
Для підключення до мікроконтроллерів або мікрокомп`ютерів магнітометр HMC5883L має інтерфейс I2C. Стандартна схема підключення наведена нижче.Загальна інформація
При повороті магнітометра у магнітному полі Землі показання на його трьох осях змінюються. Використовуючи ці дані, можна обчислити і з`ясувати напрямок магнітометра відносно напрямку на магнітний полюс. Зчитавши показання з осей X і Y, можна обчислити кут, який і буде кутом відхилення від напрямку на північ.Однак, звіривши отримані результати з магнітним компасом, з`ясувалося, що магнітометр показує не зовсім у потрібному напрямку.
Магнітометр потрібно обов`язково калібрувати! Без калібрування його виміри дуже не точні.
Калібрування HMC5883L
Задачею калібрування є отримання коригувальної матриці, за допомогою якої можна буде обчислювати актуальні значення, тобто отримати відкалібровані значення. Обчислений, відкалібрований результат отримується шляхом множення значень зчитаних з датчика на коригувальну матрицю.Хто використовує Arduino, можуть скористатися програмою MagMaster. Для цього буде потрібно зробити невеликий стенд, залити в Arduino спеціальну прошивку для калібрування. Потім, виконуючи інструкцію, послідовно встановлювати датчик в певні положення і знімати показання за допомогою програми MagMaster. Результатом роботи програми і буде коригувальна матриця і значення зсувів по трьох осях. Отримані значення прописуються в готовій бібліотеці, після чого показання магнітометра мають реальний сенс. Докладніше читайте тут: Advanced hard and soft iron magnetometer calibration for dummies
В даному випадку я не використовую Arduino і мені не хотілося робити стенд, встановлювати його за рівнем, орієнтувати на північ, тощо. Я застосував інший метод. Я вирішив зібрати масив значень при різних положеннях датчика. Чим більше значень, тим точніше будуть обчислення коригувальних даних. Рекомендується 10-20 тисяч. У прикладі використовується лише 1000. Під час збору даних для калібрування датчик треба обертати у всіх напрямках близько хвилини. Збір даних у такий спосіб не вимагає точної орієнтації датчика. У прикладі є скрипт hmc5883_calibr.py, який збирає дані в текстовий файл HMC5883L_calibr.txt, на основі якого за допомогою програми Magneto обчислюється коригувальна матриця. Аналогічним способом можна калібрувати інші трьохосьові датчики. Отримані коригувальні дані використовуються в скриптах.
Див. приклад:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from hmc5883 import *
compass = hmc5883l()
# calibration data
compass.calibration_matrix = [ [1.259098, 0.013830, 0.039295],
[0.01380, 1.245928, -0.018922],
[0.039295, -0.018922, 1.360489]]
compass.bias = [11.16, -43.55, -52.62]
while True:
print compass.heading()
time.sleep(0.1)
Програма Magneto вимагає введення значення, яке відповідає нормальній напруженості магнітного поля Землі в Вашій місцевості. Оскільки мені не потрібно вимірювати напруженість (абсолютна величина мене не цікавить), а на визначення сторін світу це ніяк не впливає, можна вказати будь-яке значення, близьке до значень, зібраних у файлі HMC5883L_calibr.txt.
Закачати програму Magneto можна за наступним посиланням: https://sites.google.com/view/sailboatinstruments1
Похибка при нахилах
Після калібрування показання магнітометра стали повторювати показання магнітної стрілки компаса. Дивись pygame_hmc5883.pyАле у будь-якого магнітометра спостерігається значна похибка при нахилах. Варто магнітометру придати нахил і показання значно змінюються. При цьому чим ближче Ви знаходитесь до полюса, тим більш помітний цей ефект. А на екваторі він практично відсутній. Справа у тому, що лінії магнітного поля Землі проходять паралельно поверхні тільки на екваторі. На решті поверхні Землі магнітні лінії спрямовані під кутом до поверхні, а на полюсах і зовсім спрямовані вертикально.
Якщо Ви звернули увагу, значення магнітометра по осі Z не дорівнює нулю і навіть більше, ніж на осях X і Y. Це від того, що в місцевості, де я живу, магнітні лінії входять в поверхню Землі під кутом майже 60 градусів.
Тобто, вертикальна складова більше, ніж горизонтальна. При нахилі магнітометра вертикальна складова викликає зміни показань по всіх осях магнітометра.
Магнітометр HMC5883L + Гіроскоп MPU6050
Чи можемо ми компенсувати похибку, що спричиняється нахилом магнітометра, щоб він і при будь-яких положеннях міг показувати сторони світу правильно? І що для цього потрібно? Так! Для цього нам треба знати кути нахилу магнітометра відносно поверхні Землі по двох осях.На жаль не має можливості однозначно визначити кути нахилу магнітометра відносно Землі за допомогою самого магнітометра, навіть знаючи кут нахилу ліній магнітного поля Землі в даній місцевості. Потрібні зовнішні, незалежні джерела даних про нахили магнітометра. Для цього будемо використовувати гіроскоп з акселерометром.
Я встановив всі датчики на одну планку і доопрацював приклад, який тепер враховує нахили магнітометра. Для повороту вектора застосовуються матриці повороту. Для тих, хто буде копатися у коді, поворот вектора реалізований двома циклами. Але цей фрагмент програми можна спростити, як описано тут: http://www.germersogorb.de/html/kalibrierung_des_hcm5883l.html
Тепер магнітометр показує сторони світу правильно. Ось чому окремо магнітометр не зовсім правильно називати компасом. Тільки в комплексі з гіроскопом і акселерометром можна домогтися від нього прийнятних результатів. Дивись pygame_hmc5883_mpu6050.py
Для пом`якшення обертання стрілки компаса я використовував спеціально доопрацьований спрощений фільтр Калмана, який коректно спрацьовує при переході значень від + 180o до -180o і назад. Дивись pygame_hmc5883_mpu6050_kfs360.py
Висновки
Таким чином, всі три датчика - гіроскоп, акселерометр і магнітометр усувають недоліки один одного і спільно вирішують задачу визначення положення системи у просторі. Окремо вони не здатні вирішити таке завдання. З цієї причини Ви можете знайти мікросхеми з трьома цими датчиками.Успіхів.
Додаткова інформація
Kalibrierung und Kompensierung des Magnetometers HMC5883L Advanced hard and soft iron magnetometer calibration for dummies Download Magneto v1.2 About Magnetometer Множення матриць Матриця повороту Північний магнітний полюс Південний магнітний полюс MPU-6050 – гіроскоп – акселерометрДивись також:
- 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
Добрий день. Якщо можна, дайте посилання на Magneto, те, що в статті - недійсне. Дякую.
Дякую за зауваження. Посилання виправив. Актуальне: https://sites.google.com/view/sailboatinstruments1
Недавні записи
- 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
Архіви