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

Трехосевой магнитометр 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

Однако сверив полученные результаты с магнитным компасом, выясняется, что наш магнитометр показывает не совсем в нужном направлении. А если его вращать, то максимальный угол может не достигать 360 градусов на значительную величину.

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/site/sailboatinstruments1/home

Ошибка при наклонах

После калибровки показания магнитометра стали повторять показаниям магнитной стрелки компаса. См. 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 – гироскоп – акселерометр

Смотри также:
Translate
Архіви

© 2011-2017 Андрій Корягін, Кременчук - Київ, Україна