Skip to Content

Magnetometro AK8975 con Arduino

Magnetometro AK8975 con Arduino

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

Arduino Uno

USB Data Sync cable Arduino

Cavo USB per Arduino UNO

Dupont wire set

Set di fili Dupont

Half_breadboard56a

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:

Block Diagram of AK8975
Diagramma a blocchi dell’AK8975 (source)

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:

Pinout of the AK8975
Pinout dell’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:

Indirizzo I2C e pin CAD0/1 (source)

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

AK8975 breakout board with CADY pin
Breakout board AK8975 con pin CADY

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.

Connecting AK8975 to Arduino
Collegare l’AK8975 all’Arduino

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.

Installing a .ZIP Arduino library
Installare una libreria Arduino da file .ZIP

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:

Output of AK8975 on Serial Monitor
Output dell’AK8975 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:

Output of HSCDTD008A on Serial Plotter
Output dell’AK8975 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 ; )