In questo tutorial imparerai a utilizzare il sensore Hall Effect A3144 e un Arduino per costruire un tachimetro. Un tachimetro è un dispositivo che misura la velocità di un oggetto rotante. Ad esempio, è comune nelle applicazioni automobilistiche per monitorare i giri al minuto (RPM) di un motore.
Il sensore Hall Effect rileva la presenza di un campo magnetico. Fissando un piccolo magnete a un oggetto rotante, possiamo usarlo per contare le rivoluzioni. Con un Arduino possiamo poi misurare il tempo impiegato per un certo numero di rivoluzioni e calcolare gli RPM.
Nelle prossime sezioni elencherò i componenti necessari per questo progetto, spiegherò le basi dei sensori Hall Effect e presenterò il sensore Hall Effect A3144, che useremo per il nostro tachimetro. Fornirò anche esempi di diverse implementazioni di tachimetro usando il sensore A3144, inclusi un tachimetro semplice e uno più avanzato che utilizza gli interrupt.
Allora, iniziamo!
Componenti necessari
Qui sotto trovi i componenti necessari per questo progetto. Se vuoi solo esplorare e imparare sui sensori Hall Effect, acquista il modulo sensore. Sarà un po’ più facile da usare ma è troppo grande per applicazioni pratiche. In quel caso, meglio acquistare solo il sensore Hall Effect, che è molto più piccolo ed economico.

Arduino Uno

Cavo USB per Arduino UNO

Set di cavi Dupont

Kit di resistenze & LED

Modulo sensore Hall Effect A3144

Sensore Hall Effect A3144

Magneti
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.
Basi dei sensori Hall Effect
I sensori Hall Effect sono dispositivi elettronici che possono rilevare la presenza di un campo magnetico. Funzionano in base all’effetto Hall, che è la creazione di una differenza di tensione su un conduttore quando viene posto in un campo magnetico mentre vi scorre corrente.
Come funzionano?
I sensori Hall Effect sono composti da tre componenti principali: una sorgente di tensione, un conduttore attraversato da corrente e un campo magnetico. Quando un campo magnetico viene applicato perpendicolarmente al flusso di corrente nel conduttore, si crea una forza di Lorentz che spinge gli elettroni su un lato del conduttore. Questo genera una differenza di tensione attraverso il conduttore, che può essere misurata.

Applicazioni tipiche
Le applicazioni tipiche dei sensori Hall Effect sono:
- Rilevamento di prossimità : I sensori Hall Effect possono rilevare la presenza o l’assenza di un campo magnetico, rendendoli adatti per applicazioni di rilevamento di prossimità.
- Misurazione della velocità : Fissando un magnete a un oggetto rotante e usando un sensore Hall Effect per rilevare i cambiamenti del campo magnetico, è possibile misurare la velocità dell’oggetto.
- Rilevamento di corrente : I sensori Hall Effect possono misurare la corrente che scorre in un conduttore rilevando il campo magnetico generato dalla corrente.
- Rilevamento di posizione : Posizionando magneti in punti specifici e usando sensori Hall Effect, è possibile determinare la posizione di un oggetto.
Latching vs non-latching
I sensori Hall Effect possono essere suddivisi in latching o non-latching. I sensori latching hanno un campo magnetico integrato che li mantiene nello stato acceso o spento finché non viene applicato un altro campo magnetico di polarità opposta. I sensori non-latching, invece, rilevano solo la presenza di un campo magnetico e non mantengono lo stato. Useremo un sensore non-latching.
Bipolari vs unipolari
I sensori Hall Effect possono anche essere classificati come bipolari o unipolari. I sensori bipolari possono rilevare sia campi magnetici positivi che negativi, mentre quelli unipolari rispondono solo a una polarità. Il sensore Hall Effect A3144 è un sensore unipolare e reagisce solo a un polo del magnete.
Switching vs lineare
I sensori Hall Effect possono funzionare in modalità switching o lineare. I sensori switching forniscono un’uscita digitale, passando tra gli stati acceso e spento in base alla presenza o assenza di un campo magnetico. I sensori lineari, invece, forniscono un’uscita analogica che varia linearmente con l’intensità del campo magnetico. Useremo il sensore Hall Effect A3144, che è di tipo switching.
Sensori Hall Effect vs Relè Reed
Oltre al sensore Hall Effect, un altro tipo comune di interruttore magnetico è il relè Reed. Vediamo rapidamente le differenze tra i due.
I sensori Hall Effect offrono vantaggi come il rilevamento senza contatto, tecnologia a stato solido, risposta più rapida, ampia gamma di temperature operative e uscita digitale. Tuttavia, hanno una portata di rilevamento limitata, costo più elevato e sono sensibili ai campi magnetici parassiti.
I relè Reed, invece, hanno una portata di rilevamento più ampia, costo inferiore e non sono sensibili ai campi magnetici parassiti. Tuttavia, soffrono di usura meccanica, risposta più lenta e gamma di temperature operative limitata. Per maggiori dettagli dai un’occhiata al nostro tutorial su Interfacing Magnetic Switch To The Arduino .
Nella prossima sezione vedremo il sensore Hall Effect A3144 e le sue caratteristiche.
Presentazione del sensore Hall Effect A3144
Il sensore Hall Effect A3144 è un sensore magnetico fantastico e molto piccolo, ricco di elettronica.
Può funzionare con tensioni non regolate da 4,5 fino a 24 Volt grazie a un regolatore di tensione integrato. Inoltre, ha la protezione contro l’inversione di polarità, il che significa che se lo colleghi in modo errato sopravviverà. Il consumo di corrente è minimo, solo 3,5mA (a 5V), rendendolo adatto anche per applicazioni alimentate a batteria.
L’immagine qui sotto mostra il pinout. Se guardi il sensore dal davanti dove puoi leggere l’etichetta, il pin positivo (+) sarà a sinistra. Il Ground (-) è al centro e l’uscita del segnale (s) è il pin a destra.

Nota che l’A3144 è unipolare. Quindi reagirà solo a un polo del magnete e non all’altro. Ricordalo durante i test!
Il sensore ha un’uscita open-collector, il che significa che può essere collegato direttamente ai microcontrollori e può pilotare fino a 25mA. Approfitteremo di questa caratteristica collegando direttamente un LED per testarne il funzionamento.
Infine, il sensore A3144 ha un’alta sensibilità (2,5mV/Gauss), una frequenza operativa elevata di 2kHz e un ampio intervallo di temperatura operativa da -40°C a +150°C. In breve, è un ottimo sensore per quasi tutte le applicazioni che richiedono commutazione frequente, senza contatto e veloce.
Test del sensore Hall Effect A3144
Come menzionato tra i componenti necessari, puoi acquistare il sensore come modulo o solo il sensore nudo. Il modulo ha un LED integrato e una resistenza di pullup (R1) ed è quindi molto facile da testare. Basta collegare 5V (fino a 24V) al modulo e avvicinare il magnete al sensore. Il LED dovrebbe accendersi. Ma ricorda che il sensore è unipolare. Prova entrambi i poli del magnete. Un lato funzionerà, l’altro no.

Se vuoi testare il sensore nudo, dovrai collegare tu stesso un LED e una resistenza di pullup. Lo schema qui sotto mostra come fare.

Nota che la logica è invertita. Il LED si accenderà molto debolmente (a causa della resistenza da 10 KΩ) e si spegnerà quando il magnete si avvicina al sensore. Ricorda questo comportamento per dopo. In breve, l’uscita dell’A3144 andrà bassa quando viene rilevato un campo magnetico e sarà alta altrimenti.
A proposito: se vuoi testarlo su una breadboard usando l’alimentazione di Arduino, ecco i collegamenti. Non dimenticare la resistenza di pullup da 10 KΩ.

Nella prossima sezione ti mostro come collegare correttamente il sensore A3144 ad Arduino.
Collegamento del sensore Hall Effect A3144
La maggior parte dei collegamenti necessari li hai già visti sopra. L’unica differenza è che collegheremo l’uscita del sensore A3144 al Pin 2 di Arduino.

