In questo tutorial imparerai come utilizzare il magnetometro a 3 assi HSCDTD008A con un Arduino. L’HSCDTD008A è essenzialmente una bussola elettronica o digitale che ti permette di misurare l’intensità del campo magnetico terrestre (e di altre fonti magnetiche) lungo tre assi.
I magnetometri possono essere usati in molte applicazioni diverse. Possono aiutare i sistemi di navigazione a trovare direzione e orientamento. In robotica migliorano la consapevolezza spaziale e mantengono i robot sulla giusta traiettoria. Gli smartphone li usano per le funzioni bussola e realtà aumentata. I droni li utilizzano per stabilizzazione e navigazione. Dispositivi indossabili come fitness tracker e smartwatch usano i magnetometri per tracciare attività e navigazione.
Componenti necessari
Per questo progetto ti serviranno un sensore magnetico HSCDTD008A e un microcontrollore. Io ho usato un Arduino Uno, ma qualsiasi altro Arduino o scheda ESP32/ESP8266 funzionerà altrettanto bene.

Magnetometro a 3 assi HSCDTD008A

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’HSCDTD008A
L’HSCDTD008A è un sensore minuscolo (1,6×1,6×0,65 mm) che può misurare l’intensità dei campi magnetici lungo tre assi con una precisione di 0,15μT / LSB (T = Tesla). L’immagine sotto mostra il chip vero e proprio – un piccolo quadrato.

I tre assi del sensore sono orientati come mostrato sotto e il valore di uscita di ogni asse è positivo quando rivolto verso il nord magnetico.

A seconda dell’orientamento del chip rispetto a un campo magnetico (ad esempio il campo magnetico terrestre), il valore di uscita per ogni asse cambierà. Questo ti permette, per esempio, di navigare determinando l’orientamento del sensore nello spazio.
Schema a blocchi interno dell’HSCDTD008A
L’immagine seguente mostra lo schema a blocchi interno dell’HSCDTD008A. Puoi facilmente identificare il sensore magnetico a 3 assi, il multiplexer (MUX) usato per leggere i 3 assi, il convertitore analogico-digitale (AD) per il sensore di temperatura e l’interfaccia I2C.

Il sensore di temperatura è necessario perché la tensione di uscita di un sensore magnetico può variare significativamente con la temperatura, quindi l’HSCDTD008A ha un sensore di temperatura integrato per compensare le variazioni della temperatura ambiente.
I pin IO dell’HSCDTD008A sono i seguenti: AVDD è la tensione di alimentazione analogica, DVDD è la tensione di alimentazione digitale, VSS è la massa, SDA e SCL sono le linee dell’interfaccia I2C, DRDY è un pin di interrupt che segnala che i dati sono pronti, e TEST1 e TEST2 sono punti di test interni durante la produzione del chip.
Per maggiori dettagli consulta il datasheet dell’HSCDTD008A che è linkato qui sotto:
Scheda breakout per l’HSCDTD008A
L’HSCDTD008A è troppo piccolo per essere collegato direttamente a un Arduino e inoltre non funziona a 5V. Perciò, di solito serve una scheda breakout come quella mostrata sotto. Il piccolo chip quadrato al centro è l’HSCDTD008A. La scheda ha anche un regolatore di tensione, così puoi collegarla a microcontrollori a 5V o 3,3V.

A parte l’alimentazione, i pin sono essenzialmente gli stessi discussi per lo schema a blocchi interno. VCC è la tensione di alimentazione, GND è la massa, SDA e SCL sono le linee dell’interfaccia I2C, DRY è il pin data ready, e T0 e T1 sono punti di test che non ti serviranno.
Il consumo di corrente del modulo è tipicamente di 60μA quando attivo e solo 3μA in modalità standby. Come detto prima, la tensione di alimentazione è da +3,3V a +5V e il livello di comunicazione è 3,3V.
Collegare l’HSCDTD008A all’Arduino
Grazie all’interfaccia I2C dell’HSCDTD008A, collegarlo a un Arduino è semplice. Prima collega i pin SCL e SDA della scheda breakout HSCDTD008A ai corrispondenti pin sull’Arduino come mostrato sotto. Poi collega la massa a GND e 3,3V (o 5V) a VCC dell’HSCDTD008A e il gioco è fatto.

