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.
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.
Hier ist das elektronische Diagramm zum Anschluss des GY-271. Dabei wird der i2C des Arduino-Boards verwendet:
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);
}