In sintesi, colleghiamo l’alimentazione da Arduino alla breadboard e da lì al sensore A3144. Poi aggiungiamo la resistenza di pullup da 10 KΩ e colleghiamo l’uscita dell’A3144 al Pin 2 di Arduino. Se hai problemi, qui sotto trovi la tabella completa dei collegamenti.
| Da | Pin | Colore filo | A | Pin |
| Arduino | 5V | Rosso | Breadboard | Rail positivo |
| Arduino | GND | Blu | Breadboard | Rail negativo |
| A3144 | GND | Blu | Breadboard | Rail negativo |
| A3144 | VCC | Rosso | Breadboard | Rail positivo |
| A3144 | Out/Signal | Giallo | Arduino | 2 |
| A3144 | Out/Signal | – | Resistenza | 1 |
| Resistenza | 2 | Rosso | Breadboard | Rail positivo |
Nella prossima sezione ti mostro come usare l’A3144 come semplice interruttore magnetico.
Esempio 1: Un interruttore magnetico
Dai un’occhiata al codice molto semplice qui sotto. Ogni 10ms leggiamo il valore del sensore e se il suo valore è LOW accendiamo il LED integrato di Arduino. Se avvicini un magnete al sensore, il LED dovrebbe accendersi.
const int hallPin = 2;
const int ledPin = 13; // built-in
void setup() {
pinMode(hallPin, INPUT);
pinMode(ledPin, OUTPUT);
}
void loop() {
int val = digitalRead(hallPin);
digitalWrite(ledPin, val ? LOW : HIGH);
delay(10);
}
Ecco una spiegazione dettagliata del codice.
Costanti e variabili
Il codice inizia definendo due costanti: hallPin e ledPin . La costante hallPin specifica il pin a cui è collegato il sensore Hall Effect, e la costante ledPin il pin per il LED integrato sulla scheda Arduino.
const int hallPin = 2; const int ledPin = 13; // built-in
Funzione setup
Nella funzione setup() , impostiamo la modalità di hallPin su INPUT e la modalità di ledPin su OUTPUT . Questo viene fatto usando la funzione pinMode() .
void setup() {
pinMode(hallPin, INPUT);
pinMode(ledPin, OUTPUT);
}
Funzione loop
All’interno della funzione loop() , prima leggiamo il valore del hallPin usando la funzione digitalRead() . Il valore letto dal pin sarà LOW quando viene rilevato un campo magnetico e HIGH altrimenti. Fai attenzione a questa logica invertita.
int val = digitalRead(hallPin);
Successivamente, usiamo la funzione digitalWrite() per controllare lo stato del ledPin in base al valore letto dal sensore Hall Effect. Se il valore è HIGH , significa che non è stato rilevato alcun campo magnetico e impostiamo il ledPin su LOW , spegnendo il LED. Altrimenti impostiamo il ledPin su HIGH , accendendo il LED.
digitalWrite(ledPin, val ? LOW : HIGH);
Infine, introduciamo un piccolo ritardo di 10 millisecondi usando la funzione delay() . Questo ritardo permette letture stabili e previene fluttuazioni rapide dello stato del LED.
delay(10);
E questo è tutto. Ora hai un semplice interruttore magnetico che rileva in modo affidabile e veloce i campi magnetici.
Puoi usare il codice sopra per costruire un finecorsa o un interruttore di inizio per un motore DC o stepper. Ad esempio, se vuoi ruotare un motore fino a una certa posizione – per esempio, una posizione di partenza definita di un motore passo-passo che muove un orologio dopo un blackout. Oppure la posizione finale di un motore stepper per una stampante 3D.
Per fare questo basta fissare un magnete sul motore per segnare la posizione desiderata e posizionare il sensore Hall nelle vicinanze. Se il sensore rileva il magnete, ferma il motore. Per implementarlo davvero dovresti commutare un relè invece di un LED, dato che i motori generalmente non possono essere controllati direttamente da un’uscita Arduino. Dai un’occhiata al nostro tutorial su How To Use A Relay With Arduino , se vuoi farlo.
Nella prossima sezione, usiamo lo stesso principio per misurare la velocità di rotazione di un motore.
Esempio 2: Un tachimetro semplice
Nel primo esempio abbiamo scritto il codice per rilevare quando il magnete è vicino al sensore. Se contiamo quante volte succede in un certo intervallo di tempo, possiamo misurare la velocità di un oggetto rotante. Costruiamo questo tachimetro fissando il magnete da qualche parte sull’oggetto rotante e ogni volta che passa davanti al sensore Hall Effect lo contiamo come una rotazione.
const int hallPin = 2;
const int maxCnt = 100;
void setup() {
Serial.begin(9600);
pinMode(hallPin, INPUT);
}
void loop() {
unsigned long start = micros();
int old = 1;
int cnt = 0;
while (cnt < maxCnt) {
int val = digitalRead(hallPin);
if (!val && val != old) cnt++;
old = val;
}
float seconds = (micros() - start) / 1000000.0;
float rpm = cnt / seconds * 60.0;
Serial.print("rpm: ");
Serial.println(rpm);
}
Questo è ciò che fa il codice sopra. Vediamo più da vicino come funziona nel dettaglio.
Costanti e variabili
Il codice inizia definendo due costanti: hallPin e maxCnt . La costante hallPin specifica il pin a cui è collegato il sensore Hall Effect, e la costante maxCnt imposta il valore massimo di conteggio. Contiamo fino a max conteggi e poi misuriamo il tempo trascorso per calcolare la velocità.
const int hallPin = 2; const int maxCnt = 100;
Funzione setup
Nella funzione setup() , inizializziamo la comunicazione seriale a 9600 baud usando Serial.begin(9600) . Impostiamo anche il hallPin come pin di input usando pinMode(hallPin, INPUT) .
void setup() {
Serial.begin(9600);
pinMode(hallPin, INPUT);
}
Funzione loop
La funzione loop() è dove viene implementata la funzionalità principale del tachimetro. Iniziamo ottenendo il tempo attuale usando micros() e lo salviamo nella variabile start . Inizializziamo anche la variabile di lettura del sensore old a 1 e la variabile cnt a 0.
void loop() {
unsigned long start = micros();
int old = 1;
int cnt = 0;
All’interno del ciclo while, il codice legge il valore del hallPin usando digitalRead(hallPin) e lo salva nella variabile val . Se il valore è 0 (campo magnetico rilevato) e diverso dal valore precedente ( val != old ), incrementa la variabile cnt .
while (cnt < maxCnt) {
int val = digitalRead(hallPin);
if (!val && val != old) cnt++;
old = val;
}
Questo è importante. Non possiamo semplicemente contare ogni volta che rileviamo uno 0 (magnete rilevato) perché conteremmo più volte mentre il magnete è vicino. Dobbiamo contare solo quando c’è un cambio di stato. O da 1 a 0 (Falling Edge) o da 0 a 1 (Rising Edge). Guarda l’immagine qui sotto che mostra l’output del Serial Plotter con due rilevamenti del magnete di durata diversa.

Nel codice sopra contiamo solo quando il sensore passa da 0 ( !val ) a 1 ( val !=old ). In breve, rileviamo il fronte di salita del segnale.
Dopo il ciclo while, calcoliamo il tempo trascorso in secondi sottraendo il tempo start da quello attuale usando micros() e dividendo per 1000000.0. Da qui calcoliamo gli RPM (rotazioni al minuto) dividendo il cnt per il tempo trascorso in secondi e moltiplicando per 60 (un minuto).
float seconds = (micros() - start) / 1000000.0; float rpm = cnt / seconds * 60.0;
Infine, il codice stampa il valore RPM calcolato sul monitor seriale usando Serial.print() e Serial.println() .
Serial.print("rpm: ");
Serial.println(rpm);
}
Per provare il codice, fissa un magnete nell’orientamento giusto su un oggetto rotante, ad esempio una ventola di raffreddamento. Poi avvicina il sensore abbastanza e assicurati che il magnete passi davanti al sensore a ogni rotazione. Se ora esegui il codice, dovresti riuscire a misurare gli RPM della ventola.

