In questo tutorial imparerai come utilizzare il magnetometro AK8975 a 3 assi con un Arduino. L’AK8975 è essenzialmente una bussola elettronica che ti permette di misurare l’intensità del campo magnetico terrestre (e di altre fonti magnetiche) lungo tre assi.
L’AK8975 utilizza sensori Hall altamente sensibili ed è progettato per la navigazione pedonale in città su telefoni cellulari e altre applicazioni portatili.
Componenti necessari
Ovviamente, ti servirà un sensore AK8975. Di solito non si acquista il sensore grezzo, ma una breakout board che include alcuni componenti aggiuntivi per facilitare il collegamento del sensore.
Inoltre, ti servirà un microcontrollore. Ho usato un Arduino Uno per questo progetto, ma qualsiasi altro Arduino o ESP32/ESP8266 andrà bene.

Magnetometro AK8975 a 3 assi

Arduino Uno

Cavo USB per Arduino UNO

Set di fili Dupont

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.
Caratteristiche dell’AK8975
L’AK8975 è un magnetometro a 3 assi adatto per applicazioni bussola. Ha una sensibilità tipica di 0,3 µT / LSB con una risoluzione di 13 bit e dispone di una sorgente magnetica integrata per l’autotest. Il sensore offre interfacce di comunicazione I2C e SPI a 4 fili. Funziona con 3-5V e ha un consumo tipico di 350 µA. L’immagine seguente mostra il diagramma a blocchi interno dell’AK8975:

Puoi facilmente identificare il sensore Hall a 3 assi per rilevare i campi magnetici, il Multiplexer (MUX) per selezionare tra i 3 assi, la sorgente magnetica integrata per l’autotest, il convertitore analogico-digitale (ADC) e l’interfaccia di comunicazione.
I pin dell’AK8975 sono i seguenti: VSS è la massa, VDD è l’alimentazione analogica e VID è l’alimentazione per l’interfaccia digitale.
CAD0 e CAD1 permettono di selezionare l’indirizzo I2C dell’AK8975 (0x0C–0x0F). CSB abilita l’interfaccia I2C o SPI. Per abilitare l’interfaccia I2C collega questo pin a VID. SO è un pin di uscita seriale se l’interfaccia SPI è abilitata.
SCL/SK e SDA/SI sono i pin di comunicazione dati per I2C o SPI, rispettivamente. DRDY è il pin data-ready. Alto indica che una misurazione è completa.
Infine, TST1, TST2 e TST6 sono punti di test per la produzione e RSF è un pin riservato. Per maggiori informazioni consulta il datasheet dell’AK8975 linkato qui sotto:
Breakout board per AK8975
Di solito non si acquista il chip AK8975 da solo, ma una breakout board che rende molto più semplice collegare il chip a un Arduino e include anche i componenti elettronici aggiuntivi necessari. L’immagine seguente mostra una tipica breakout board per l’AK8975:

Il pinout segue essenzialmente i pin descritti nel diagramma a blocchi dell’AK8975. VCC è l’alimentazione positiva e GND è la massa. SCL e SDA sono i pin di comunicazione dati per l’interfaccia I2C. SO è l’uscita seriale – se usi l’interfaccia SPI. CSB abilita l’interfaccia I2C o SPI. DRDY è il pin data-ready. Infine CAD0 e CAD1 sono usati per selezionare l’indirizzo I2C dell’AK8975. La tabella seguente mostra quali impostazioni di CAD0 e CAD1 corrispondono a quali indirizzi I2C:

Nota che esistono diverse breakout board per l’AK8975 in cui il pin CAD1 è etichettato erroneamente come CADY. Vedi l’esempio qui sotto:

Ma non preoccuparti, di solito funzionano correttamente ed è solo un’etichetta sbagliata sulla serigrafia.
Collegare l’AK8975 all’Arduino
In questa sezione ti mostro come collegare l’AK8975 a un Arduino. Per prima cosa collega i pin SCL e SDA della breakout board AK8975 ai corrispondenti pin sull’Arduino come mostrato sotto. Poi collega la massa a GND e 3.3V (o 5V) a VCC dell’AK8975.
Per abilitare l’interfaccia I2C, ora dobbiamo collegare CSB a 3.3V. Infine, selezioniamo l’indirizzo I2C 0x0C collegando CAD1 e CAD0 a massa.

Se hai altri dispositivi collegati al bus I2C (ad esempio un display) e hanno indirizzi I2C in conflitto, puoi facilmente cambiare l’indirizzo I2C dell’AK8975 cablando CAD1 e CAD0 in modo diverso. Per riferimento, consulta la tabella mostrata prima.
Per verificare quale indirizzo I2C è selezionato puoi eseguire il seguente I2C scanner codice. Dovrebbe stampare l’indirizzo I2C 0x0C. Se no, c’è qualche problema nel cablaggio.
#include "I2CScanner.h"
I2CScanner scanner;
void setup() {
Serial.begin(9600);
scanner.Init();
}
void loop() {
scanner.Scan();
delay(5000);
}
Codice per misurare il campo magnetico con AK8975
In questa sezione ti mostro un esempio di codice per effettuare misurazioni con l’AK8975. Userò la AK8975 Library di Jeff Rowberg. Puoi scaricare la libreria come file ZIP da lì e installarla. Ma la libreria è piuttosto grande e supporta molti altri sensori, che non ti servono e potrebbero creare conflitti con altre librerie.
Ho quindi estratto i file necessari e creato una libreria più piccola che contiene solo il codice richiesto per il sensore AK8975. Puoi scaricare la ZIP file di questa libreria. Per installare questa libreria ZIP segui i passaggi usuali. Clicca su Sketch -> Add .ZIP Library, quindi seleziona il file AK8975_lib.zip che hai appena scaricato.

Con la libreria installata, proviamo il sensore. Il codice seguente legge l’intensità del campo magnetico terrestre lungo i tre assi (X, Y e Z) e li stampa sul monitor seriale ogni mezzo secondo.
#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);
}
Analizziamo il codice nelle sue componenti per una comprensione più chiara.
Inclusione delle librerie
Per prima cosa includiamo la libreria Wire e la libreria necessaria per il magnetometro AK8975. Questa libreria contiene le funzioni e le definizioni necessarie per comunicare con il sensore.
#include "Wire.h" #include "AK8975.h"
Creazione di un’istanza
Successivamente creiamo un’istanza della classe AK8975 chiamata mag. Questa istanza ci permetterà di accedere alle funzioni definite nella libreria per interagire con il magnetometro. Nota che qui è specificato l’indirizzo I2C 0x0C.
AK8975 mag(0x0C);
Funzione setup
Nella funzione setup() inizializziamo prima la libreria Wire. Serial.begin(9600) inizializza la comunicazione seriale a 9600 baud. Questo ci permette di inviare dati al monitor seriale per debug e monitoraggio.
Wire.begin(); Serial.begin(9600);
Poi chiamiamo il metodo initialize() sull’istanza mag per inizializzare il magnetometro. Dopo controlliamo la connessione al magnetometro usando il metodo testConnection(). Se non riusciamo a connetterci, stampiamo un messaggio di errore sul monitor seriale.
mag.initialize();
if (!mag.testConnection()) {
Serial.println("AK8975 connection failed!");
}
Funzione loop
Nella funzione loop() avviamo una misurazione chiamando il metodo getHeading(), che riempie i valori del campo magnetico mx, my, mz per i 3 assi.
int16_t mx, my, mz; mag.getHeading(&mx, &my, &mz);
Stampiamo quindi i valori del campo magnetico per gli assi X, Y e Z sul monitor seriale.
Serial.print("X:");
Serial.println(mx);
Serial.print("Y:");
Serial.println(my);
Serial.print("Z:");
Serial.println(mz);
Infine introduciamo un ritardo di 500 millisecondi prima che inizi il ciclo di misurazione successivo, permettendo un output leggibile sul monitor seriale.
delay(500);
Esecuzione del codice
Se carichi ed esegui il codice, dovresti iniziare a vedere misurazioni del campo magnetico, simili a quelle sotto, apparire sul monitor seriale:

Se ora inclini e ruoti il sensore puoi monitorare i valori variabili delle misurazioni del campo magnetico per i tre assi sul Serial Plotter:

E questo è tutto! Questo tutorial dovrebbe darti un buon punto di partenza con l’AK8975.
Conclusioni
In questo tutorial hai imparato come usare il magnetometro AK8975 a 3 assi con un Arduino.
L’AK8975 è molto simile al magnetometro HSCDTD008A, anche se l’HSCDTD008A ha una risoluzione di 0,15μT/LSB mentre quella dell’AK8975 è solo 0,3μT/LSB. D’altra parte, l’AK8975 ha quattro diversi indirizzi I2C tra cui scegliere, mentre l’HSCDTD008A ha un indirizzo I2C singolo e fisso.
L’HSCDTD008A è il chip più piccolo, ma su una breakout board questo non conta molto. Tuttavia, a causa del suo indirizzo I2C fisso, l’HSCDTD008A è anche un po’ più facile da collegare. Entrambi i magnetometri sono ugualmente adatti per la maggior parte delle applicazioni.
Se hai domande o commenti, sentiti libero di lasciarli nella sezione commenti.
Buon divertimento con il tinkering ; )

