Магнитометр 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 и вычислим угол, который и будет углом отклонения от направления на север.Однако сверив полученные результаты с магнитным компасом, выясняется, что наш магнитометр показывает не совсем в нужном направлении. А если его вращать, то максимальный угол может не достигать 360 градусов на значительную величину.
Магнитометр нужно обязательно калибровать! Без калибровки его показания очень не точны.
Калибровка 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 — ШИМ и Сервопривод
- Raspberry Pi — DHT11
- Raspberry Pi - FM Transmitter
- Прошивка AVR микроконтроллеров с помощью Raspberry Pi
- Raspberry Pi — LCD дисплей 1602
- Raspberry Pi — Wi-Fi
- 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 без клавиатуры и монитора
- ИК-дистанционное управление. Использование LIRC в Python
- Raspberry Pi. Raspbian. Отправка почты через аккаунт Gmail
- Neoway M590 – GSM/GPRS modem
- MPU-6050 – гироскоп – акселерометр
- HMC5883L Магнитометер
- PWM контролер на базе микросхемы PCA9685
- Метеостанция на Raspberry Pi своими руками
- Raspberry Pi. Live-stream video
바카라사이트 bookmarked!!, I really like your web site!바카라사이트
Спасибо за статью и первичное раскрытие вопроса. Погрузился, в результате нашёл отличный материал со сравнением датчиков и объяснением теоретической части про sensor fusion (скрещивание данных гиро и компаса) - https://github.com/kriswiner/MPU6050/wiki/Affordable-9-DoF-Sensor-Fusion Тут - пример кода, задействующего оба датчика: https://github.com/kriswiner/MPU6050HMC5883AHRS Автор подробно рассказывает об отличии чистки данных фильтром Калмана и более быстрыми для куриных мозгов Ардуин алгоритмами (Mahony, Madgwick).
Недавні записи
- Своя бібліотека для векторного керування безколекторними моторами
- 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
Архіви