In diesem Tutorial lernst du, wie du den AK8975 3-Achsen-Magnetometer mit einem Arduino verwendest. Der AK8975 ist im Grunde ein elektronischer Kompass, mit dem du die Stärke des Erdmagnetfelds (und anderer magnetischer Quellen) entlang drei Achsen messen kannst.
Der AK8975 verwendet hochempfindliche Hall-Sensoren und ist für die Fußgängernavigation in Städten in Handys und anderen tragbaren Anwendungen konzipiert.
Benötigte Teile
Natürlich benötigst du einen AK8975 Sensor. Normalerweise kauft man nicht den reinen Sensor, sondern ein Breakout-Board, das einige zusätzliche Komponenten enthält, die den Anschluss des Sensors erleichtern.
Außerdem brauchst du einen Mikrocontroller. Ich habe für dieses Projekt einen Arduino Uno verwendet, aber jeder andere Arduino oder ein ESP32/ESP8266 funktioniert ebenfalls.

AK8975 3-Achsen-Magnetometer

Arduino Uno

USB-Kabel für Arduino UNO

Dupont-Kabel-Set

Breadboard
Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.
Eigenschaften des AK8975
Der AK8975 ist ein 3-Achsen-Magnetometer, das sich für Kompassanwendungen eignet. Er hat eine typische Empfindlichkeit von 0,3 µT / LSB mit einer Auflösung von 13 Bit und verfügt über eine eingebaute magnetische Quelle für Selbsttests. Der Sensor bietet I2C und 4-Draht-SPI als Kommunikationsschnittstellen. Er arbeitet mit 3-5V und hat einen typischen Stromverbrauch von 350 µA. Das folgende Bild zeigt das interne Blockdiagramm des AK8975:

Du kannst leicht den 3-Achsen-Hall-Sensor zur Erkennung magnetischer Felder, den Multiplexer (MUX) zum Umschalten zwischen den 3 Achsen, die eingebaute magnetische Quelle für Selbsttests, den Analog-Digital-Wandler (ADC) und die Kommunikationsschnittstelle erkennen.
Die Pins des AK8975 sind wie folgt: VSS ist Masse, VDD ist die analoge Stromversorgung und VID ist die Stromversorgung für die digitale Schnittstelle.
CAD0 und CAD1 ermöglichen die Auswahl der I2C-Adresse des AK8975 (0x0C–0x0F). CSB aktiviert die I2C- oder SPI-Schnittstelle. Um die I2C-Schnittstelle zu aktivieren, verbinde diesen Pin mit VID. SO ist ein serieller Ausgangspin, wenn die SPI-Schnittstelle aktiviert ist.
SCL/SK und SDA/SI sind die Datenkommunikationspins für I2C bzw. SPI. DRDY ist der Daten-bereit-Pin. High zeigt an, dass eine Datenmessung abgeschlossen ist.
Schließlich sind TST1, TST2 und TST6 Testpunkte für die Fertigung und RSF ist ein reservierter Pin. Weitere Informationen findest du im unten verlinkten Datenblatt des AK8975:
Breakout-Board für AK8975
Normalerweise kauft man nicht den AK8975-Chip selbst, sondern ein Breakout-Board, das den Anschluss des Chips an einen Arduino erheblich erleichtert und auch die zusätzlichen benötigten elektronischen Komponenten enthält. Das Bild unten zeigt ein typisches Breakout-Board für den AK8975:

Die Pinbelegung folgt im Wesentlichen den im Blockdiagramm des AK8975 beschriebenen Pins. VCC ist die positive Stromversorgung und GND ist Masse. SCL und SDA sind die Datenkommunikationspins für die I2C-Schnittstelle. SO ist serieller Ausgang – vorausgesetzt, du verwendest die SPI-Schnittstelle. CSB aktiviert die I2C- oder SPI-Schnittstelle. DRDY ist der Daten-bereit-Pin. Und schließlich werden CAD0 und CAD1 verwendet, um die I2C-Adresse des AK8975 auszuwählen. Die folgende Tabelle zeigt, welche CAD0- und CAD1-Einstellungen mit welchen I2C-Adressen verknüpft sind:

Beachte, dass es mehrere Breakout-Boards für den AK8975 gibt, bei denen der CDA1-Pin fälschlicherweise als CADY beschriftet ist. Siehe das folgende Beispiel:

Aber keine Sorge, normalerweise funktionieren sie einwandfrei, es ist nur die falsche Beschriftung auf dem Siebdruck.
Anschluss des AK8975 an Arduino
In diesem Abschnitt zeige ich dir, wie du den AK8975 an einen Arduino anschließt. Verbinde zuerst die SCL- und SDA-Pins des AK8975-Breakout-Boards mit den entsprechenden Pins auf dem Arduino-Board, wie unten gezeigt. Verbinde dann Masse mit GND und 3,3V (oder 5V) mit VCC des AK8975.
Um die I2C-Schnittstelle zu aktivieren, müssen wir nun CSB mit 3,3V verbinden. Und schließlich wählen wir die I2C-Adresse 0x0C, indem wir CDA1 und CDA2 mit Masse verbinden.

