La boussole électronique est conçu pour détecter le champ magnétique terrestre et fournir des données de cap magnétique à un microcontrôleur comme Arduino. Celui que l’on va utiliser aujourd’hui est le module GY-271, basé sur le capteur HMC5883L.
Doté d’un capteur à effet Hall, le GY-271 offre une précision raisonnable pour mesurer l’orientation magnétique. Il comprend un système à trois axes qui permet de détecter les variations du champ magnétique sur les axes X, Y et Z. Ces données peuvent être utilisées pour déterminer la direction dans laquelle le module est orienté par rapport au nord magnétique.
Voici le schéma électronique pour connecter le GY-271. Celui-ci utilise l’i2C de la carte Arduino :
Pour téléverser le programme pour la boussole GY-271 vous aurez besoin d’installer la librairie d’adafruit pour le HMC5883 qui est la puce qui contôle notre boussole :
#include <Wire.h> //I2C Arduino Librairie
#define HMC5883L_ADDR 0x1E //addresse i2c du HMC5883
bool haveHMC5883L = false;
bool detectHMC5883L () {
Wire.beginTransmission(HMC5883L_ADDR);
Wire.write(10);
Wire.endTransmission();
Wire.requestFrom(HMC5883L_ADDR, 3);
if(3 == Wire.available()) {
char a = Wire.read();
char b = Wire.read();
char c = Wire.read();
if(a == 'H' && b == '4' && c == '3')
return true;
}
return false;
}
void setup() {
//On initialise le moniteur série et l'i2C
Serial.begin(9600);
Serial.println("Démarrage");
Wire.begin();
TWBR = 78;
TWSR |= _BV (TWPS0);
}
void loop() {
bool detect = detectHMC5883L();
if(!haveHMC5883L) {
if(detect) {
haveHMC5883L = true;
Serial.println("La boussole est detecte");
Wire.beginTransmission(HMC5883L_ADDR);
Wire.write(0x02);
Wire.write(0x00);
Wire.endTransmission();
}
else {
Serial.println("Boussole non detecte");
delay(2000);
return;
}
}
else {
if(!detect) {
haveHMC5883L = false;
Serial.println("Connexion perdue");
delay(2000);
return;
}
}
int x,y,z; //trois axes
Wire.beginTransmission(HMC5883L_ADDR);
Wire.write(0x03);
Wire.endTransmission();
Wire.requestFrom(HMC5883L_ADDR, 6);
if(6<=Wire.available()){
x = Wire.read()<<8;
x |= Wire.read();
z = Wire.read()<<8;
z |= Wire.read();
y = Wire.read()<<8;
y |= Wire.read();
}
Serial.print("x: ");
Serial.print(x);
Serial.print(" y: ");
Serial.print(y);
Serial.print(" z: ");
Serial.println(z);
delay(250);
}
Voici le résultat sur le moniteur série . On ne peut pas vous montrer les différents axes qui apparaissent juste après que la boussole soit détectée :