Haga clic para más productos.
No se encontraron productos.

Tutorial Magnetómetro HMC5883L

41293

En este tutorial revisaremos las características de la brújula digital o magnetómetro HMC5883L, explicaremos la conexión y realizaremos ejemplos con Arduino.

EL HMC5883L es un magnetómetro de 3 ejes, con este podemos leer las componentes del campo magnético presente, de esta forma conociendo la dirección del campo magnético terrestre podemos calcular la orientación con respecto al norte magnético de la tierra, esto siempre y cuando nuestro sensor no este expuesto a algún campo magnético externo u algún objeto metálico que altere el campo magnético terrestre.

EL HMC5883L se encuentra comercialmente en módulos, los cuales facilitan su uso,  el modelo que usaremos para este tutorial es el que pueden encontrar en nuestra tienda:

Módulo Magnetómetro 3-ejes HMC5883L

El modulo trabaja con 3.3V, pero tiene un regulador interno por lo que se puede alimentar con 5V o con 3.3V en sus pines respectivos.

Su dirección I2C es 0x1E, dirección que no podemos cambiar, por esta razón no se puede conectar otro  HMC5883 en el buz I2C, pero si podemos conectar otros dispositivos que tengan dirección distinta.

Tiene dos modos de Funcionamiento, Modo Continuous-Measurement (continuo), en donde el magnetómetro está constantemente realizado mediciones y actualizando los registros x,y,z correspondientes a las lecturas. Y el modo Single-Measurement , aquí el magnetómetro solo realiza una medida cuando el Arduino le solicite.

 

Asimismo podemos configurar el rango de medición desde ±0.88Ga hasta ±8.1Ga a las que se le aplica ganancias de 1370 a 230 respectivamente y de esta forma tener un rango de salida de 12bits.



Librería para el HMC5883L

En este tutorial trabajaremos con la librería desarrollada por Jeff Rowberg, la librería se descargar en:

https://github.com/jrowberg/i2cdevlib/tree/master/Arduino/HMC5883L

Esta librería trabaja con una librería adicional para la comunicación I2C, esta también lo pueden encontrar en el mismo github de la libraría anterior:
https://github.com/jrowberg/i2cdevlib/tree/master/Arduino/I2Cdev

Estas librerías son del mismo desarrollador que las que usamos en el tutorial MPU6050, la librería I2Cdev es la misma  que usamos en dicho tutorial.

Para trabajar los siguientes ejercicios es necesario instalar las librerías en el IDE Arduino.


Conexiones entre HMC5883L y Arduino

Las conexiones son como cualquier conexión I2C:

HMC5883L

Arduino Uno, Nano, Mini.

Arduino Mega , DUE

Arduino Leonardo

  VCC

5V

5V

5V

  GND

GND

GND

GND

  SCL

A5

21

3

  SDA

A4

20

2

 Conexion HMC5883L y Arduino

Realizando lecturas del campo magnético:

En este ejemplo realizaremos las lecturas del HMC5883L, obtendremos los componentes en X,Y y Z del campo magnético.

El código para este ejemplo es el siguiente:

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

HMC5883L magnetometro;

int16_t mx, my, mz;
void setup() {
    
    Serial.begin(9600);
    Serial.println("Inicializando Magnetometro...");
    //Inicializamos la comunicación I2C y el magnetómetro
    Wire.begin();
    magnetometro.initialize();
}

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

Como se puede observar el programa es fácil de entender, podemos resumir la explicación a 3 partes  de código.

Primero es necesario incluir las librerías y declarar el objeto o variable para el magnetómetro:

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

HMC5883L magnetometro;

Posteriormente en setup() es necesario inicializar la comunicación I2C y el magnetómetro:

    Wire.begin();
    magnetometro.initialize();

Al inicializar el magnetómetro los valores por defecto para el rango es de ±1.3Ga y de ganancia 1090.

Posteriormente se realiza la lectura, esto se hace de la siguiente forma:

    magnetometro.getHeading(&mx, &my, &mz);

De esta forma tendremos los valores del campo magnético en las variables mx, my y mz, estos valores están con la ganancia mencionada anteriormente.

Posteriormente enviamos los valores por el puerto serie, esta última parte variará de acuerdo a su aplicación.

Lecturas HMC5883L

Nuevamente mencionamos que estos  valores están con ganancia, para tener el valor real hay que dividirlo entre 1090 (ganancia por defecto) y de esta forma obtener la medida en Gauss.

Si queremos modificar el rango y ganancia debemos agregar después de inicializar el magnetómetro la siguiente línea de código:

magnetómetro.setGain(value)

Donde value corresponde a:

Value

Rango

Ganancia (LSB/Gauss)

0

+/-  0.88 Ga

1370

1

+/- 1.3 Ga

1090  (Default)

2

+/- 1.9 Ga 

820

3

+/- 2.5 Ga 

660

4

+/- 4.0 Ga 

440

5

+/- 4.7 Ga 

390

6

+/- 5.6 Ga 

