Introduction

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.

  • Les pins de la boussole GY-271

  • Vcc : A connecter au 3.3V de la carte Arduino
  • GND :  Relier à la masse de la carte Arduino
  • SDA : A connecter à la pin  A4 des sorties analogiques
  • SCL : Relier à la pin A5 des sorties analogiques

Schéma électronique

Voici le schéma électronique pour connecter le GY-271. Celui-ci utilise l’i2C de la carte Arduino :

Programmation

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 :