Capteur de champ magnétique HMC5883L, boussole avec Arduino

Utilisation de capteurs et composants électroniques avec Arduino.
Une fiche de tutoriel pour chaque.

Capteur de champ magnétique HMC5883L, boussole avec Arduino

Messagepar tiptop » Jeu 23 Oct 2014 20:51

Capteur de champ magnétique HMC5883L, réalisation d'une boussole numérique avec Arduino .

Image.Image

Composants utilisés

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

Image

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

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


Image.Image

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
tiptopboards - admin
Avatar de l’utilisateur
tiptop
Administrateur du site
 
Messages: 93
Inscription: Mar 13 Aoû 2013 20:38
Localisation: 38

Re: Capteur de champ magnétique HMC5883L, boussole avec Ardu

Messagepar fbedon » Dim 1 Déc 2019 22:03

Salut Christian, bonjour les autres.
je n'arrive pas a faire fonctionner ce composant avec un Arduino Uno TipTop, j’utilise le code exemple du site ainsi que d'autres avec 2 circuits différents et un Arduino fonctionnel par ailleurs.
Qui a essayé ce montage récemment ?
merci
Fred
Avatar de l’utilisateur
fbedon
 
Messages: 25
Inscription: Mer 21 Mai 2014 19:56
Localisation: Grenoble

Re: Capteur de champ magnétique HMC5883L, boussole avec Ardu

Messagepar fbedon » Mer 11 Déc 2019 08:11

Bonjour à tous,
j'ai réussi à faire fonctionner ce circuit avec le code suivant issue de l'exemple de la biblio QMC5883LCompass.
/*
QMC5883LCompass.h Library XYZ Example Sketch
Learn more at [https://github.com/mprograms/QMC5883Compas]
This example shows how to get the XYZ values from the sensor.
Release under the GNU General Public License v3
[https://www.gnu.org/licenses/gpl-3.0.en.html]
*/
#include <QMC5883LCompass.h>
QMC5883LCompass compass;
void setup() {
Serial.begin(9600);
compass.init();
}
void loop() {
int x, y, z;
// Read compass values
compass.read();
// Return XYZ readings
x = compass.getX();
y = compass.getY();
z = compass.getZ();
Serial.print("X: ");
Serial.print(x);
Serial.print(" Y: ");
Serial.print(y);
Serial.print(" Z: ");
Serial.print(z);
Serial.println();
delay(250);
}
Avatar de l’utilisateur
fbedon
 
Messages: 25
Inscription: Mer 21 Mai 2014 19:56
Localisation: Grenoble

Re: Capteur de champ magnétique HMC5883L, boussole avec Ardu

Messagepar fbedon » Jeu 26 Déc 2019 21:10

Autant pour moi Christian ton code fonctionne également.
en plus il a le bon gout de fonctionner avec les pattes SCL et SDA standards, A5 et A4.
Fred
Avatar de l’utilisateur
fbedon
 
Messages: 25
Inscription: Mer 21 Mai 2014 19:56
Localisation: Grenoble

Re: Capteur de champ magnétique HMC5883L, boussole avec Ardu

Messagepar fbedon » Jeu 26 Déc 2019 21:26

mais l'adresse est 0x0D et non pas 0x1E.
Avatar de l’utilisateur
fbedon
 
Messages: 25
Inscription: Mer 21 Mai 2014 19:56
Localisation: Grenoble

Re: Capteur de champ magnétique HMC5883L, boussole avec Ardu

Messagepar fbedon » Mer 22 Juil 2020 11:05

Salut à tous,
comme il n'y a pas grand chose à propos de la calibration des magnétomètres sur le web, je vais présenter ce que j'en ai compris et qui marche bien à condition que le capteur soit horizontal et pas trop pollué par des moteurs ou autres sources magnétiques.
De base, avant calibration, la réponse des signaux X et Y à une rotation du circuit (selon Z) est une combinaison de 2 courbes sinusoïdales déphasées (angle en abscisse). La représentation graphique de ces 2 courbes dessine une ellipse non centrée.
Il est assez facile à comprendre que pour obtenir des mesures correctes, cette réponse doit être un cercle centré sur l'origine. Il faut donc trouver les bons coefficients correcteurs pour cette transformation.
je propose de créer les variables suivantes :
float minx,maxx,miny,maxy; // les valeurs max et min de X et Y lors d'une rotation
float offx, offy; // les valeurs de correction déduites des min et max
float rapxy ; // le rapport d'amplitude entre X et Y

Les fonctions rapxy+(X-offs) et Y-offy dessinent maintenant un cercle centré.

De cette façon la valeur de l'angle s'écrit :
a = atan2( (_vRaw[1]-offy), (rapxy*(_vRaw[0]-offx)) ) * 180.0 / PI; // en degrés

Une simple boucle stocke les valeurs des minis et des maxis durant la rotation du capteur (manuelle ou motorisée) de la phase d'initialisation.

if (_vRaw[0] > maxx) maxx=_vRaw[0];
if (_vRaw[0] < minx) minx=_vRaw[0];
if (_vRaw[1] > maxy) maxy=_vRaw[1];
if (_vRaw[1] < miny) miny=_vRaw[1];

et les calculs suivants donnent les valeurs des offsets et du rapport
rapxy= (float)(maxy-miny)/(maxx-minx);
offx =minx + (maxx-minx)/2;
offy =miny + (maxy-miny)/2;

Le plus simple ensuite est de stocker ces valeurs en l'EEPROM
EEPROM.put(0,rapxy);
EEPROM.put(5,offx);
EEPROM.put(9,offy);

et de les relire lors des exécutions ultérieures

EEPROM.get(0,rapxy);
EEPROM.get(5,offx);
EEPROM.get(9,offy);

J'espère avoir été assez clair.
Je vais essayer d'avancer sur un sujet encore moins explicité, les corrections de tilt, c'est à dire les mesures avec un capteur qui n'est pas horizontal...à suivre.
bon bricolage à tous !
Fred
Avatar de l’utilisateur
fbedon
 
Messages: 25
Inscription: Mer 21 Mai 2014 19:56
Localisation: Grenoble

Re: Capteur de champ magnétique HMC5883L, boussole avec Ardu

Messagepar fbedon » Lun 3 Aoû 2020 18:27

Salut à tous,
juste un petit mot pour faire un retour sur le capteur magnétique et gyroscope LSM303 de POLULU, il est certes plus cher qu'un composant simple comme le HMC5885L mais la librairie intègre la calibration à la volée et la correction de tilt à base de calculs matriciels, impressionnant !
Fred
Avatar de l’utilisateur
fbedon
 
Messages: 25
Inscription: Mer 21 Mai 2014 19:56
Localisation: Grenoble


Retourner vers Capteurs et composants

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité