Arduino Lektion 14: 3 Achsen Lagesensor, HMC5883L

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.

3 Achsen Lagesensor HMC5883L
3 Achsen Lagesensor HMC5883L

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
Arduino Nano mit angeschlossenem 3 Achsen Lagesensor, HMC5883L.
Arduino Nano mit angeschlossenem 3 Achsen Lagesensor, HMC5883L.

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.

Ausgabe des Sketches auf dem Serial Monitor der Arduino IDE
Ausgabe des Sketches auf dem Serial Monitor der Arduino IDE

Als nächsten Schritt möchte ich nun diese Werte auf einem Max7219 LED Shield darstellen.

Das Video

3 Achsen Lagesensor, HMC5883L

Download

9 Kommentare

  1. 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

  2. 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!

  3. 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

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert