Mit dem 3 Achsen Lagesensor HMC5883L kann man sich leicht eine digitale Wasserwaage bauen, aber dazu später mehr, jetzt erstmal zu dem Sensor.
Der Sensor ist nicht größer als ein 20Cent Stück und somit sehr gut für Mikroschaltungen geeignet.
Auch bei diesem “Bausatz” musste man die Steckerleiste an den Sensor löten, was wirklich nicht schwierig ist.
Technische Daten
- Maße
- Breite – 16 mm
- Höhe – 19 mm
- Stromaufnahme
- Ruhemodus – 2 µA
- Arbeitsmodus – 100 µA
Die Schaltung
Der Sensor verfügt über folgende PIN’s
- VCC +5V – 5V
- GND – GND
- SCL – analog PIN A5
- SDA – analog PIN A4
- DRDY – bleibt in diesem Beispiel frei
- 3V3 – bleibt in diesem Beispiel frei
Bibliotheken für den Sensor
Zu dem 3 Achsen Lagesensor HMC5883L gibt es eine fertige Bibliothek von Adafruit welche aus dem GutHub Repository
https://github.com/adafruit/Adafruit_HMC5883_Unified geladen werden kann.
Wie eine Bibliothek in die Arduino IDE eingebunden wird habe ich im
Tutorial Arduino IDE, Include .h Datei beschrieben.
Im nachfolgenden Code wurde auf den Einsatz der Bibliothek verzichtet, da es über die Boardmittel genauso gut funktioniert.
Der Quellcode – Arduino
#include <Wire.h> //I2C Arduino Bibliothek #define address 0x1E //0011110b, I2C 7Bit Adresse des HMC5883 Chips void setup(){ Serial.begin(9600); //Baudrate Wire.begin(); Wire.beginTransmission(address); //Beginnen der Kommunikation über die Adresse, für das setzen der Konfiguration Wire.write(0x02); //select mode register Wire.write(0x00); //Modus für das fortlaufende lesen der Werte. Wire.endTransmission(); //Beenden der Kommunikation. } void loop(){ int x; //X Achse int y; //Y Achse int z; //Z Achse Wire.beginTransmission(address); //Beginnen der Kommunikation Wire.write(0x03); //select register 3, X MSB register Wire.endTransmission(); //Beenden der Kommunikation //Lesen der Daten vom 6 fach Register (2 Register pro Achse) Wire.requestFrom(address, 6); if(6<=Wire.available()){ x = Wire.read()<<8; //X msb x |= Wire.read(); //X lsb z = Wire.read()<<8; //Z msb z |= Wire.read(); //Z lsb y = Wire.read()<<8; //Y msb y |= Wire.read(); //Y lsb } //Ausgabe der Werte für die X,Y,Z Achsen Serial.print("{"); Serial.print("[x ="); Serial.print(x); Serial.print("]"); Serial.print("[y ="); Serial.print(y); Serial.print("]"); Serial.print("[z ="); Serial.print(z); Serial.print("]"); Serial.print("}"); Serial.println(""); delay(500); //500ms Pause. }
Zwischenergebnis
Wenn man jetzt das Programm auf dem Arduino startet (kompiliert und übermittelt.), kann man auf dem seriellen Monitor folgende Ausgabe sehen.
Als nächsten Schritt möchte ich nun diese Werte auf einem Max7219 LED Shield darstellen.
Hi,
kannst du mir helfen…
Ich benutze deinen Code und eine Arduino Uno. Nur leider bekomme ich als Ausgabe für alle Achsen nur 0. Die I2C Adresse habe ich über einen Code ausgelesen (0x0D). Diese habe ich unter #define Address eingetragen, aber leider bekomme ich nur als Ausgabe 0 für alle Achsen.
Danke
Hi,
wie hast du die Adresse ermittelt?
Es gibt einen I2C Scanner (https://playground.arduino.cc/Main/I2cScanner)
mit diesem kannst du die korrekte Adresse ermitteln.
Gruß,
Stefan
Ja genau den scanner hab ich benutzt
Hi,
kannst du mir bitte deinen Sketch senden und vieleicht ein kleines Foto von deinem Aufbau?
Manchmal liegt der Fehler auch einfach im Anschluss der PINs.
E-Mail: info@draeger-it.blog
Gruß,
Stefan
Hallo zusammen,
vieleicht kann mir jemand helfen. Ich habe den HCM5883L, mie diesem möchte ich an einem Permanentmagneten die unterscheidung Nord- Südpol erkennen. Warum ich keinen Hall nutze ist, die entfernung soll etwas weiter sein. Nur wenn ich das bsp. Programm nutze, bekomme ich mit nord oder Süd ziemlich gleiche werte. Hat jemand eine idee. Würde mich unheimlich freuen, ich sitze schon eine weile an diesem projekt.
MFG
Davide
Was bedeutet Ruhemodus / Arbeitsmodus bei dem Sensor?
Hallo,
Beitrag ist zwar schon älter, hoffe trotzdem das mir hier geholfen werden kann.
Habe auch das Problem das ich für x,y und z nur 0 angezeigt bekomme.
Was könnt hier eine Lösung sein?
Danke!
Hi,
welchen Mikrocontroller verwendest du? Hast du ein Bild deiner Schaltung für mich?
Gruß,
Stefan
Hallo zusammen, ich habe ein ähnliches Problem. Mit dem I2C-Scanner die Adresse ausgelesen und im Quellcode hinterlegt. Allerdings sind alle Werte auf 0….
Wie habt Ihr das gelöst?
Danke für die Hilfe.
Günther