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: 88
Inscription: Mar 13 Aoû 2013 20:38
Localisation: 38

Retourner vers Capteurs et composants

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 4 invités

cron