Einführung

Der elektronische Kompass ist dafür ausgelegt, das Erdmagnetfeld zu erfassen und die magnetischen Kursdaten an einen Mikrocontroller wie Arduino zu übermitteln. Wir verwenden heute das Modul GY-271, das auf dem Sensor HMC5883L basiert.

Ausgestattet mit einem Hall-Effekt-Sensor bietet der GY-271 eine angemessene Genauigkeit bei der Messung der magnetischen Orientierung. Er verfügt über ein Dreiachsensystem, das Magnetfeldschwankungen entlang der X-, Y- und Z-Achse erkennt. Anhand dieser Daten lässt sich die Ausrichtung des Moduls relativ zum magnetischen Norden bestimmen.

  • Kompasskiefern GY-271

  • Vcc: Anschluss an 3,3 V der Arduino-Platine.

  • GND: Anschluss an Masse der Arduino-Platine.

  • SDA: Anschluss an Pin A4 der Analogausgänge.

  • SCL: Anschluss an Pin A5 der Analogausgänge.

Elektronisches Diagramm

Hier ist das elektronische Diagramm zum Anschluss des GY-271. Dabei wird der i2C des Arduino-Boards verwendet:

Programmierung

Um das Programm für den Kompass GY-271 hochzuladen, müssen Sie die Adafruit-Bibliothek für den HMC5883 installieren, den Chip, der unseren Kompass steuert:

#include <Wire.h> 
#define HMC5883L_ADDR 0x1E 
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() {
  Serial.begin(9600);
  Serial.println("Start-up");
  Wire.begin();
  TWBR = 78; 
  TWSR |= _BV (TWPS0); 
}
void loop() {
bool detect = detectHMC5883L();
if(!haveHMC5883L) {
  if(detect) {
  haveHMC5883L = true;
  Serial.println("Der Kompass wird erkannt");
  Wire.beginTransmission(HMC5883L_ADDR); 
  Wire.write(0x02); 
  Wire.write(0x00); 
  Wire.endTransmission();
}
else {
  Serial.println("Kompass nicht erkannt");
  delay(2000);
return;
}

}
else {
if(!detect) {
  haveHMC5883L = false;
  Serial.println("Verbindung verloren");
  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);
}