Il sensore ad ultrasuoni HC-SR04

E’ da tempo che mia moglie mi chiede un robottino per le pulizie di casa, così mi sto premunendo e ho cominciato col cercare dei sensori ad ultrasuoni economici, da utilizzare per evitare gli ostacoli durante il percorso. Cercando su ebay mi sono imbattuto in questi HC-SR04, venduti in Cina a prezzi davvero ottimi. Mi sono arrivati l’altro giorno (dopo oltre un mese). Devo dire la verità: per quello che li ho pagati mi ero già predisposto psicologicamente perchè fossero una “chiavica”. Ho fatto qualche prova utilizzando soltanto l’oscilloscopio e… mi sono dovuto ricredere, sono molto meglio di quello che mi aspettavo!

Gli HC-SR04 sono davvero molto piccoli. Peccato per i fori di fissaggio, inutilizzabili, nei quali potrebbero entrare soltanto viti da orologio!

La manifattura del sensore è buona, sulla parte frontale ci sono le due capsule ad ultrasuoni (trasmittente e ricevente), che hanno un diametro di 16mm e un quarzo da 4MHz. Il circuito si trova tutto sul retro del PCB e si notano subito 3 circuiti integrati: il famosissimo MAX232, probabilmente utilizzato per elevare la tensione di pilotaggio delle capsule, un amplificatore operazionale quadruplo LMC6034 della National e un microcontrollore di tipo OTP ad 8 bit mai visto prima, prodotto da un marchio cinese mai sentito: un EM78P153 della “Elan”.

Il sensore è molto piccolo: il PCB misura 2 x 4,5 cm ed è alto pressappoco 1,7 cm considerando pure lo spessore indotto dall’header di collegamento. Mi hanno solo deluso i 4 fori di fissaggio agli angoli, microscopici e assolutamente inutilizzabili anche con la vite più piccola normalmente disponibile agli hobbisti. L’unico modo che vedo per poterli fissare su un pannello è quello di utilizzare la colla a caldo (sistema che io odio), oppure fare due fori del diametro di 16mm, magari leggermente più piccoli, in cui incastrare le capsule.

Dopo questa considerazione di tipo “estetico/circuitale” passiamo al funzionamento. L’HC-SR04 va alimentato a 5V, ho provato a farlo funzionare a 3,3V ma non mi da gli stessi risultati: le risposte sono instabili, probabilmente a causa del fatto che il MAX232 non riesce a produrre la tensione necessaria per il pilotaggio della capsula. I pin di collegamento con il mondo esterno sono soltanto 4: 2 di alimentazione, Trigger ed Echo.

Il funzionamento è basilare: si tiene il pin Trigger a livello basso, dopodichè si fornisce un impulso a livello alto della durata di almeno 10µS e lo si riporta a livello basso. In questo momento la capsula trasmittente emette un burst (una sequenza di livelli alti/bassi) a circa 40KHz. L’onda ultrasonica colpisce il bersaglio, torna indietro e viene rilevata dalla capsula ricevente. Il microcontrollore a bordo del sensore calcola il tempo di andata e ritorno del segnale ed emette sul pin Echo, normalmente a livello basso, un segnale a livello alto di durata direttamente proporzionale alla distanza rilevata:

Il tempo che intercorre tra il trigger e il fronte di salita dell’echo non è importante e non ci interessa. Per misurare la distanza abbiamo bisogno soltanto di due I/O di un microcontrollore qualsiasi: uno da settare come uscita al quale collegare il trigger, e uno da settare come ingresso digitale per misurare la lunghezza dell’impulso dell’eco. Per questo può essere utilizzato un modulo CCP configurato in modalità Capture (se parliamo di un PICmicro ad 8 bit), un modulo Input Compare (se parliamo di un PICmicro a 16 o 32bit) o, ancora, un pin qualsiasi, che abbia magari l’interrupt sul cambio di stato, e un timer. Non è di questo che mi occuperò in questo articolo dato che per ora mi sono limitato a studiare il sensore, dato che datasheet fatti bene non ce ne sono: questo sensore è prodotto in Cina, e pare non abbia nessun marchio.

La prima cosa di cui mi sono preoccupato, ovviamente, è stata quella di stabilire il fattore che regola la proporzionalità tra la distanza dall’ostacolo e la lunghezza dell’impulso sul pin di echo. E’ stato qui che questo sensore mi ha lasciato a bocca aperta dato che, dopo varie prove, ho trovato una proporzionalità lineare ma soprattutto una ripetibilità delle misure davvero mostruosa.

