цифровая электроника
вычислительная техника
встраиваемые системы

 
» » » Как найти курсовой угол с использованием Raspberry Pi Pico и магнитометра MPU9250



Как найти курсовой угол с использованием Raspberry Pi Pico и магнитометра MPU9250

Автор: Mike(admin) от 5-04-2023, 03:55

Измеряем азимут с помощью MPU9250


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


Как найти курсовой угол с использованием Raspberry Pi Pico и магнитометра MPU9250

Курсовой угол или азимут можно определить, используя показания магнитометра с другими методами калибровки, чтобы точно оценить, в каком направлении находится северный полюс. Это может быть полезно для целей навигации. В рамках данного проекта мы покажем, как с помощью 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

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


Теперь подключите Raspberry Pi Pico и MPU9250 как показано на следующей схеме.


Как найти курсовой угол с использованием 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


Теги: Raspberry Pi Pico, магнитометр, MPU9250




Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий