brujula-magnetica-con-arduino-compass-digital-hmc5883

Brújula magnética con Arduino y compass digital HMC5883

¿Qué es una brújula digital HMC5883?

Una brújula digital es un sensor que mide el valor del campo magnético en tres ejes. Con esta medición, es posible estimar la orientación del dispositivo respecto al campo magnético de la tierra.

El chip Honeywell HMC5883 es un chip de superficie que incorpora tres sensores de magnetoresistencia, cancelación de desfases, y conversores de 12 bits, lo que le proporciona una precisión de ±2ºC.

La comunicación con el chip Honeywell HMC5833 se realiza a través del bus I2C, por lo que es sencillo obtener los datos medidos. La tensión de alimentación es de bajo voltaje de 1.8 a 3.3V.

Frecuentemente se encuentran integrados en módulos como la GY-273 que incorporan la electrónica necesaria para conectarla de forma sencilla a un Arduino. En la mayoría de los módulos, esto incluye un regulador de voltaje que permite alimentar directamente a 5V.

Las brújulas magnéticas son dispositivos ampliamente empleados en el uso de sistemas de navegación en robots y otros vehículos, como rovers o cuadricópteros.

Sin embargo, la medición de estos sensores se ve afectada por la presencia de campos magnéticos y metales. Por tanto, para aplicaciones de navegación es necesario combinar estos sensores con acelerómetros y giroscopios, o IMU’s

Precio

La brújula digital Honeywell HMC5883 es un sensor realmente barato. Podemos encontrar placas que lo montan, como el modelo GY273, por 1,10€ en vendedores internacionales de Ebay y AliExpress.

arduino-brujula-hmc5883-gy273-esquema-componente

Esquema montaje

La conexión es sencilla, simplemente alimentamos el módulo desde Arduino mediante GND y 5V y conectamos el pin SDA y SCL de Arduino con los pines correspondientes del sensor.

arduino-brujula-hmc5883-gy273-conexion

Mientras que la conexión vista desde el lado de Arduino quedaría así.

arduino-brujula-hmc5883-gy273-conexion

En Arduino Uno, Nano y Mini Pro, SDA es el pin A4 y el SCK el pin A5. Para otros modelos de Arduino consultar el esquema patillaje correspondiente.

Verificar que vuestra placa es compatible con 5V antes de conectarla a Arduino. Si no, tendréis que usar un adaptador de nivel lógico.

Ejemplos de código

Para realizar la lectura del HMC5883 usaremos la librería desarrollada por Jeff Rowberg disponible en este enlace. También emplearemos la librería I2Cdev desarrollada por el mismo autor, que mejora la comunicación I2C.

La librería proporciona ejemplos de código, que resulta aconsejable revisar. Los siguientes ejemplos son modificaciones a partir de los disponibles en la librería

//GND - GND
//VCC - VCC
//SDA - Pin A4
//SCL - Pin A5

#include "Wire.h"
#include "I2Cdev.h"
#include "HMC5883L.h"

HMC5883L compass;

int16_t mx, my, mz;

void setup() 
{
    
    Serial.begin(9600);
    Wire.begin();
    compass.initialize();
}

void loop()
{
    //Obtener componentes del campo magnético
    compass.getHeading(&mx, &my, &mz);
    
    Serial.print("mx:");
    Serial.print(mx); 
    Serial.print("tmy:");
    Serial.print(my);
    Serial.print("tmz:");
    Serial.println(mz);
    delay(100);
}

Obtener la orientación respecto al norte

En este ejemplo empleamos la medición del campo magnético para determinar la orientación del sensor.

La orientación se obtiene en grados respecto al norte magnético. Sin embargo, el norte geográfico no está perfectamente alineado al norte magnético. Esto se denomina declinación, y depende del punto del globo donde estéis ubicados.

Por tanto, si queréis obtener la orientación respecto al norte geográfico deberéis introducir la declinación de vuestra posición. Existen varias páginas donde consultar este valor, como www.ign.es para ubicaciones dentro de España, o www.ngdc.noaa.gov para ubicaciones en todo el mundo.

//GND - GND
//VCC - VCC
//SDA - Pin A4
//SCL - Pin A5

#include "Wire.h"
#include "I2Cdev.h"
#include "HMC5883L.h"

HMC5883L compass;

int16_t mx, my, mz;

//declinacion en grados en tu posición
const float declinacion = 0.12; 

void setup()
{
    Serial.begin(9600);
    Wire.begin();
    compass .initialize();
}

void loop() {
    //Obtener componentes del campo magnético
    compass .getHeading(&mx, &my, &mz);

    //Calcular ángulo el ángulo del eje X respecto al norte
    float angulo = atan2(my, mx);
    angulo = angulo * RAD_TO_DEG;
    angulo = angulo - declinacion;
    
    if(angulo < 0) angulo = angulo + 360;
    
    Serial.print("N:");
    Serial.println(angulo,0);  
}

Descarga el código

Todo el código de esta entrada está disponible para su descarga en Github. github-full