.
Composants utilisés
- 1 carte Arduino UNO
- 1 Capteur de champ magnétique HMC5883L,
- Fils de branchement Dupont mâle / femelle
Principe de fonctionnement
Ce module GY-273 est basé sur le capteur HMC5883L d'Honeywell.
Il mesure de faibles champs magnétiques, avec une interface numérique.
On l'utilise pour la magnétométrie, la réalisation de boussoles électroniques, pour orienter un robot mobile, un bateau, un avion RC...
Caractéristiques
Ce module inclut un capteur électromagnétique magnéto-résistif de dernière génération HMC118X à haute sensibilité, un amplificateur, une annulation de décalage d'offset.
Le technologie AMR (Anisotropic Magnetoresistive) offre une réponse linéaire, et 3 capteurs croisés permettent de mesurer le champ magnétique sur 3 axes X, Y, Z, du milli Gauss jusqu'à 8 Gauss, avec très peu de biais de mesure inter-axes.
- Alimentation 3-5V.
- Taille du PCB 13.9 x 18.5 mm.
- Son interface 12 bits permet des mesures de champ avec une précision de 1 à 2 °, transmission par bus de communication série I2C pour un interfaçage facile.
- Le composant CMS de 3 mm avec 2x8 pins est déjà soudé, prêt à l'emploi.
- 6 plages de mesure de champ magnétique,
- Pleine échelle -8 à +8 gauss,
- Résolution 10 milli-Gauss.
- Période de mesure 8.32 ms
- Fonctionnement de -30 à 85 °C
Attention, la boussole est bien sûr sensible aux perturbations des aimants, bobinages et moteurs placés à proximité.
L'adresse 7-bits I2C du module est 0x1E
Modes de fonctionnement : continuous, single-measurement, idle mode, sleep mode, off.
Câblage
Montage en 4 fils (I2C) --> Arduino
1 VCC alimentation du module --> Vcc 3.3v
2 GND masse--> Gnd
3 SCL Serial Clock --> A5
4 SDA Serial Data --> A4
5 DRDY --> n/a, Data Ready non utilisé.
Exemple de code
On affiche les 3 composantes X, Y, et Z du champ magnétique, le module, et l'angle de la boussole (à placer horizontalement).
Le module du vecteur magnétique M = sqr(X² + Y² + Z²).
L'angle = artan(y/x) est déduit des mesures X et Y.
- Code: Tout sélectionner
//*************************************************************
// demo_boussole
// D'après ARD_HMC5803L_GY273_Example
// Source : HobbyComponents.com
//
// Boussole numérique avec le module GY-273
// Compas digital Honeywell HMC5883L
// Interface I2C interface --> Arduino
// Modifié tiptopboards.com 23 10 2014 - Rolland
//*************************************************************
#include <Wire.h> //Librairie Wire pour la communication I2C
#define HMC5803L_Address 0x1E //Adresse I2C du module
#define X 3 //Adresses de registres pour les données X Y et Z
#define Y 7
#define Z 5
double Xmagnetic;
double Ymagnetic;
double Zmagnetic;
double Module_magnetic;
double angle;
void setup()
{
Serial.begin(9600);
Wire.begin(); //Initialisation de la livrairie Wire
Init_HMC5803L(); //Initialiser le module boussole
}
// Boucle de mesures de champ magnétique
void loop()
{
Xmagnetic = HMC5803L_Read(X); //lecture sur 3 axes et sortie sur le port sériel
Ymagnetic = HMC5803L_Read(Y);
Zmagnetic = HMC5803L_Read(Z);
Serial.print(" ");
Serial.print (Xmagnetic);
Serial.print(" ");
Serial.print (Ymagnetic);
Serial.print(" ");
Serial.print (Zmagnetic);
//Module du champ
Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic;
Module_magnetic = sqrt(Module_magnetic);
Serial.print(" M= ");
Serial.print(Module_magnetic);
//Calculer l'angle de la boussole à partir de X et Y (à plat)
angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres
if (angle<0) {angle=angle+360;}
Serial.print(" ");
Serial.print("Angle "); //en degres
Serial.println(angle);
delay(100);
}
// === Fonction qui initialise le module boussole (à lancer une seule fois)
void Init_HMC5803L(void)
{
/* Set the module to 8x averaging and 15Hz measurement rate */
Wire.beginTransmission(HMC5803L_Address);
Wire.write(0x00);
Wire.write(0x70);
Wire.write(0x01);
Wire.write(0xA0); //Règle un gain de 5
Wire.endTransmission();
}
// === Fonction qui lit le module boussole (registre d'un des 3 axes, retourne 16 bits)
int HMC5803L_Read(byte Axis)
{
int Result;
/* Initiate a single measurement */
Wire.beginTransmission(HMC5803L_Address);
Wire.write(0x02);
Wire.write(0x01);
Wire.endTransmission();
delay(6);
/* Move modules the resiger pointer to one of the axis data registers */
Wire.beginTransmission(HMC5803L_Address);
Wire.write(Axis);
Wire.endTransmission();
/* Read the data from registers (there are two 8 bit registers for each axis) */
Wire.requestFrom(HMC5803L_Address, 2);
Result = Wire.read() << 8;
Result |= Wire.read();
return Result;
}
.
Références
Tutoriel en anglais
http://forum.hobbycomponents.com/viewto ... 0036#p3200
Autre programme : avec utilisation la bibliothèque Adafruit HMC5883
http://electroniqueamateur.blogspot.fr/ ... duino.html
Datasheet du capteur HMC118X
http://www.adafruit.com/datasheets/HMC5 ... ass_IC.pdf