 |
HMC5883 Magnet Sensor auf dem Breadboard Shield. |
Letztes Jahr habe ich bereits darüber geschrieben, allerdings keinen Code dazu gepostet. Ich habe nur beschrieben, was mit der Library verändert werden musste, damit diese funktioniert. Diesmal hatte ich Zeit, um mich etwas näher damit zu befassen und konnte nun endlich ein funktionales Beispiel schreiben. Um den Code fürs erste übersichtlich zu halten, habe ich das Skalieren und das Berechnen nach Norden ausgelassen.
// Wird für die I²C Verbindung verwendet. #include <Wire.h> // Adresse des Sensors #define sensor_address 0x1E // Variabelen die für den Lese Vorgang benötigt werden byte data[6]; int axisX; int axisY; int axisZ; // Konfiguration der Seriellen Verbindung und Initialisierung des Sensors. void setup() { Serial.begin(9600); Serial.println("Init Sensor"); // I²C Verbindung starten. Wire.begin(); // Operating Mode (0x02): // Continuous-Measurement Mode (0x00) SetConfiguration(0x02, 0x00); // Standard Skalierung, siehe ggf. Datenblatt // +- 1.3 Ga, 1090 Gain(LSb/Gauss) SetConfiguration(0x01, 0x20); } // Hauptschleife void loop() { // Rohdaten abrufen ReadMagnetic(); // Zeige Roh Messwerte Serial.print("Raw Measurement: X "); Serial.print(axisX, DEC); Serial.print("\tY "); Serial.print(axisY, DEC); Serial.print("\tZ "); Serial.println(axisZ, DEC); } // Liest die Messwerte aus dem Magnet Sensor void ReadMagnetic() { Wire.beginTransmission(sensor_address); Wire.write(0x03); Wire.endTransmission(); // Die Array Größe, die hier zu erwarten ist sind 6 Bytes. Wire.requestFrom(sensor_address, 6); // Die einzelnen Bytes werden nun gelesen // und in das Byte Array geschrieben for(int i = 0; i < 6; i++) { data[i] = Wire.read(); } // 2 Bytes bilden zusammen einen Wert von 0 bis 65536. // Durch Byte Shifting lassen sich die Bytes zu einem Integer Wert zusammen fügen. axisX = (data[0] << 8) | data[1]; axisY = (data[2] << 8) | data[3]; axisZ = (data[4] << 8) | data[5]; } // Legt die Konfiguration fest, mit dem Einstellungs Byte und // dem Byte für die Einstellungsbereich. void SetConfiguration(byte reg, byte setting) { Wire.beginTransmission(sensor_address); Wire.write(reg); Wire.write(setting); Wire.endTransmission(); Wire.requestFrom(sensor_address, 1); byte result = Wire.read(); // Das Ergebnis aus dem Senden gibt einen Wert zurück. Ist der Wert 0, // war das senden fehlerhaft. Serial.print("Status: "); if(result != 0) { Serial.println("OK"); } else { Serial.println("Failur"); } } |
Funktionaler Programmcode für das Einlesen der der Rohdaten. |
Eigentlich hatte ich vor, noch die Himmelsrichtung zu bestimmen, allerdings habe ich eine Webseite gefunden, die das bereits sehr gut erklärt (Love Elektronics - HMC5883L Compass Tutorial with Arduino Library).
Zuletzt noch ein Schaltbild, mit dem Arduino.
 |
Arduino –> HMC5883L 3,3V –> VCC GND –> GND A4 –> SDA A5 –> SCL |
Kommentare