HMC5883L Магнітометр
Магнитометр 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/site/sailboatinstruments1/home
Похибка при нахилах
Після калібрування показання магнітометра стали повторювати показання магнітної стрілки компаса. Дивись 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
Недавні записи
- Своя бібліотека для векторного керування безколекторними моторами
- 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
Архіви