Magnetómetro Brújula con Raspberry PI Pico: cableado GY-271 HMC5883L y uso con MicroPython

Muchos proyectos (como los robóticos) necesitan obtener información sobre la posición y la dirección espacial. En este sentido, uno de los dispositivos más útiles para proyectos que involucran Raspberry PI Pico es una brújula magnetométrica HMC5883L.

En este tutorial, le mostraré cómo cablear, calibrar (ejes X / Y) y usar un dispositivo HMC5883L, también conocido como magnetómetro, con Raspberry PI Pico usando MicroPython.

Si desea profundizar en las brújulas, como la que vamos a configurar, puede consultar la guía de Outdoorsgenerations.com sobre cómo usar una brújula: es una excelente guía que explica cómo usar esta herramienta y también explica algunos conceptos como la declinación magnética. con la diferencia entre el norte verdadero y el norte magnético que vamos a manejar con HMC5883OL.

Características principales de HMC5883L

Este módulo no es nuevo en el mercado y es uno de los más utilizados. Antes de profundizar en los detalles, tenga en cuenta que el mercado también está lleno del módulo QMC5883L. Por lo que sé, esto debería hacer el mismo trabajo pero tiene una lógica de hardware diferente, por lo que requiere un código diferente (y el código de esta guía difícilmente funcionará para QMC5883L).

El HMC5883L es un módulo multichip capaz de medir la detección magnética. Puede comunicarse con una interfaz digital I2C con otros dispositivos para permitir la creación de aplicaciones como brújulas de bajo costo, que se utilizan en muchos campos electrónicos como teléfonos móviles, netbooks, electrónica de consumo, sistemas de navegación para automóviles y dispositivos de navegación personal.

El módulo funciona con una fuente de alimentación de bajo voltaje (de 2,16 a 3,6 V) y también tiene un bajo consumo de energía (100 μA).

HMC5883L tiene una precisión de rumbo de 1° a 2° grados, que es suficiente para una gran cantidad de aplicaciones. También permite configurar su ganancia interna para aumentar la resolución con un registro de control de ganancia de 3 bits. Pero aumentar la ganancia también aumenta los efectos de ruido.

El pinout HMC5883L tiene 5 PIN:

  • Vcc -> PIN positivo común para fuente de alimentación, va al PIN de 3,3V de Raspberry PI Pico
  • GND -> pin de tierra común, va a uno de los PIN GND de Raspberry PI Pico
  • SCL -> Pin de reloj serie para comunicación I2C
  • SDA -> Pin de datos Seria para comunicación I2C
  • DRDY -> Datos listos, Pin de interrupción. Es un PIN que advierte al dispositivo maestro cuando los datos están listos en los registros para ser leídos. Es opcional y tanto la comunicación como las lecturas también funcionan sin utilizar este PIN.

Más detalles sobre el chip HMC5883L están disponibles en el archivo pdf de la hoja de datos HMC5883L_3-Axis_Digital_Compass_IC disponible en las páginas de Adafruit.

Finalmente, el módulo GY-271 HMC5883L requiere calibración para obtener los valores correctos para el uso de la aplicación. Este tutorial también incluye un código para calibrar tu brújula y simplificarlo.

Tenga en cuenta que este tutorial está destinado a la placa de microcontrolador Raspberry PI Pico, ya que las otras placas Raspberry PI son computadoras (que requieren una codificación diferente).

Lo que necesitamos

Como de costumbre, sugiero agregar desde ahora a su carrito de compras de comercio electrónico favorito todo el hardware necesario, para que al final pueda evaluar los costos generales y decidir si continúa con el proyecto o los elimina del carrito de compras. Entonces, el hardware será solo:

Consulta precios de hardware en los siguientes enlaces:

Procedimiento paso a paso

Preparar cableado

Organice el cableado de acuerdo con el siguiente diagrama, de acuerdo con el pinout de Raspberry PI Pico:

Además, a continuación encontrará algunas imágenes de mi pequeño laboratorio:

Obtener códigos de MicroPython

Comience a preparar el firmware de su Raspberry PI Pico de acuerdo con mi tutorial Primeros pasos con Raspberry PI Pico para principiantes.

Para que HMC5883L funcione con MicroPython, necesitará una copia de la siguiente biblioteca:

Esta es la biblioteca principal, bifurcada de la biblioteca Gvalkov esp8266 MicroPython para hmc5883l.

Además, necesitará los siguientes 2 códigos MicroPython:

Copie los 3 archivos en su carpeta raíz de Raspberry PI Pico, de modo que tenga los siguientes archivos:

Establezca la declinación de su ubicación

Antes de comenzar, necesitamos realizar un seguimiento en nuestra biblioteca sobre la Declinación.

La declinación magnética, o variación magnética, es el ángulo en el plano horizontal entre el norte magnético (la dirección en la que apunta el extremo norte de la aguja de una brújula magnetizada, que corresponde a la dirección de las líneas del campo magnético de la Tierra) y el norte verdadero (la dirección a lo largo de un meridiano hacia el Polo Norte geográfico). Este ángulo varía según la posición en la superficie de la Tierra y cambia con el tiempo.

árbitro. https://en.wikipedia.org/wiki/Magnetic_declination

Entonces, para mantener nuestra brújula apuntando al norte geográfico, debemos agregar una corrección que administre la diferencia entre los 2 nortes y dependa de nuestra ubicación. Para obtener esto, que se compone de 2 valores (declinación e inclinación), utilice el servicio en línea gratuito disponible en https://www.magnetic-declination.com/, apúntelo en su posición y mantenga sus grados. La siguiente imagen muestra cuáles son mis resultados para mi posición (Roma):

Ponga solo la parte entera de esos valores (que son 3 y 58 en mi caso). Abra el archivo hmc5883l.py e identifique la siguiente parte del código:

def __init__(self, scl=15, sda=14, address=0x1e, gauss='1.9', declination=(0, 0)):

cambie la declinación para que mantenga su posición delta. En mi caso, esto se convierte en:

def __init__(self, scl=15, sda=14, address=0x1e, gauss='1.9', declination=(3, 58)):

Guardar estos cambios

Calibre el módulo HMC5883L

Una fase muy importante del uso de nuestro módulo con Raspberry PI Pico es la calibración. Sin calibración, obtendrá valores inútiles y sus aplicaciones simplemente apuntarán en la dirección equivocada. La calibración debe realizarse solo la primera vez, luego la compensación funcionará para los siguientes usos.

Mi solución de calibración utiliza los cálculos matemáticos de https://titanwolf.org/Network/Articles/Article?AID=c0917d61-9449-491f-8725-5e83bd8e3b80. Hay que decir que calibra solo los valores X e Y, por lo que obtiene resultados correctos cuando la brújula girará solo en un plano horizontal. Si alguien desea ayudar a mejorar estas matemáticas de calibración, hágamelo saber para que pueda mejorar el código que también incluye el eje Z.

Volviendo a nosotros, escribí un script simple que registra los valores de los ejes X e Y para el alcance, manteniendo sus valores mínimo y máximo que definirán las correcciones de compensación que se aplicarán en hmc5883l.py.

Para ejecutar la calibración, coloque su módulo HMC5883L en una superficie plana horizontal para que pueda girarlo fácilmente 360 ​​grados.

Entonces, desde Thonny ejecute el código HMC5882Lcalibration.py. Durante la ejecución, comenzará a ver medidas magnéticas del módulo HMC5883L, con valores mínimos y máximos para los ejes X e Y. Gire lentamente el HMC5883L con su protoboard para realizar al menos una vuelta completa de 360 ​​grados. Cuantas más rondas hagas, mejores resultados obtendrás. Además, intente moverse lentamente, especialmente en los puntos cercanos a los valores mínimo y máximo de X e Y. Una vez hecho esto, haga clic en el área del caparazón de Thonny y presione CTRL+C.

