¿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

ESQUEMA DE 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.

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.

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

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.

En Arduino Uno, Nano y Mini Pro, SDA es el pin A4 y el SCK el pin A5.

Verificar que la placa sea compatible con 5V antes de conectarla a Arduino. Si no, tendrás que usar un adaptador de nivel lógico.

Código de ejemplo

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 esten ubicados.

Por tanto, si querés obtener la orientación respecto al norte geográfico debés introducir la declinación de tu posición. Existen varias páginas donde consultar este valor, por ejemplo: www.ngdc.noaa.gov

  
//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);  
}