Accueil > ARDUINO > Capteurs > Arduino & HMC5883L ou QMC5883L (compas magnétique numérique)
dimanche 4 mars 2018, par
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).
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 :
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)
#include <Wire.h> #include <I2Cdev.h> #include <HMC5883L.h> #include <math.h> HMC5883L capteur; int16_t mx, my, mz; // déclaration des variables sur les axes x, y, z float angle; void setup() { // initialisation de la liaison série I2C Wire.begin(); // communication série via l'usb de la carte leonardo Serial.begin(9600); while (!Serial) { } // initialisation du capteur capteur.initialize(); delay(1000); while (!capteur.testConnection()) { Serial.println("erreur connexion capteur HMC5883L.."); delay(500); } } void loop() { // lire les données sur les axes x,y,z du champs magnétique capteur.getHeading(&mx, &my, &mz); // affichage des données Serial.println("-------------"); Serial.print("mag:\t"); Serial.print(mx); Serial.print("\t"); Serial.print(my); Serial.print("\t"); Serial.print(mz); Serial.println("\t"); // calcul et affichage de l'angle en degrés par rapport au nord angle = atan2((double)mx, (double)my); Serial.print("angle:\t"); Serial.println(angle * 180 / PI); delay(1000); }
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)
#include <Wire.h> #include <MechaQMC5883.h> #include <math.h> MechaQMC5883 capteur; int mx, my, mz; // déclaration des variables sur les axes x, y, z float angle; void setup() { Wire.begin(); Serial.begin(9600); capteur.init(); //capteur.setMode(Mode_Continuous,ODR_200Hz,RNG_2G,OSR_256); } void loop() { capteur.read(&mx, &my, &mz); // affichage des données Serial.println("-------------"); Serial.print("mag:\t"); Serial.print(mx); Serial.print("\t"); Serial.print(my); Serial.print("\t"); Serial.print(mz); Serial.println("\t"); // calcul et affichage de l'angle en degrés par rapport au nord angle = atan2((double)mx, (double)my); Serial.print("angle:\t"); Serial.println(angle * 180 / PI); delay(1000); }