Accueil > ARDUINO > Capteurs > Arduino & HMC5883L ou QMC5883L (compas magnétique numérique)

Arduino & HMC5883L ou QMC5883L (compas magnétique numérique)

dimanche 4 mars 2018, par thebault

Présentation

JPEG - 18.6 ko

Préambule : Il existe une version d’origine du composant HMC5883L d’Honeywell qui semble ne plus être fabriqué. Actuellement les cartes utilisent le QMC5883L.
Pour les différencier :
- le HMC5883L, qui est noté L883 sur le composant,
- le QMC5883L, qui est noté DA 5883 sur le composant
Bien qu’ils aient un brochage identique, les adresses et registres sont différents. IL faudra donc utiliser les bonnes bibliothèques sous Arduino suivant la version (voir ci dessous)

Ces composants sont des compas numériques qui vont permettre de déterminer l’orientation par rapport au nord magnétique, sur 3 axes. Les capteurs utilisent le bus I2c pour communiquer avec la carte Arduino (ou autre microcontrôleur).

datasheet du capteur HCM5833

datasheet du capteur QCM5833

Branchements

JPEG - 383.6 ko

Programme Arduino dans le cas du HMC5883L

Pour la mise en oeuvre avec Arduino, je vais utiliser la bibliothèque développée par Jeff Rowberg. Son projet complet est accessible à cette adresse http://www.i2cdevlib.com/.

Pour poursuivre, il faut donc installer les bibliothèques "i2c" et "HMC5883L" sous licence MIT qui se trouvent à l’adresse : https://github.com/jrowberg/i2cdevlib/tree/master/Arduino/I2Cdev et https://github.com/jrowberg/i2cdevlib/tree/master/Arduino/HMC5883L

Télécharger et décompresser dans ../Arduino/librairies les 2 fichiers suivants :

Zip - 15.1 ko
I2Cdev.zip
Zip - 6.3 ko
hmc5883L.zip

Le capteur mesure les valeurs du champs magnétique terrestre sur les axes x, y z (valeurs mx,my, mz dans le programme ci dessous, voir la datasheet pour les valeurs obtenues).

Si on se limite à l’étude dans le plan (x,y), on peut déterminer l’angle entre l’axe y du capteur et la direction du pole nord magnétique (voir champs magnétique terrestre).
D’après le schéma ci-dessous, on peut en déduire que angle= Arctan(mx/my)

JPEG - 38.5 ko
  1. #include <Wire.h>
  2. #include <I2Cdev.h>
  3. #include <HMC5883L.h>
  4. #include <math.h>
  5.  
  6.  
  7. HMC5883L capteur;
  8.  
  9. int16_t mx, my, mz; // déclaration des variables sur les axes x, y, z
  10. float angle;
  11.  
  12. void setup() {
  13.  
  14. // initialisation de la liaison série I2C
  15. Wire.begin();
  16.  
  17. // communication série via l'usb de la carte leonardo
  18. Serial.begin(9600);
  19. while (!Serial) {
  20. }
  21.  
  22. // initialisation du capteur
  23. capteur.initialize();
  24. delay(1000);
  25. while (!capteur.testConnection()) {
  26. Serial.println("erreur connexion capteur HMC5883L..");
  27. delay(500);
  28. }
  29.  
  30. }
  31.  
  32. void loop() {
  33. // lire les données sur les axes x,y,z du champs magnétique
  34. capteur.getHeading(&mx, &my, &mz);
  35.  
  36. // affichage des données
  37. Serial.println("-------------");
  38. Serial.print("mag:\t");
  39. Serial.print(mx);
  40. Serial.print("\t");
  41. Serial.print(my);
  42. Serial.print("\t");
  43. Serial.print(mz);
  44. Serial.println("\t");
  45.  
  46. // calcul et affichage de l'angle en degrés par rapport au nord
  47. angle = atan2((double)mx, (double)my);
  48. Serial.print("angle:\t");
  49. Serial.println(angle * 180 / PI);
  50. delay(1000);
  51. }

Télécharger

Programme Arduino dans le cas du QMC5883L

Pour la mise en oeuvre avec Arduino, je vais utiliser la bibliothèque développée par "mechasolution".

Pour installer la bibliothèque :
- télécharger la bibliothèque à cette adresse : https://github.com/mechasolution/Mecha_QMC5883L en cliquant sur "Clone or download" puis "Download zip"
- copier le fichier téléchargé dans ./Arduino/libraries
- décompresser le fichier
- relancer le logiciel Arduino

Le capteur mesure les valeurs du champs magnétique terrestre sur les axes x, y z (valeurs mx,my, mz dans le programme ci dessous, voir la datasheet pour les valeurs obtenues).

Si on se limite à l’étude dans le plan (x,y), on peut déterminer l’angle entre l’axe y du capteur et la direction du pole nord magnétique (voir champs magnétique terrestre).
D’après le schéma ci-dessous, on peut en déduire que angle= Arctan(mx/my)

JPEG - 32.1 ko
  1. #include <Wire.h>
  2. #include <MechaQMC5883.h>
  3. #include <math.h>
  4.  
  5. MechaQMC5883 capteur;
  6.  
  7. int mx, my, mz; // déclaration des variables sur les axes x, y, z
  8. float angle;
  9.  
  10.  
  11. void setup() {
  12. Wire.begin();
  13. Serial.begin(9600);
  14. capteur.init();
  15. //capteur.setMode(Mode_Continuous,ODR_200Hz,RNG_2G,OSR_256);
  16. }
  17.  
  18. void loop() {
  19. capteur.read(&mx, &my, &mz);
  20.  
  21. // affichage des données
  22. Serial.println("-------------");
  23. Serial.print("mag:\t");
  24. Serial.print(mx);
  25. Serial.print("\t");
  26. Serial.print(my);
  27. Serial.print("\t");
  28. Serial.print(mz);
  29. Serial.println("\t");
  30.  
  31. // calcul et affichage de l'angle en degrés par rapport au nord
  32. angle = atan2((double)mx, (double)my);
  33. Serial.print("angle:\t");
  34. Serial.println(angle * 180 / PI);
  35. delay(1000);
  36.  
  37. }

Télécharger

SPIP | | Plan du site | Suivre la vie du site RSS 2.0
Habillage visuel © digitalnature sous Licence GPL