Avislab сайт для палких паяльників

HMC5883L Магнітометр


18.12.2015

Трьохосьовий магнітометр 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. Стандартна схема підключення наведена нижче.

hmc5883l_circuid

Загальна інформація

При повороті магнітометра у магнітному полі Землі показання на його трьох осях змінюються. Використовуючи ці дані, можна обчислити і з`ясувати напрямок магнітометра відносно напрямку на магнітний полюс. Зчитавши показання з осей X і Y, можна обчислити кут, який і буде кутом відхилення від напрямку на північ.

round2

Однак, звіривши отримані результати з магнітним компасом, з`ясувалося, що магнітометр показує не зовсім у потрібному напрямку.

HMC5883L_raw

Магнітометр потрібно обов`язково калібрувати! Без калібрування його виміри дуже не точні.

Калібрування 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.

Magneto02

Закачати програму Magneto можна за наступним посиланням: https://sites.google.com/view/sailboatinstruments1

Похибка при нахилах

Після калібрування показання магнітометра стали повторювати показання магнітної стрілки компаса. Дивись pygame_hmc5883.py

HMC5883L_calibrated

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

inclination

Якщо Ви звернули увагу, значення магнітометра по осі Z не дорівнює нулю і навіть більше, ніж на осях X і Y. Це від того, що в місцевості, де я живу, магнітні лінії входять в поверхню Землі під кутом майже 60 градусів.

14-12-2015 13-14-34

Тобто, вертикальна складова більше, ніж горизонтальна. При нахилі магнітометра вертикальна складова викликає зміни показань по всіх осях магнітометра.

HMC5883L_error

Магнітометр HMC5883L + Гіроскоп MPU6050

Чи можемо ми компенсувати похибку, що спричиняється нахилом магнітометра, щоб він і при будь-яких положеннях міг показувати сторони світу правильно? І що для цього потрібно? Так! Для цього нам треба знати кути нахилу магнітометра відносно поверхні Землі по двох осях.

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

HMC5883L_sensors

Я встановив всі датчики на одну планку і доопрацював приклад, який тепер враховує нахили магнітометра. Для повороту вектора застосовуються матриці повороту. Для тих, хто буде копатися у коді, поворот вектора реалізований двома циклами. Але цей фрагмент програми можна спростити, як описано тут: http://www.germersogorb.de/html/kalibrierung_des_hcm5883l.html

Тепер магнітометр показує сторони світу правильно. Ось чому окремо магнітометр не зовсім правильно називати компасом. Тільки в комплексі з гіроскопом і акселерометром можна домогтися від нього прийнятних результатів. Дивись pygame_hmc5883_mpu6050.py

HMC5883L_OK

Для пом`якшення обертання стрілки компаса я використовував спеціально доопрацьований спрощений фільтр Калмана, який коректно спрацьовує при переході значень від + 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 Корисно знати Початківцям Схеми і прошивки
Коментарі:
вОЛОДИМИР говорить:
15.05.2023 09:05
Добрий день. Якщо можна, дайте посилання на Magneto, те, що в статті - недійсне. Дякую.

andre говорить:
15.05.2023 12:28
Дякую за зауваження. Посилання виправив. Актуальне: https://sites.google.com/view/sailboatinstruments1

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

Архіви