Ora scriviamo un po’ di codice per testare il funzionamento del sensore HSCDTD008A.
Codice per misurare il campo magnetico con HSCDTD008A
Prima di poter misurare i campi magnetici con il sensore HSCDTD008A, dovrai installare una libreria. Nel seguito useremo la HSCDTD008A Library di Bob Veringa. Per installarla, cerca semplicemente HSCDTD008A nel Library Manager, trova quella di Bob Veringa e premi “INSTALL”. L’immagine sotto mostra come appare:

Con la libreria installata, proviamo il sensore. Il codice seguente legge l’intensità del campo magnetico lungo i tre assi (X, Y e Z) e li stampa sul monitor seriale ogni mezzo secondo.
#include "hscdtd008a.h"
HSCDTD008A geomag;
void setup() {
Serial.begin(9600);
geomag.begin();
hscdtd_status_t status = geomag.initialize();
if (status != HSCDTD_STAT_OK) {
Serial.println("Can't initialize sensor!");
}
geomag.temperatureCompensation();
}
void loop() {
hscdtd_status_t status = geomag.startMeasurement();
if (status == HSCDTD_STAT_OK) {
Serial.print("X:");
Serial.println(geomag.mag.mag_x);
Serial.print("Y:");
Serial.println(geomag.mag.mag_y);
Serial.print("Z:");
Serial.println(geomag.mag.mag_z);
}
delay(500);
}
Analizziamo il codice nelle sue componenti per una comprensione più chiara.
Inclusione della libreria
La prima riga include la libreria necessaria per il magnetometro HSCDTD008A. Questa libreria contiene le funzioni e le definizioni necessarie per comunicare con il sensore.
#include "hscdtd008a.h"
Creazione di un’istanza
Qui creiamo un’istanza della classe HSCDTD008A chiamata geomag. Questa istanza ci permetterà di accedere alle funzioni definite nella libreria per interagire con il magnetometro.
HSCDTD008A geomag;
Funzione setup
Nella funzione setup() inizializziamo la comunicazione seriale a 9600 baud. Questo ci permette di inviare dati al monitor seriale per debug e monitoraggio.
Serial.begin(9600);
Poi chiamiamo il metodo begin() sull’istanza geomag per inizializzare il magnetometro. Successivamente controlliamo lo stato dell’inizializzazione usando il metodo initialize(). Se lo stato non è HSCDTD_STAT_OK, stampiamo un messaggio di errore sul monitor seriale.
geomag.begin();
hscdtd_status_t status = geomag.initialize();
if (status != HSCDTD_STAT_OK) {
Serial.println("Can't initialize sensor!");
}
Infine chiamiamo il metodo temperatureCompensation() per assicurarci che le letture del sensore siano corrette in base alla temperatura ambiente, che può influenzare le misurazioni magnetiche.
geomag.temperatureCompensation();
Funzione loop
Nella funzione loop() avviamo una misurazione chiamando il metodo startMeasurement(). Controlliamo di nuovo lo stato di questa operazione. Se lo stato è HSCDTD_STAT_OK, procediamo a leggere i valori del campo magnetico.
hscdtd_status_t status = geomag.startMeasurement();
if (status == HSCDTD_STAT_OK) {
Stampiamo quindi i valori del campo magnetico per gli assi X, Y e Z sul monitor seriale. I valori sono accessibili tramite la proprietà mag dell’istanza geomag e sono espressi in micro Tesla (µT):
Serial.print("X:");
Serial.println(geomag.mag.mag_x);
Serial.print("Y:");
Serial.println(geomag.mag.mag_y);
Serial.print("Z:");
Serial.println(geomag.mag.mag_z);
Infine introduciamo un ritardo di 500 millisecondi prima che inizi il ciclo di misurazione successivo, per permettere una lettura chiara 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 per le tue applicazioni.
Conclusioni
In questo tutorial hai imparato come usare il magnetometro a 3 assi HSCDTD008A con un Arduino. Le applicazioni comuni per un magnetometro sono come bussola digitale e per migliorare la precisione nella navigazione di robot o droni.
Nota che, sebbene i magnetometri siano simili ai sensori ad effetto Hall, di solito non sono adatti per le stesse applicazioni come la misurazione di corrente o la misurazione senza contatto della velocità di oggetti rotanti. Vedi il nostro tutorial Read Fan Speed Signal with Arduino e ACS712 Current Sensor And Arduino, se vuoi saperne di più a riguardo.
Buon divertimento con il tinkering ; )