A diferencia del botón «Detener» de Thonny, CTRL+C generará una señal de interrupción que activará los cálculos finales en el script, al obtener un resultado como el siguiente:

... ... X: 437.9800, Y: -453.8400, Z: -581.9400, Heading: 317° 57′  Xmin=8.54; Xmax=462.38; Ymin=-572.18; Ymax=-148.84 X: 434.3200, Y: -456.2800, Z: -577.0600, Heading: 317° 33′  Xmin=8.54; Xmax=462.38; Ymin=-572.18; Ymax=-148.84 X: 434.3200, Y: -452.6200, Z: -583.1600, Heading: 317° 47′  Xmin=8.54; Xmax=462.38; Ymin=-572.18; Ymax=-148.84 X: 434.3200, Y: -451.4000, Z: -584.3800, Heading: 317° 52′  Xmin=8.54; Xmax=462.38; Ymin=-572.18; Ymax=-148.84  Got ctrl-c Calibration corrections: xs=1 xb=-235.46 ys=1.072046 yb=360.51

En mi caso, obtengo los siguientes parámetros al final:

  • x = 1
  • xb = -235,46
  • ys = 1.072046
  • yb = 360.51

Vuelva a abrir el archivo hmc5883l.py y, esta vez, identifique la siguiente parte del código:

# Correction to be set after calibration xs=1 ys=1 xb=0 yb=0

Cambie también estos parámetros con el número que obtiene en la prueba de calibración. En mi caso, estos se convierten en:

# Correction to be set after calibration xs=1 ys=1.072046 xb=-235.46 yb=360.51

Ejecute el código picoHMC5883L.py

En este punto, puede descartar el script de calibración y usar el código picoHMC5883L.py junto con la biblioteca hmc5883l.py.

Solo tienes que ejecutarlo desde Thonny y obtendrás un resultado similar al siguiente:

MicroPython v1.17 on 2021-09-02; Raspberry Pi Pico with RP2040  Type "help()" for more information. >>> %Run -c €EDITOR_CONTENT X: 218.3800, Y: -25.3194, Z: -639.2800, Heading: 357° 21′  X: 220.8200, Y: -26.6273, Z: -638.0600, Heading: 357° 5′  X: 217.1600, Y: -27.9351, Z: -638.0600, Heading: 356° 38′  X: 209.8400, Y: -50.1694, Z: -639.2800, Heading: 350° 31′  X: 209.8400, Y: -42.3220, Z: -640.5000, Heading: 352° 34′  X: 211.0600, Y: -48.8615, Z: -634.4000, Heading: 350° 56′  X: 209.8400, Y: -46.2457, Z: -636.8400, Heading: 351° 32′  X: 218.3800, Y: -50.1694, Z: -638.0600, Heading: 351° 2′  X: 213.5000, Y: -47.5536, Z: -638.0600, Heading: 351° 25′  X: 215.9400, Y: -46.2457, Z: -639.2800, Heading: 351° 53′  X: 218.3800, Y: -58.0168, Z: -638.0600, Heading: 349° 5′  X: 220.8200, Y: -59.3246, Z: -639.2800, Heading: 348° 56′  X: 220.8200, Y: -61.9405, Z: -638.0600, Heading: 348° 18′  X: 218.3800, Y: -58.0168, Z: -639.2800, Heading: 349° 5′  X: 215.9400, Y: -50.1694, Z: -638.0600, Heading: 350° 53′

El valor de Rumbo mostrará los grados para referirse al Norte. A medida que gira el módulo alrededor del mismo plano horizontal, obtendrá el valor del ángulo.

Conclusiones finales

Como se dijo en este tutorial, el proceso de calibración involucra solo los ejes X e Y. Entonces, cualquier ayuda sobre cómo involucrar matemáticamente también el eje Z es realmente bienvenida y actualizaré el código. De todos modos, para mediciones de planos horizontales, funcionará brindándole un ángulo confiable.