Last Updated on 29. März 2020 by sfambach
Der HMC5883L ist ein Kompass welcher über den I2c Bus angesteuert werden kann. Er wird über die Bus-Adresse 0x1E abgefragt und kann die Orientierung eines Gegenstandes, auf dem er montiert ist, feststellen.
Ansicht
Daten
Name | GY273 mit Sensor HMC5883L |
---|---|
Sensortyp | Kompass – 3 Achs Magnetometer |
Betriebsspannung | 5V |
Sensorspannung | 1,8-3,6V |
Bus | I2c ( 0x1E ) |
Genauigkeit | 1 – 2 Grad |
Messbereiche | 3 Achsen x, y, z 360° |
Grundlagen
Schaltung
Anschluss
GND | Masse |
DRDY | ?? |
SDA | I2C SDA |
SCL | I2C SCL |
VCC | 5 V |
Einsatzzwecke
- Richtungsbestimmung
- Orientierung von Roboter
- Erweiterung von Messdaten mit Orientierungsdaten
Programmierung
Bibliothek
Auch hier gibt es von Adafruit eine Unified Bibliothek. Diese kann wie gewohnt über den „Bibliothekar“ installiert werden.
Nach HMC suchen und die Unified auswählen.
Testprogramm 1
Auch ein kleines Testprogramm ist in der Bibliothek enthalten.
Die magnetische Abweischung muss im Programm auf den aktuellen Standort angepasst werden. Die Daten können auf dieser Seite abgerufen werden. Die Seite ist auch im Beispielquellcode mit zusätzlichen Informationen verlinkt.
Bei mir sind das +2° 25′ für Frankfurt und Umgebung. Diese müssen noch in Rad umgerechnet werden (hier ein Tool im Internet). Was bei mir 0,0349066 Rad für die +2° ergibt. Bei mir im Quellcode steht dann:
float declinationAngle = 0.0349066;
Das Ganze kompilieren und auf den Arduino laden und schon sollte das Programm laufen.
Die ausgegebenen Daten zeigen bei mir erstmal keine verifizierbaren Werte. Sie bewegten sich im Bereich von 200°-356°.
Eine Platzierung des Sensors am Rand des Steckbrettes brachte eine Verbesserung.
Testprogramm 2
Nach einiger Recherche im Internet habe ich ein paar Möglichkeiten zur Kalibrierung gefunden. Parallel habe ich mir die Daten mal Visualsiert und festgestellt, dass der Kreis den der Kompass bei einer vollen Umdrehung beschreibt auf der X und Y Achse verschoben ist. Hieraus hat sich die folgende einfache Kalibrierung ergeben.
Dreht man den Kompass um 360° um die Z-Achse und notiert alle paar Grad die Werte, kann man erkennen, dass sich ein Kreis bildet der auf der X und Y Achse verschoben ist.
Von diesem Kreis kann man den Mittelpunkt errechnen. Der Mittel wird dann von den gemessenen X und Y Werten abgezogen. Dies bewirkt eine Verschiebung des Mittelpunkt auf den Nullpunkt (X= 0, Y=0).
Die Minimal- und Maximalwerte können durch Drehen des Sensors um 360° erhoben werden.
Hier das erweiterte Beispielprogramm. Den Sensor am Anfang mindestens einmal, möglichst auf einer glatten Fläche, um die Z Achse drehen.
Ich habe den Code nur mit meinem Kompass getestet, ich bin mir fast sicher, dass sollte sich die Verschiebung in einem anderen Quardranten bewegen, die Berechnungen angepasst werden müssen.
Fazit
Der HMC58883L kann die Orientierung eines Gegenstgandes bestimmen auf dem er montiert ist. Eine Kalibrierung am Anfang ist unerlässlich zur Verwendung des Moduls. Störfaktoren wie Leiter und Metall können die Werte des Sensors stark beeinflussen.
Probleme
Die Werte des Sensors stimmen nicht
Der Gund hierfü kann eine Ablenkung durch Metallteile und Magnetische Felder sein. Bei mir Reichte das Steckbrett aus, um die Sensordaten komplett zu verfälsche.
Lösung 1 Umgebung bereinigen
Die Umgebung ändern. Den Sensor mal an den Rand des Steckbretts stecken oder nur mit Kabel verbinden. Störende Elemente aus der direkten Umgebung entfernen. Störungen werden durch Magnetfelder oder Metalle erzeugt. Magnetfelder können von Lautsprechern, Motoren oder allem was eine Strom durchflossene Spule/Leiter enthält, erzeugt werden. Metallteile können entweder abschirmen oder durch nahe Spannungsquellen können Ströme induziert werden, die wiederum das gemessene Magenetfeld beeinflussen.
EZtech meint das sogar die angelöteten Pins das Magenetfeld ebeinflussen wenn sie aus Eisen bzw. magnetischen Material sind. Somit könnte es hilfreich sein die Pins durch Kufperkabel zu ersetzen.
Lösung 2 Sensor justieren
Den Sensor justieren siehe Beispielprogramm oben.
Der Sensor reagiert nicht
Das auslesen des Sensors funktioniert nicht.
Lösung 1: Tauschen von SDA und SCL Leitung
Evtl. könnten die SDA und die SCL Leitung beim Verdrahten vertauscht worden sein (Das passiert den Besten ;)). Einfach mal die zwei Leitungen tauschen, es sollte eigentlich nichts passieren können.
Lösung 2: I2C/Wire Bus testen
Evtl. hat euer Modul eine andere Adresse oder funktioniert nicht. Deshalb empfiehlt es sich zu Beginn mal den Bus zu scannen. Es gibt Programme hierfür, unter anderem das im folgenden Beitrag gelinkte von mir:
Verwandte Berichte
- Preview – INA3221 Power Monitor
- Preview – Digitaler Wägesensor
- ESP32 BlueTooth Gamepad
- ESP01 – DHT11 Temperatur und Feuchte Sensor Platinen
- Temperatur- und Feuchtesensor DHT22
- LM2596 Step Down Spannungswandler
- Preview – Strommessung mit dem ACS712
- Preview – Omnidirectionales I²C Mikrofon
- D1 Mini Shield – PIR (Bewegungssensor)
- D1 Mini Shield – SG30 Luftqualitätsmessung