Измеряем азимут с помощью MPU9250
MPU9250 – это компактное и универсальное устройство отслеживания движения, которое сочетает в себе 3-осевой акселерометр, 3-осевой гироскоп и 3-осевой магнитометр. Его бортовой магнитометр можно использовать для оценки «курсового» угла. Курсовой угол, также известный как азимут, относится к направлению, в котором объект или человек указывает или смотрит относительно опорного направления, обычно на север. Обычно он измеряется в градусах, где 0 градусов указывает направление, указывающее на истинный север, а 90 градусов, 180 градусов и 270 градусов указывают на восток, юг и запад соответственно.

Курсовой угол или азимут можно определить, используя показания магнитометра с другими методами калибровки, чтобы точно оценить, в каком направлении находится северный полюс. Это может быть полезно для целей навигации. В рамках данного проекта мы покажем, как с помощью Raspberry Pi Pico и MPU9250 получить такое значение, которое можно преобразовать в направление (север, юг, восток, запад и т. д.).
Поскольку мы живем в эпоху, когда мы окружены магнитным материалом и магнитными полями, создаваемыми окружающей нас электроникой, такой как наш телефон и ноутбук, мы должны иметь возможность устранить колебания, которые эти переменные могут вызвать в нашем эксперименте. Из нашего окружения есть в основном два смещения, которые мы должны учитывать при калибровке, а именно смещения жесткого и мягкого железа.
Смещение твердого железа относится к типу систематической ошибки, вызванной наличием фиксированного магнитного поля, такого как магнитное поле Земли или близлежащие ферромагнитные материалы, которые могут искажать показания магнитометра. Смещение твердого железа можно скорректировать, вычитая фиксированное значение смещения из показаний магнитометра, которое можно определить путем калибровки датчика в условиях известного магнитного поля.
Смещение мягкого железа, с другой стороны, вызвано наличием неоднородного магнитного поля, например, искажением магнитного поля Земли близлежащими объектами или материалами. Смещение мягкого железа может привести к тому, что показания магнитометра будут смещены в сторону определенного направления или оси. Смещение мягкого железа можно скорректировать с помощью процесса калибровки, который включает вращение датчика в трехмерном пространстве и сбор данных магнитометра, которые можно использовать для расчета значений коррекции, которые можно применить к показаниям магнитометра для компенсации неоднородного магнитного поля. В нашем коде MicroPython мы будем использовать библиотеку MPU9250, в которой есть функция калибровки, учитывающая оба смещения.
Несмотря на калибровку, мы все еще можем получить внезапные колебания, то есть случайные всплески магнитных показаний в нашем магнитометре. Мы не хотим, чтобы внезапные колебания удержали нас от сигнала, который мы пытаемся найти, то есть от магнитного поля Земли. Чтобы справиться с пиками бесполезных данных, мы можем реализовать фильтр нижних частот в паре строк кода, показанных здесь:
def low_pass_filter(prev_value, new_value):
return 0.85 * prev_value + 0.15 * new_value
Вы можете видеть, что веса в фильтре в сумме составляют 1 (0,85 + 0,15), так и должно быть. Предпосылка фильтра заключается в том, что мы по существу доверяем предыдущему значению больше, чем новому значению. Используя этот подход к показаниям датчика, мы можем устранить или уменьшить этот шум и улучшить общее качество измерения сигнала.

Вы можете видеть красным цветом, что необработанное нефильтрованное значение ускорения подвержено внезапным изменениям, в то время как отфильтрованный сигнал синего цвета гораздо более стабилен. Хотя это вносит смещение в наши измерения, это нормально, потому что сигнал всегда сходится к истинному сигналу в течение определенного периода времени, если стимул постоянен. Это фильтр, который мы будем применять к показаниям нашего магнитометра, чтобы получить более точную оценку угла курса.
Теперь подключите Raspberry Pi Pico и MPU9250 как показано на следующей схеме.

По ссылке github.com/kevinmcaleer/mpu9250 загрузите следующие библиотеки: MPU9250, ak8963, MPU6500. После сохранения данных библиотек вы можете использовать следующий пример кода, чтобы начать получать показания.
from machine import I2C, Pin
import math
import utime
from mpu9250 import MPU9250
i2c = I2C(0, sda=Pin(0), scl=Pin(1), freq=400000)
sensor = MPU9250(i2c)
filtered_magx, filtered_magy = 0, 0
DECLINATION = -1 * 3.19
# Want to thank Kevin McAleer
def low_pass_filter(prev_value, new_value):
return 0.85 * prev_value + 0.15 * new_value
def compass(angle):
if angle > 337 or angle <= 22:
direction = 'North'
elif angle > 22 and angle <= 67:
direction = 'North East'
elif angle > 67 and angle <= 112:
direction = "East"
elif angle > 112 and angle <= 157:
direction = "South East"
elif angle > 157 and angle <= 202:
direction = "South"
elif angle > 202 and angle <= 247:
direction = "South West"
elif angle > 247 and angle <= 292:
direction = "West"
elif angle > 292 and angle <= 337:
direction = "North West"
return direction
sensor.ak8963.calibrate()
while True:
# We do not need the z value
magx_new, magy_new, _ = sensor.magnetic
filtered_magx = low_pass_filter(filtered_magx, magx_new)
filtered_magy = low_pass_filter(filtered_magy, magy_new)
heading_angle_in_degrees = math.atan2(filtered_magx, filtered_magy) * (180 / math.pi)
heading_angle_in_degrees_plus_declination = heading_angle_in_degrees + DECLINATION
if heading_angle_in_degrees_plus_declination < 0:
heading_angle_in_degrees += 360
heading_angle_in_degrees_plus_declination += 360
print('###Without Declination###')
print(heading_angle_in_degrees)
print(compass(heading_angle_in_degrees))
print('###Plus Declination###')
print(heading_angle_in_degrees_plus_declination)
print(compass(heading_angle_in_degrees_plus_declination))
utime.sleep_ms(100)
Главное в этом коде – калибровка, которая вам понадобится для того, чтобы акселерометр находился на ровной горизонтальной поверхности. После начала калибровки обязательно переместите акселерометр в форме восьмерки. Еще одним важным моментом является понятие склонения. Что потребуется для расчета направления на истинный северный полюс, а не на магнитный северный полюс. Вы можете найти свой угол склонения, выполнив поиск своего местоположения в Интернете. Склонение у всех может сильно различаться в зависимости от того, в какой области Земли вы находитесь, поэтому обязательно измените его в коде. Если вы все сделали точно, вы получите результаты наравне с приложением компаса на iPhone или другими приложениями.
© digitrode.ru