Skip to content

Technik Blog

Programmieren | Arduino | ESP32 | MicroPython | Python | Raspberry Pi | Raspberry Pi Pico

Menu
  • Smarthome
  • Arduino
  • ESP32 & Co.
  • Raspberry Pi & Pico
  • Solo Mining
  • Über mich
  • Deutsch
  • English
Menu

Arduino Lektion 14: 3 Achsen Lagesensor, HMC5883L

Posted on 5. Dezember 20153. Mai 2023 by Stefan Draeger

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
  • Die Schaltung
  • Bibliotheken für den Sensor
  • Der Quellcode – Arduino
  • Zwischenergebnis
  • Das Video
  • Download

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
Dieses Video auf YouTube ansehen.

Download

3 Achsen Lagesensor, HMC5883LHerunterladen

9 thoughts on “Arduino Lektion 14: 3 Achsen Lagesensor, HMC5883L”

  1. Andre sagt:
    14. April 2018 um 18:12 Uhr

    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

    Antworten
    1. Stefan Draeger sagt:
      14. April 2018 um 19:18 Uhr

      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

      Antworten
      1. Andre sagt:
        14. April 2018 um 20:05 Uhr

        Ja genau den scanner hab ich benutzt

        Antworten
        1. Stefan Draeger sagt:
          14. April 2018 um 20:31 Uhr

          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

          Antworten
      2. Davide sagt:
        16. Oktober 2023 um 09:55 Uhr

        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

        Antworten
  2. Martin Esche sagt:
    13. Dezember 2019 um 10:07 Uhr

    Was bedeutet Ruhemodus / Arbeitsmodus bei dem Sensor?

    Antworten
  3. Oliver sagt:
    29. Dezember 2021 um 17:07 Uhr

    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!

    Antworten
    1. Stefan Draeger sagt:
      29. Dezember 2021 um 17:38 Uhr

      Hi,

      welchen Mikrocontroller verwendest du? Hast du ein Bild deiner Schaltung für mich?

      Gruß,

      Stefan

      Antworten
  4. Günther sagt:
    6. August 2022 um 18:46 Uhr

    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

    Antworten

Schreibe einen Kommentar Antworten abbrechen

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

Fragen oder Feedback?

Du hast eine Idee, brauchst Hilfe oder möchtest Feedback loswerden?
Support-Ticket erstellen

Newsletter abonnieren

Bleib auf dem Laufenden: Erhalte regelmäßig Updates zu neuen Projekten, Tutorials und Tipps rund um Arduino, ESP32 und mehr – direkt in dein Postfach.

Jetzt Newsletter abonnieren

Unterstütze meinen Blog

Wenn dir meine Inhalte gefallen, freue ich mich über deine Unterstützung auf Tipeee.
So hilfst du mit, den Blog am Leben zu halten und neue Beiträge zu ermöglichen.

draeger-it.blog auf Tipeee unterstützen

Vielen Dank für deinen Support!
– Stefan Draeger

Kategorien

Tools

  • Unix-Zeitstempel-Rechner
  • ASCII Tabelle
  • Spannung, Strom, Widerstand und Leistung berechnen
  • Widerstandsrechner
  • 8×8 LED Matrix Tool
  • 8×16 LED Matrix Modul von Keyestudio
  • 16×16 LED Matrix – Generator

Links

Blogverzeichnis Bloggerei.de TopBlogs.de das Original - Blogverzeichnis | Blog Top Liste Blogverzeichnis trusted-blogs.com

Stefan Draeger
Königsberger Str. 13
38364 Schöningen

Tel.: 01778501273
E-Mail: info@draeger-it.blog

Folge mir auf

  • Impressum
  • Datenschutzerklärung
  • Disclaimer
  • Cookie-Richtlinie (EU)
©2025 Technik Blog | Built using WordPress and Responsive Blogily theme by Superb
Cookie-Zustimmung verwalten
Wir verwenden Technologien wie Cookies, um Geräteinformationen zu speichern und/oder darauf zuzugreifen. Wir tun dies, um das Surferlebnis zu verbessern und um personalisierte Werbung anzuzeigen. Wenn Sie diesen Technologien zustimmen, können wir Daten wie das Surfverhalten oder eindeutige IDs auf dieser Website verarbeiten. Wenn Sie Ihre Zustimmung nicht erteilen oder zurückziehen, können bestimmte Funktionen beeinträchtigt werden.
Funktional Immer aktiv
Die technische Speicherung oder der Zugang ist unbedingt erforderlich für den rechtmäßigen Zweck, die Nutzung eines bestimmten Dienstes zu ermöglichen, der vom Teilnehmer oder Nutzer ausdrücklich gewünscht wird, oder für den alleinigen Zweck, die Übertragung einer Nachricht über ein elektronisches Kommunikationsnetz durchzuführen.
Vorlieben
Die technische Speicherung oder der Zugriff ist für den rechtmäßigen Zweck der Speicherung von Präferenzen erforderlich, die nicht vom Abonnenten oder Benutzer angefordert wurden.
Statistiken
Die technische Speicherung oder der Zugriff, der ausschließlich zu statistischen Zwecken erfolgt. Die technische Speicherung oder der Zugriff, der ausschließlich zu anonymen statistischen Zwecken verwendet wird. Ohne eine Vorladung, die freiwillige Zustimmung deines Internetdienstanbieters oder zusätzliche Aufzeichnungen von Dritten können die zu diesem Zweck gespeicherten oder abgerufenen Informationen allein in der Regel nicht dazu verwendet werden, dich zu identifizieren.
Marketing
Die technische Speicherung oder der Zugriff ist erforderlich, um Nutzerprofile zu erstellen, um Werbung zu versenden oder um den Nutzer auf einer Website oder über mehrere Websites hinweg zu ähnlichen Marketingzwecken zu verfolgen.
Optionen verwalten Dienste verwalten Verwalten von {vendor_count}-Lieferanten Lese mehr über diese Zwecke
Einstellungen anzeigen
{title} {title} {title}