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); }