Il codice sopra dovrebbe funzionare bene. Ma per oggetti che ruotano più velocemente e misurazioni più accurate possiamo fare ancora meglio usando gli interrupt. Ti mostro come funziona nella prossima sezione.
Esempio 3: Un tachimetro più veloce con gli interrupt
L’esempio di codice sopra usa un ciclo per interrogare lo stato del sensore Hall Effect e se rileviamo un cambio di stato da 0 a 1 lo contiamo come una rotazione. Tuttavia, la velocità di Arduino è limitata. Se l’oggetto ruota più velocemente di quanto possiamo interrogare, perderemo cambi di stato e conteremo meno.
Gli interrupt risolvono questo problema. Invece di interrogare e cercare cambi di stato, colleghiamo un interrupt al pin del sensore e ogni volta che lo stato cambia viene chiamata una ISR (interrupt service routine). Questo sarà molto più veloce e il codice è anche più semplice. Dai un’occhiata:
const int hallPin = 2;
const int maxCnt = 100;
volatile int cnt = 0;
void count() {
cnt++;
}
void setup() {
Serial.begin(9600);
pinMode(hallPin, INPUT);
attachInterrupt(digitalPinToInterrupt(hallPin), count, FALLING);
}
void loop() {
unsigned long start = micros();
while (cnt < maxCnt) ;
float seconds = (micros() - start) / 1000000.0;
float rpm = cnt / seconds * 60.0;
Serial.print("rpm: ");
Serial.println(rpm);
cnt = 0;
}
Vediamo nel dettaglio come funziona.
Costanti e variabili
Il codice inizia definendo costanti e variabili.
const int hallPin = 2; const int maxCnt = 100; volatile int cnt = 0;
Come prima, la costante hallPin specifica il pin a cui è collegato il sensore Hall Effect e la costante maxCnt imposta il conteggio massimo. La variabile cnt serve per tenere traccia del numero di rotazioni. Nota che è dichiarata come ” volatile “. Questo è necessario perché la useremo all’interno di una interrupt service routine. Ne parliamo meglio nella prossima sezione.
Funzione di conteggio
La funzione count() è la interrupt service routine (ISR) che viene chiamata ogni volta che il sensore Hall Effect rileva un fronte di discesa sul hallPin . Le ISR dovrebbero essere il più brevi possibile. Nel nostro caso la funzione si limita a incrementare la variabile cnt di uno, il che è perfetto per una ISR.
void count() {
cnt++;
}
Funzione setup
Nella funzione setup() , inizializziamo la comunicazione seriale e impostiamo il hallPin come input. La cosa più importante è che colleghiamo interrupt al hallPin che attiva la funzione count() su un fronte di discesa.
Nota che non tutti i pin possono essere usati per gli interrupt! Dipende dal microcontrollore. Nel caso di Arduino Uno solo i pin 2 e 3 possono essere usati per gli interrupt.
void setup() {
Serial.begin(9600);
pinMode(hallPin, INPUT);
attachInterrupt(digitalPinToInterrupt(hallPin), count, FALLING);
}
Funzione loop
Nella funzione loop() otteniamo il tempo attuale usando la funzione micros() . Poi entriamo in un ciclo while che semplicemente aspetta finché la variabile cnt non raggiunge il valore maxCnt . Questo assicura che abbiamo contato abbastanza rotazioni per calcolare la velocità in modo accurato. Nota che il contatore viene incrementato fuori dal ciclo, all’interno della interrupt service routine count() . In breve, Arduino aspetta nel ciclo while, mentre in parallelo reagisce agli interrupt chiamando la funzione count() .
Quando abbiamo ricevuto abbastanza conteggi il ciclo while termina. Poi calcoliamo gli RPM (rotazioni al minuto) come prima e dopo aver azzerato la variabile cnt , il ciclo principale ricomincia.
void loop() {
unsigned long start = micros();
while (cnt < maxCnt) ;
float seconds = (micros() - start) / 1000000.0;
float rpm = cnt / seconds * 60.0;
Serial.print("rpm: ");
Serial.println(rpm);
cnt = 0;
}
Per misurazioni più accurate ma più lente della velocità di rotazione aumenta il valore della costante maxCnt . Farai la media su più rotazioni, ottenendo letture più stabili ma ci vorrà più tempo. Un valore maxCnt più basso ti darà letture RPM più veloci ma più fluttuanti.
Ecco fatto! Con questo codice puoi costruire un tachimetro usando Arduino e un sensore Hall Effect per misurare la velocità di un oggetto rotante.
Conclusione
In questo tutorial abbiamo imparato come costruire un tachimetro usando un sensore Hall Effect e un Arduino. Abbiamo iniziato comprendendo le basi dei sensori Hall Effect e poi presentato il sensore Hall Effect A3144, comunemente usato nelle applicazioni di misurazione della velocità.
Poi abbiamo testato il sensore A3144 per assicurarci che funzionasse e lo abbiamo collegato ad Arduino. Abbiamo esplorato tre diversi esempi per mostrare la versatilità del sensore.
Nell’esempio 1 abbiamo usato il sensore A3144 come interruttore magnetico, rilevando la presenza o l’assenza di un campo magnetico. Questo può essere utile in varie applicazioni come sensori per porte/finestre o rilevamento di prossimità.
Nell’esempio 2 abbiamo costruito un tachimetro semplice usando il sensore A3144. Fissando il sensore a un oggetto rotante, siamo riusciti a misurare la sua velocità in giri al minuto (RPM). Questo può essere utile per monitorare la velocità di un motore o di una ventola.
Nell’esempio 3 abbiamo migliorato il tachimetro semplice utilizzando gli interrupt. Configurando Arduino per attivare un interrupt ogni volta che il sensore A3144 rileva un magnete, abbiamo ottenuto misurazioni RPM più accurate e affidabili.
Seguendo questo tutorial, ora dovresti avere una buona comprensione di come usare il sensore Hall Effect A3144 con Arduino per costruire un tachimetro. Se hai domande o hai bisogno di ulteriore assistenza, dai un’occhiata alla sezione delle domande frequenti.
Buon divertimento con i tuoi esperimenti!
Domande frequenti
Ecco alcune domande comuni sulla costruzione di un tachimetro usando un sensore Hall Effect con Arduino:
D: Cos’è un tachimetro?
R: Un tachimetro è un dispositivo usato per misurare la velocità di un oggetto rotante. Fornisce informazioni sulla velocità di rotazione in giri al minuto (RPM).
D: Cos’è un sensore Hall Effect?
R: Un sensore Hall Effect è un trasduttore che rileva la presenza di un campo magnetico. Funziona secondo il principio dell’effetto Hall, che afferma che quando un conduttore attraversato da corrente viene posto in un campo magnetico, si genera una tensione perpendicolare sia alla corrente che al campo magnetico.
D: Quali sono i vantaggi dei sensori Hall Effect?
I sensori Hall Effect sono generalmente immuni a rumore, luce o temperatura. Poiché non hanno parti meccaniche reagiscono velocemente e durano praticamente per sempre. Inoltre, sono molto piccoli e quindi possono essere inseriti in spazi ristretti.
D: Perché usare un sensore Hall Effect per un tachimetro?
R: I sensori Hall Effect sono comunemente usati nei tachimetri perché possono misurare con precisione la velocità di oggetti rotanti senza contatto fisico. Questo li rende ideali per applicazioni dove è richiesta una misurazione della velocità non invasiva.
D: Perché il sensore Hall Effect non reagisce?
R: Assicurati che tutto sia collegato correttamente. L’A3144 è un sensore Hall Effect unipolare e reagisce solo a un polo del magnete. Controlla che il tuo magnete sia abbastanza forte.
D: Posso usare l’A3144 per misurare l’intensità di un campo magnetico
L’A3144 è un sensore Hall Effect di tipo switching e non è adatto a questo scopo. Avresti bisogno di un sensore Hall Effect lineare
D: Posso usare l’A3144 con un ESP32
Non direttamente. L’A3144 funziona a 5V mentre l’ESP funziona a 3,3V. Avresti bisogno di un adattatore di livello di tensione.



