Guia completa per utilitzar l'HMC5883L amb Arduino

  • Connexió de l'HMC5883L amb Arduino mitjançant comunicació I2C.
  • Codi per llegir els eixos X, Y, Z del camp magnètic.
  • Crear una brúixola digital ajustant la declinació magnètica.

codi hmc5883l arduino-3

El magnetòmetre HMC5883L és un sensor àmpliament utilitzat en projectes d'Arduino per la seva capacitat per mesurar camps magnètics en tres eixos. Això ho converteix en una excel·lent opció per a la creació de brúixoles digitals, sistemes de navegació per a drones i altres vehicles autònoms. A més de ser assequible, la seva integració és senzilla gràcies a la seva interfície I2C, cosa que el fa ideal per a principiants.

En aquest article aprofundirem en les característiques principals de l'HMC5883L, la seva connexió amb diverses plaques d'Arduino i exemples pràctics per al seu ús. Al final, podreu implementar el vostre propi projecte de brúixola digital amb Arduino, aprofitant tot el potencial d'aquest potent sensor.

Què és l'HMC5883L i com funciona?

L'HMC5883L és un magnetòmetre de tres eixos que mesura les components del camp magnètic terrestre als eixos X, Y i Z. Això no només permet detectar la presència de camps magnètics, sinó que també permet determinar l'orientació mitjançant càlculs basats en els mesuraments obtinguts. Aquestes característiques el converteixen en el sensor ideal per fer sistemes dorientació, com una brúixola digital.

El sensor se sol trobar en mòduls com el model GY-273 que, a més, inclou l'electrònica necessària per facilitar-ne la connexió directa amb plaques Arduino o altres microcontroladors. La seva alimentació és flexible, podent ser alimentat tant amb 3.3V com amb 5V, cosa que ho fa molt versàtil en termes de compatibilitat amb diferents sistemes.

Connexions amb Arduino

La connexió de l'HMC5883L amb Arduino és realment senzilla gràcies a la interfície I2C que empra. Aquesta comunicació només requereix dues pins: SDA i SCL, que han de connectar-se als pins corresponents a la placa Arduino.

  • Per a Arduino Uno, Nano i Mini: SDA es connecta al pin A4 i SCL a l'A5.
  • Si utilitzeu un Arduino Mega o Due: SDA ha de connectar-se al pin 20 i SCL al pin 21.
  • En el cas de l'Arduino Leonardo: SDA va al pin 2 i SCL al pin 3.

No oblidem que el magnetòmetre treballa amb una adreça I2C fixa de 0x1E, per la qual cosa no és possible canviar-la. Aquesta adreça és única per a aquest tipus de sensor, cosa que significa que no podem connectar múltiples dispositius HMC5883L en un mateix bus I2C.

Lectura del Camp Magnètic

El mètode principal d'operació de l'HMC5883L és la lectura dels valors del camp magnètic als tres eixos. Per obtenir aquests valors en un Arduino, fem servir una llibreria desenvolupada per Jeff Rowberg. Pots trobar aquesta llibreria a seu repositori de GitHub i descarregar-la per al seu ús a l'IDE d'Arduino.

Un cop instal·lada la llibreria, es pot inicialitzar el sensor i començar a llegir els valors del camp magnètic. A continuació, es mostra un exemple simple en què es fa precisament això:

#include "Wire.h"
#include "I2Cdev.h"
#include "HMC5883L.h"
HMC5883L magnetometro;
int16_t mx, my, mz;

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

void loop(){
magnetometro.getHeading(&mx, &my, &mz);
Serial.print("mx: "); Serial.print(mx);
Serial.print(" my: "); Serial.print(my);
Serial.print(" mz: "); Serial.println(mz);
delay(100);
}

En aquest codi, s'inicialitza el magnetòmetre i es llegeix en bucle els valors als tres eixos. Cada vegada que executem el `loop()`, es mostrarà al monitor serial els valors del camp magnètic en X, Y i Z.

Configuració del rang i guany

El HMC5883L permet ajustar el rang de mesura del camp magnètic entre ±0.88 Gauss i ±8.1 Gauss amb diferents nivells de guany. El rang predeterminat és de ±1.3 Gauss, i el pots modificar per adaptar-lo a les necessitats del teu projecte. Això es pot fer utilitzant la següent línia dins del codi:

magnetometro.setGain(value);

on valor és un nombre enter entre 0 i 7, que seleccionarà el nivell de guany. A continuació us mostrem una taula amb els valors corresponents:

Valor Rang Guany (LSB/Gauss)
0 ±0.88 Ga 1370
1 ±1.3 Ga 1090
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

Construint una brúixola digital

Un dels usos més comuns de l'HMC5883L és la construcció d'una brúixola digital. Per això, necessitem calcular l'angle entre el sensor i el Nord magnètic utilitzant les lectures dels eixos X i Y. Això s'aconsegueix mitjançant la fórmula:

float angulo = atan2(my, mx) * 180 / M_PI;

Aquest valor us donarà l'angle d'orientació respecte al Nord magnètic. Per ajustar aquest angle al Nord geogràfic, hauràs de tenir en compte la declinació magnètica de la teva ubicació, que pots consultar a diferents pàgines web com www.ign.es o www.ngdc.noaa.gov.

Corregir la declinació magnètica

Quan tinguis la declinació magnètica de la teva posició, només has de restar-la de l'angle obtingut. Per exemple:

angulo -= declinacion;

Quan l'angle és negatiu, li pots sumar 360 graus per obtenir sempre un valor positiu ajustat entre 0 i 360 graus:

if (angulo < 0) angulo += 360;

Aquest ajustament us proporcionarà una brúixola que sempre apuntarà cap al Nord geogràfic de forma precisa.

A la pràctica, amb aquest sensor i algunes llibreries pots tenir una brúixola en pocs minuts. No obstant això, tingues en compte que l'HMC5883L és un sensor sensible a interferències externes, com ara metalls propers o camps generats per corrents elevats, cosa que pot alterar les lectures.