Per le misurazioni ho fissato sul banco il sensore con del nastro adesivo, ho quindi fissato anche una riga metallica e ho posto una scatola di plastica rigida a varie distanze dal sensore, ho provato anche con una scatola in cartone pressato (non ondulato) ottenendo gli stessi risultati. Ogni volta che spostavo la scatola davo l’impulso a 5V sul trigger (in realtà ho notato che basta soltanto staccarlo da massa) e sull’oscilloscopio misuravo la lunghezza dell’impulso impostando il trigger dell’oscilloscopio sulla modalità sweep “normal” per fare in modo che il segnale non venisse acquisito di continuo e mi sparisse dallo schermo:

Ostacolo posto a 10cm
Echo rilevato con ostacolo posto a 10cm di distanza dal sensore. Durata 544uS

Ho riportato in questa tabella i valori misurati a varie distanze:

Distanza (cm)Echo (uS)
2112
5304
10544
15864
201150
251450
301710
352030
402320
452620
502900
553180
603480
653760
704060
754380
804640
854940
905240
955560
1005840
1056120
1106400

E’ facile con Excel o programmi simili plottare il risultato utilizzando un diagramma a dispersione per poter quindi inserire una linea di tendenza che ci fornisce l’equazione che lega i due valori:

Asse X: echo in uS, Asse Y: distanza in cm

Ho riportato la distanza sull’asse Y perchè è il valore sull’asse X (echo) che noi andremo a misurare e quindi da questo dobbiamo ricavare il valore di distanza. La relazione tra i due valori è perfettamente lineare, il valore di R2 non lascia dubbi. Nei calcoli da fare sul microcontrollore, per comodità eliminerei il +0,3011 e lascerei soltanto la moltiplicazione di X (del valore di echo espresso in µS) per 0,0171, che equivale ad una divisione per circa 58 (58,5). Lo stesso valore si può ottenere in maniera semplice facendo la media di tutti i rapporti tra distanza e echo: in questo caso viene fuori 57,9 . Posso quindi dire che, con ottima approssimazione:

Ricordo, però, che la velocità di trasmissione del suono è influenzata anche dal valore di umidità ambiente e dalla temperatura, per cui questo 58 potrebbe essere per voi 57 o 59. Ad ogni modo, dicevo prima, la linearità è quasi perfetta, ma quello che mi ha impressionato è stata la ripetibilità: dopo aver fatto varie misure, poi tornavo a mettere l’ostacolo in una posizione precedente, e all’oscilloscopio rileggevo lo stesso identico valore letto in precedenza per quella distanza.

Sotto i 2cm la risposta fornita non è più lineare, per cui dobbiamo tener conto di utilizzare il sensore da 2 cm a salire. Ad ogni modo è sempre possibile arretrare il sensore di 2cm rispetto al bordo più esterno dell’apparato in cui intendiamo montarlo e sottraiamo quindi 2cm dalla lettura fatta…

Da vari documenti trovati in rete pare che oltre 4 o 5metri non misuri più. In realtà la distanza massima che l’HC-SR04 riesce a rilevare è inferiore a quanto si pubblicizza in giro.

Ho provveduto a isolare entrambe le capsule mettendoci sopra della spugna e bloccandola con lo scotch. Oltre alla spugna ho provato anche a coprire le capsule con oggetti “solidi”. In queste condizioni ho misurato sempre, in ogni caso, un echo di 222mS (222000µS) che con la formula di prima dovrebbero corrispondere a 3,8metri. Questo significa che a 3,8 metri di sicuro questo sensore non ci arriva e il valore restituito di 222mS o più potrebbe essere usato per indicare un oggetto fuori dalla portata.

La distanza massima che sono riuscito a misurare è stata di 3,3 metri (echo di 19,2mS). La prova, però, non la si può fare con qualsiasi oggetto dato che oggetti con proprietà fonoassorbenti (quali potrebbe essere il rivestimento di un divano, una spugna o altro) falsano la misura: assorbono l’onda sonora emessa dal sensore e alla capsula di ricezione non torna più niente, per cui il sensore restituisce un segnale relativo ad “oggetto fuori campo” anche se avete posto l’ostacolo vicinissimo al sensore. Possiamo quindi assumere che se il sensore restituisce un echo di oltre 19/20 mS, vuol dire che c’è campo libero per altri 3 metri circa!

I datasheet rimasticati che si trovano in giro, quindi, non riportano valori veritieri. Sull’angolo visivo non posso fare commenti dato che questo è più difficile da verificare, soprattutto a distanze elevate. Ad ogni modo dato che questo sensore mi serve per piccole distanze, penso che le caratteristiche siano più che sufficienti… soprattutto considerato il prezzo!

Echo rilevato all’oscilloscopio a varie distanze

Se questo articolo ti è piaciuto, condividilo su un social:
Se l'articolo ti è piaciuto o ti è stato utile, potresti dedicare un minuto a leggere questa pagina, dove ho elencato alcune cose che potrebbero farmi contento? Grazie :)