330

7

+/- 8.1 Ga 

230

 

De esta forma podemos establecer un nuevo rango de medición. El campo magnético terrestre dependiendo del lugar puede variar entre 0,25-0,65 Ga, teniendo en cuenta esto es mejor si solo vamos a medir el campo terrestre es mejor trabajar con el rango por defecto, si queremos mayor precisión podemos bajar el rango a 0.88Ga pero se podría saturar la lectura si existe un campo magnético externo.

Brújula digital con Arduino

En este ejemplo implementaremos una brújula, para esto necesitamos calcular el ángulo de nuestra orientación con respecto al Norte.
Para determinar el ángulo usamos la siguiente forma:

angulo magnetometro

Este ángulo nos determina la orientación del Norte Magnético,  pero existe una diferencia entre el norte geográfico y el norte magnético, a esta diferencia se le conoce como declinación magnética.

El valor de la declinación magnética depende de nuestra ubicación y lo pueden obtener en la siguiente página: http://www.magnetic-declination.com/ , en nuestro caso, para la ciudad de Trujillo-Perú es de -1°16´

El código en donde implementamos lo mencionado anteriormente es el siguiente:

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

HMC5883L magnetometro;

int16_t mx, my, mz;
float declinacion=-1.26; //declinación de -1°16'(Trujillo-Perú)
void setup() {
    
    Serial.begin(9600);
    
    Serial.println("Inicializando Magnetometro...");
    //Inicializamos la comunicación I2C y el magnetómetro
    Wire.begin();
    magnetometro.initialize();
}

void loop() {
    //Obtenemos del magnetómetro las componentes del campo magnético
    magnetometro.getHeading(&mx, &my, &mz);

    //Calculamos el ángulo del eje X con respecto al norte
    float angulo = atan2(my, mx);
    angulo=angulo*(180/M_PI);//convertimos de Radianes a grados
    angulo=angulo-declinacion; //corregimos la declinación magnética
    //Mostramos el angulo entre el eje X y el Norte
    Serial.print("AnguloX-N: ");
    Serial.print(angulo,0);

    //calculamos el ángulo equivalente de [-180 180] a [0 360]
    if(angulo<0) angulo=angulo+360;
    Serial.print("\tN");
    Serial.println(angulo,0);  
}

En la siguiente imagen mostramos el resultado cuando apuntamos el eje X en la dirección Norte

magnetometro angulo norte

Y la siguiente imagen es para cuando apuntamos el eje x al Oeste.

magnetometro angulo oeste

Estos valores serán correctos siempre y cuando no existan campos magnéticos externos, o metales cerca que interfieran con el campo magnético. Por ejemplo si acercamos nuestro magnetómetro a nuestra PC o acercamos un objeto metálico al magnetómetro, el valor del ángulo variara sin haber rotado el magnetómetro.

 