Wenn du andere Geräte am I2C-Bus angeschlossen hast (z.B. ein Display) und diese sich in den I2C-Adressen überschneiden, kannst du die I2C-Adresse des AK8975 einfach ändern, indem du CDA1 und CDA2 anders verdrahtest. Zur Orientierung siehe die zuvor gezeigte Tabelle.
Um zu überprüfen, welche I2C-Adresse ausgewählt ist, kannst du den folgenden I2C scanner Code ausführen. Er sollte die I2C-Adresse ausgeben. 0x0C. Wenn nicht, stimmt etwas mit deiner Verdrahtung nicht.
#include "I2CScanner.h"
I2CScanner scanner;
void setup() {
Serial.begin(9600);
scanner.Init();
}
void loop() {
scanner.Scan();
delay(5000);
}
Code zur Messung des Magnetfelds mit AK8975
In diesem Abschnitt zeige ich dir Beispielcode, um Messungen mit dem AK8975 durchzuführen. Ich werde die AK8975 Library von Jeff Rowberg verwenden. Du kannst die Bibliothek als ZIP-Datei von dort herunterladen und installieren. Die Bibliothek ist allerdings recht groß und unterstützt viele weitere Sensoren, die du nicht brauchst und die mit anderen Bibliotheken in Konflikt geraten könnten.
Ich habe daher die notwendigen Dateien extrahiert und eine kleinere Bibliothek erstellt, die nur den für den AK8975-Sensor benötigten Code enthält. Du kannst die ZIP file dieser Bibliothek herunterladen. Um diese ZIP-Bibliothek zu installieren, folge den üblichen Schritten. Klicke auf Sketch -> Add .ZIP Library und wähle dann die Datei AK8975_lib.zip aus, die du gerade heruntergeladen hast.

Mit der installierten Bibliothek testen wir nun den Sensor. Der folgende Code liest die Stärke des Erdmagnetfelds entlang der drei Achsen (X, Y und Z) und gibt sie alle halbe Sekunde im Serial Monitor aus.
#include "Wire.h"
#include "AK8975.h"
AK8975 mag(0x0C);
void setup() {
Wire.begin();
Serial.begin(9600);
mag.initialize();
if (!mag.testConnection()) {
Serial.println("AK8975 connection failed!");
}
}
void loop() {
int16_t mx, my, mz;
mag.getHeading(&mx, &my, &mz);
Serial.print("X:");
Serial.println(mx);
Serial.print("Y:");
Serial.println(my);
Serial.print("Z:");
Serial.println(mz);
delay(500);
}
Lass uns den Code in seine Bestandteile zerlegen, um ihn besser zu verstehen.
Bibliothek einbinden
Zuerst binden wir die Wire-Bibliothek und die notwendige Bibliothek für den AK8975-Magnetometer ein. Diese Bibliothek enthält die Funktionen und Definitionen, die für die Kommunikation mit dem Sensor benötigt werden.
#include "Wire.h" #include "AK8975.h"
Instanz erstellen
Als nächstes erstellen wir eine Instanz der AK8975-Klasse namens mag. Diese Instanz ermöglicht uns den Zugriff auf die in der Bibliothek definierten Funktionen, um mit dem Magnetometer zu interagieren. Beachte, dass hier die I2C-Adresse 0x0C angegeben ist.
AK8975 mag(0x0C);
Setup-Funktion
In der setup() Funktion initialisieren wir zuerst die Wire-Bibliothek. Serial.begin(9600) initialisiert die serielle Kommunikation mit einer Baudrate von 9600. Dadurch können wir Daten zur Fehlerbehebung und Überwachung an den Serial Monitor senden.
Wire.begin(); Serial.begin(9600);
Als nächstes rufen wir die initialize() Methode der mag Instanz auf, um den Magnetometer zu initialisieren. Danach prüfen wir die Verbindung zum Magnetometer mit der testConnection() Methode. Wenn keine Verbindung hergestellt werden kann, geben wir eine Fehlermeldung im Serial Monitor aus.
mag.initialize();
if (!mag.testConnection()) {
Serial.println("AK8975 connection failed!");
}
Loop-Funktion
In der loop() Funktion starten wir eine Messung, indem wir die getHeading() Methode aufrufen, die die Magnetfeldwerte mx, my, mz für die 3 Achsen füllt.
int16_t mx, my, mz; mag.getHeading(&mx, &my, &mz);
Anschließend geben wir die Magnetfeldwerte für die X-, Y- und Z-Achsen im Serial Monitor aus.
Serial.print("X:");
Serial.println(mx);
Serial.print("Y:");
Serial.println(my);
Serial.print("Z:");
Serial.println(mz);
Zum Schluss fügen wir eine Verzögerung von 500 Millisekunden ein, bevor der nächste Messzyklus beginnt, um eine gut lesbare Ausgabe im Serial Monitor zu ermöglichen.
delay(500);
Code ausführen
Wenn du den Code hochlädst und ausführst, solltest du beginnen, Magnetfeldmessungen ähnlich den unten gezeigten im Serial Monitor zu sehen:

Wenn du den Sensor nun kippst und drehst, kannst du die sich ändernden Werte der Magnetfeldmessungen für die drei Achsen im Serial Plotter beobachten:

Und das war’s! Dieses Tutorial sollte dir einen guten Einstieg in den AK8975 geben.
Fazit
In diesem Tutorial hast du gelernt, wie du den AK8975 3-Achsen-Magnetometer mit einem Arduino verwendest.
Der AK8975 ist dem HSCDTD008A Magnetometer sehr ähnlich, obwohl der HSCDTD008A eine Auflösung von 0,15μT/LSB hat, während die Auflösung des AK8975 nur 0,3μT/LSB beträgt. Andererseits hat der AK8975 vier verschiedene I2C-Adressen zur Auswahl, während der HSCDTD008A eine einzelne, feste I2C-Adresse besitzt.
Der HSCDTD008A ist der kleinere Chip, aber auf einem Breakout-Board spielt das keine große Rolle. Aufgrund seiner festen I2C-Adresse ist der HSCDTD008A jedoch auch etwas einfacher anzuschließen. Beide Magnetometer sind für die meisten Anwendungen gleichermaßen geeignet.
Wenn du Fragen oder Kommentare hast, kannst du sie gerne im Kommentarbereich hinterlassen.
Viel Spaß beim Tüfteln ; )

