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


arduino-brujula-hmc5883-gy273

¿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.

Anuncio:

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-esquema

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);  
}
Si te ha gustado esta entrada y quieres leer más sobre Arduino puedes consultar la seccióntutoriales de Arduino

Descarga el código

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



5 4 votes
Article Rating

Anuncio:

Previous Medir presión del aire y altitud con Arduino y barómetro BMP180
Next Usar un acelerómetro ADXL345 con Arduino
13 Comments
oldest
newest
Inline Feedbacks
View all comments
Osvaldo
4 years ago

Buenas noches ante todo muy buena la info. Por otra parte ya probe con dos sensores, distintos pensando que no andaban, y me sigue marcando “0”. Que prueba puedo hacer para ver que problema tengo
Desde ya muchas gracias

Adrian
4 years ago
Reply to  Osvaldo

Hola! Probablemente te esté pasando lo mismo que me ha pasado a mí, el chip del módulo es un QMC5883L, en lugar del HMC5883L. Hay bastante escrito por ahí. En mi caso, terminé concluyendo que la dirección I2C que estaba hardcodeada en la libreria no se correspondia con la que tenía que ser… ahora la he hecho andar, pero de ahí a entender que son todos esos números que me da, es otro cantar.
Saludos

Luis J.
4 years ago
Reply to  Adrian

Hola , Osvaldo y Adrian: Yo también tengo un problema con el HMC5883L : En todos los sketch, al compilar, me da el mensaje: ‘class HMC5883L’ has no member named ‘initialize’ Yo también pensé que mi HMC5883L estaba averiado, ya he comprado varios sensores con el mismo resultado. También pensé que era por la dirección I2C, pero ese mensaje lo da al compilar el sketch, antes de intentar comunicar con la tarjeta. Creo que lo que dice el mensaje es que no reconoce el comando “initialize” Ye he cargado varias veces la librería (por si estaba mal) e incluso he… Read more »

Luis J.
4 years ago
Reply to  Luis

Hola Luis. Como ya te comenté, en todos los sketch, al compilar, me daba el mensaje: ‘class HMC5883L’ has no member named ‘initialize’ y eso a pesar de haber cargado varias veces la librería e incluso reinstalando el IDE-Arduino. Recientemente me entró un virus en el ordenador. Lo he tenido que formatear, y reinstalar todo. Curiosamente, ahora ya no me da ese mensaje, pero el módulo HMC5883L sigue sin funcionar. Parece que no se inicializa. No hace falta decir que he comprobado las conexiones. He pensado que podría ser de la dirección I2C. Cuando la escanéo, me dice que mi… Read more »

Raul
4 years ago

Hola Luis, gracias por el tutorial, funciona perfecto. Aunque no se en que unidades me entrega compass.getHeading(&mx, &my, &mz);, necesito pasarlos a microTeslas. gracias

Antonio
3 years ago

Hola Luis, muy bueno todo tu trabajo que me ha ayudado muchisimo.
Pero estoy teniendo problemas con el HMC5883, he seguido tu tutorial al pie de la letra (salvo error por mi parte, pero he revisado todo) y los datos que me devuelven siempre son los mismos.

Con el primer ejemplo de codigo: mx:0tmy:0tmz:0
Con el segundo ejemplo: N:360

Continuamente aunque cambie la orientación.

Cual podría ser el problema?

Muchas gracias por adelantado

Elizabeth
3 years ago

buenas noches estoy realizando un proyecto en navegacion para realizar giros tanto izquierda como para derecha estoy utilizando un mpu, el caso del magnometro sera mas recomendable??

Chema Mateos
2 years ago

Tengo un problema, y es que la inclinación en cualquier eje me varía la lectura; y cómo lo quiero para un velero no me sirve.
Sabéis si esto se puede solucionar?
Gracias anticipadas.

Chema Mateos
2 years ago
Reply to  Luis

Muchas gracias, Luis. Da gusto contigo.

Juliana Schujman
2 years ago

Probé con este ejemplo, agregándole las resistencias de pull up. Me tira 0 en los 3 valores. Alguien me podría ayudar? Desde ya muchas gracias. Saludos

Albert
1 year ago

Buenos días, estoy realizando un proyecto de un tripmaster para la moto, estoy usando este modulo para saber el rumbo a llevar. Mi duda es si tengo que instalarlo de alguna manera para que el sepa donde esta el N y después calcular el rumbo que llevo o el mismo chip se situa y siempre da el rumbo correcto respecto al norte. No se si me he explicado bien o se entiende mi idea. un saludo
enhorabuena por los tutoriales!