Productos relacionados
Últimas unidades en stock
S/ 50,00
Uno es la tarjeta de desarrollo más popular de la familia, basado en el microcontrolador ATmega328, ideal para iniciarse en el mundo de los microcontroladores. Tarjeta open-source compatible con Arduino, no es...
Vista rápida
Artículos relacionados
19 Comentarios
  • to*** ******

    to*** ****** 13/05/2019 Responder

    Arduino:1.6.12 (Windows 10), Tarjeta:"Arduino/Genuino Uno"

    C:UserstomasAppDataLocalTempuntitled1671924061.tmpsketch_may13csketch_may13c.ino: In function 'void setup()':

    sketch_may13c:14: error: 'class HMC5883L' has no member named 'initialize'

    magnetometro.initialize();

    ^

    exit status 1
    'class HMC5883L' has no member named 'initialize'

    como lo soluciono
    gracias
  • se****

    se**** 21/04/2019 Responder

    Arduino:1.8.9 (Windows 7), Tarjeta:"Arduino/Genuino Uno"

    In file included from C:ArchivosArduinoarduino-1.0.6librariesAdafruit_HMC5883_Unified-1.0.0examplesmagsensormagsensor.ino:1:0:

    C:UsersUsuarioDocumentsArduinolibrariesAdafruit_HMC5883_Unified-1.0.0/Adafruit_HMC5883_U.h:25:29: fatal error: Adafruit_Sensor.h: No such file or directory

    compilation terminated.

    exit status 1
    Error compilando para la tarjeta Arduino/Genuino Uno.

    Este informe podría contener más información con
    "Mostrar salida detallada durante la compilación"
    opción habilitada en Archivo -> Preferencias.

    me da este error, alguna idea del motivo?
  • da****

    da**** 09/08/2018 Responder

    no encuentro esa libreria por ningun lado
    I2Cdev.h, la puedes pasar?
  • Lu** ** ******te

    Lu** ** ******te 14/06/2018 Responder

    Al cargar estos sketch y hacer click en el icono
    "verificar-código" (antes de subirlo a la placa),
    ya me da el error:
    'class HMC5883L' has no member named 'initialize'

    Otros sketch de otros autores, dan el mismo error,
    Pensaba que era problema de la librería:
    "Arduino-HMC5883L-master" , pero la he actualizado
    varias veces y el problema continúa.

    Por otra parte, probando los ejemplos de la librería,
    se verifican bien y suben a la placa, pero al correr
    Arduino escribe en Puerto-Serie :
    Could not find a valid HMC5883L sensor, check wiring!

    Esto no es cierto, porque cuando escanéo el Bus-I2C
    dice: I2C device found at address 0x0D !
    Este segundo problema si podría ser del sensor.

    Pensé que mi módulo HMC5883L era defectuoso, o que
    yo lo había estropeado al soldar los pines, por eso
    compré otro (ahora tengo 2) y ambos hacen lo mismo.

    Muchas gracias por su amabilidad.
  • Ma******

    Ma****** 25/05/2018 Responder

    Saludos agrege las librerias y lo cargue al arduino el primer ejemplo me da mx=0 my=0 mz=0 hay algo que debe estar mal podria ser que al circuito electrico hay que agregarle dos resistencias de pull up a SDA y SCL
    • En******

      En****** 29/09/2019 Responder

      Tengo el mismo problema, ¿saben como resolverlo?
  • Ri***** ****** *****es

    Ri***** ****** *****es 17/05/2018 Responder

    Saludos, ya he compilado el programa y solo me da ceros en las lecturas y cuando inserto el comando de modificación de ganancia pero me marca error, me puedes orientar que hacer en este caso, gracias
    • an******

      an****** 31/10/2018 Responder

      ¿como descargo las libreria?
  • Wi******

    Wi****** 25/01/2018 Responder

    Cuando pones Ga te refieres a Gauss?
    • Ma****

      Ma**** 29/08/2018 Responder

      No, la "Ga" se refiere a los Gales medida en honor a Galileo y es la usada para medir los cambios en la gravedad en la Geofísica equivale a 9.81 m/s^2 = a 981gal
  • Ra****

    Ra**** 10/01/2018 Responder

    Me gustaria ponerlo en mi telescopio para poder saber con exactitud la altitud y el acimut. Con respecto al acimut he visto que si es posible, pero que hay con respecto a la altitud? Es decir, a los grados de inclinacion que tenga el telescopio.
  • Se******* **ga

    Se******* **ga 14/10/2017 Responder

    Hola podria haber algún problema con el modelo del magnetrometro el mio es el GY-273 y cuando pongo el código para realizar las lecturas en xyz me da 0 en las tres...
    • En******

      En****** 29/09/2019 Responder

      Tengo el mismo problema con el gy 273, ¿Lograste solucionarlo? te agradeceria si puedes compartir la información
  • ja****

    ja**** 30/04/2017 Responder

    buenas, muy buen tutorial, llevo un tiempo usando esta brújula y me ha dado muy buen resultado, pero me surje un problema, que dudo qeu pueda ser solucionado, estoy haciendo un coche por gps, el caso es que lo pruebo en mi terraza y, al pasar por los mismos puntos, la brújula comienza a dar orientaciones erróneas y el coche empieza a girar sobre sí mismo.
    doy por hecho, al ser siempre los mismos putnos, que por ahí hay forjado o tuberías. el caso es que, aunque lo indiques claramente más arriba, ¿podrá evitarse esta interferencia?
    • Na*****

      Na***** 04/05/2017 Responder

      Hola Javier, efectivamente, cualquier campo magetico afectara al sensor. Lo que puedes hacer es intentar graficar como es el comportamiento del campo magnetico en dicha zona, posiblemente sea una campo magentico osilante provocado por un cable AC, de ser el caso podrias aplicar un filtro para eliminar dicho ruido, ten en cuenta que el campo magnetico es consatante y las lecturas cambian cunado la brujula gira, si estos giros no son muy rapidos, cun un de promedio de lecturas podrias elimiar parte de los ruidos.
  • Fe****

    Fe**** 31/01/2017 Responder

    Hola. Gracias por el tutorial, está excelente.
    Solo tengo una pregunta: ¿de dónde sacas ese dato de declinación magnética para Trujillo de 7°2'? Al acceder a la página que pones, me aparece:
    Trujillo: Latitud: 8°7' S, Longitud: 79°1'60'' W. Declinación magnética: -1°16'.
    • Na*****

      Na***** 01/02/2017 Responder

      Hola Felipe, Gracias por la observación, efectivamente hubo un error, la declinación debería ser -1°16', estaremos corrigiendo. Saludos
  • el***

    el*** 01/11/2016 Responder

    amigo buena colaboracion ,,, solo quisiera que agregues como descargar esas librerias que no puedo
    • Na*****

      Na***** 05/11/2016 Responder

      Hola Elser, tienes que ir al directorio principal y descargar la carpeta principal, después ya en tu PC importas solo las librerías mencionadas.
Dejar un comentario
Deja su comentario

Menú

Ajustes

Crear una cuenta gratuita para usar listas de deseos.

Registrarse