Il sensore ad ultrasuoni HC-SR04

Giovanni Bernardo | 11 aprile 2012
Categorie: Sensori

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ù (sono tutti discordanti, che bella cosa). 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 serve per indicare un oggetto fuori dal campo “visivo”.

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



Questo articolo ti è stato utile? Ti ha permesso di risolvere un problema o di migliorare le tue applicazioni? Ci lavori? Ti ha permesso di scrivere la tua tesina? Ti ha semplicemente fatto spendere un po' del tuo tempo in maniera costruttiva? Allora clicca il banner qui sotto:

Puoi andare alla fine dell'articolo e lasciare un commento. I trackback e i ping non sono attualmente consentiti.

  1. #1 da Andrea Barbon il 11 aprile 2012

    Il nome elan mi ricorda la elan tech, l’azienda che fornisce i touchpad capacitivi multitouch ai vari produttori di pc portatili, però non so se è la stessa…

  2. #3 da Danyele il 11 aprile 2012

    Davvero interessante…sapresti indicare la direzionalità del sensore stesso?cioè se ne metto due affiancati con due ostacoli perfettamente scuri agli ultrasuoni, a due distanze differenti…quanto l’uno disturba l’altro?

    • #4 da Giovanni Bernardo il 11 aprile 2012

      Questo non so dirtelo, dipende dall’angolo visivo. Ad ogni modo se metti due sensori vicino e ne triggeri soltanto uno, l’altro non può ricevere, per cui il problema non dovrebbe esistere.

  3. #5 da Marco Pozzuolo il 11 aprile 2012

    Ne ho presi due anche io, per usi futuri, ma non pensavo cisì presto.
    Sto progettando e costruendo un rover e questi sensori dovevano essere gli occhi.
    Attendo con ansia l’articolo per usarmi con i PIC8, io programmo in MIkrobasic, ma spesso riesco a fare il porting :-).

    PS i robot delle pulizie (posseggo il roomba) hanno una combinazione di Ultrasuoni e Sensore a contatto. Quando il roomba arriva vicino al muro a circa 3cm, rallenta improvvisamente e poi si blocca quando i sensori di contatto toccano il muro. Credo sia per ovviare all’imprecisione della lettura sotto i 2 cm.

    • #6 da Giovanni Bernardo il 11 aprile 2012

      I sensori ultrasuoni buoni ci arrivano eccome sotto ai 2 cm, non per niente ci sono sensori che costano più di 20 euro, li ovviamente le caratteristiche sono eccezionali, angolo di visione stretto, linearità perfetta, distanze coperte maggiori, migliore costruzione e qualità della componentistica ecc.
      Perchè 2 sensori? Io ho intenzione di usarne 3, uno frontale e due laterali a 45°

      • #7 da Marco Pozzuolo il 12 aprile 2012

        2 sensori perchè in realtà su quel sito avevo ordinato altro, e ne avevo presi 2 così per provarli, ma senza un progetto in mente………tanto dalla Cina spediscono spesso Gratis….. :-))

  4. #8 da Marco Pozzuolo il 22 aprile 2012

    Ciao Giovanni,
    ho visto che hai pubblicato un articolo per utilizzare questi sensori su Orbit16. Non ho la piattaforma e quindi non ho accesso al codice e agli schemi.
    Io lavoro ancora con dei PIC18F, volevo avere qualche dritta per poter utilizzare i sensori, magari qualche link di esempio, oppure qualche dritta di come emettere il trigger e conteggiare il ritardo dell’echo. Sarebbe ottimo se pubblicassi qualcosa anche per PIC a 8bit.

    Ti ringrazio

  5. #10 da gcupini il 24 maggio 2012

    Ciao Giovanni,
    Entusiasta del tuo articolo ho ordinata bel 4 HC-SR04. Il prezzo attorno ai 5 Euro veramente alettante. Purtroppo sono stato veramente sfortunato! nessuno dei 4 funziona !
    In un primo momento ho pensato che il mio programma non fosse corretto nell’inviare il segnale di TRIGGER, per verificare ho preso un SRF05- ha 5 piedini ma i 4 sono corrispondenti a quelli di SR04. E anto al primo inserimento con i cavetti e il programma cun cui provavo HC-SR04.
    Dubbioso che tutti 4 gli HC-SR04 fossero “fasulli”, Mi sono armato di oscilloscopio per verificare TRIG ed ECHO; dopo l’invio del trig per 5, 10 or 20 uS ottendo sempre in risposta un echo che varia da 0 a 6 uS. indipendentemente da tutto.
    A tuo parere ci sono Rimedi ? A parte la richiesta di restituzione.
    Salutoni

    • #11 da Giovanni Bernardo il 24 maggio 2012

      Piuttosto strano. Io fin’ora ne ho acquistati 8 e non ho mai avuto nessun problema. Poi un’echo di 6uS… non è normale. O avete problemi con l’alimentazione… o state conducendo le prove in maniera sbagliata… Che tutti e 4 capitano rotti è piuttosto strano… vuol dire che la sfiga si è accanita.

  6. #12 da gippo il 28 giugno 2012

    Molto interessante… :)
    Solo per completezza… il segnale echo resta alto dal momento in cui viene inviata l’onda fino a quando la stessa viene ricevuta… quindi la relazione dipende dalla velocità di propagazione del suono ovvero:

    distanza = durata del segnale di echo * 340 (m/s) / 2 ossia, con i dovuti adattamenti delle unita di misura, il 58 a denominatore trovato da Giovanni!! :)

    Io li ho trovati a circa 1,30 euro ciascuno spedizione inclusa!! :O

  7. #13 da cereda il 6 novembre 2013

    Ho scoperto solo ora Arduino ed i sensori. Ho intenzione di creare un prototipo di bilancia peso/volume per una applicazione specifica. Vengo al dunque, sto effettuando dei test con i sensori HR-SR04, ma ho grossissimi problemi di ripetibilità dei dati. Tenendo i tre sensori puntati contro una parete a circa 1 mt di distanza il segnale varia al punto che la conversione è in un range di 10 cm per tutti i sensori. Ho visto la recensione di Giovanni Bernardo e mi chiedo quali possano essere le problematiche che possono portare ad avere queste differenze di risultato. Tenete presente che sono un programmatore, non un esperto di componenti elettronici e tanto meno dispongo od ho conoscenze per verificare con un oscilloscopio. Grazie per le eventuali risposte
    Saluti

  8. #14 da manuel_4 il 1 aprile 2014

    Buongiorno,
    Mi sono iscritto al Vs sito alcuni giorni fa quando ho cominciato a seguire, spinto da un forte interesse le sue lezioni sulla programmazione dei picmicro in C che ho trovato davvero esaustive e perfettamente chiare ergo, complimenti!
    Premetto che sono alle prime armi con la programmazione dei pic e mi sono addentrato nell’argomento per puro interesse personale.
    Veniamo al dunque, leggendo il suo articolo sul sensore HC-SR04 mi è venuta in mente un’applicazione che vorrei sviluppare però mi mancano alcune nozioni necessarie riguardo all’utilizzo dei moduli CCP presenti nei PIC micro.
    In pratica vorrei realizzare un semplice circuito che accenda progressivamente una barra di led all’avvicinarsi di un oggetto al sensore.
    Questo è possibile (da quanto ho imparato) utilizzando il modulo CCP in modalità capture del pic 16f877 (quello usato come riferimento nelle sue lezioni) per acquisire e misurare l’onda quadra “echo” del sensore in questione.
    Ora, cercando su internet sono riuscito a reperire solo alcune informazioni:
    il settaggio del registro CCPxCON per definire a seguito di quale evento il pic acquisisce il valore del timer;
    il settaggio del timer che si vuole usare (con relativo prescaler) e questo l’ho imparato grazie a lei, ma poi riguardo a cosa fare successivamente non sono riuscito a reperire niente di utile.
    Consapevole del fatto che mi mancano ancora numerose nozioni al riguardo prima di poter avanzare qualche bozza di codice per l’esperimento in questione, mi rivolgo a chi mi ha introdotto nel mondo di questi piccoli ma incredibilmente capaci dispositivi, lei, chiedendole se può darmi una mano nel comprendere anche questo “capitolo” dei microcontrollori pic.

Devi essere collegato per lasciare un commento.

  1. Ancora nessun trackback
Settorezero.com e il logo Zroid™ ©2007÷2018 Giovanni Bernardo - E' vietata la copia e la distribuzione anche parziale dei contenuti di questo sito web senza l'esplicito consenso dell'autore. I contenuti di settorezero.com sono distribuiti sotto una licenza Creative Commons Attribuzione-Non Commerciale-Non Opere derivate 2.5 Italia e sono soggetti alle condizioni definite nel disclaimer. Settorezero.com e tutti i suoi contenuti sono tutelati dalla legge sul diritto d'autore per cui i trasgressori sono perseguibili a norma di legge. Settorezero fa uso dei cookie leggi l'informativa estesa. Il tema di questo sito è basato sul tema Fusion per wordpress, realizzato originariamente da digitalnature e fa uso del plugin Wassup per il computo delle statistiche. Per contattare l'autore siete pregati di utilizzare la sezione contatti. Siamo presenti anche su Facebook e, meno assiduamente, anche su Twitter - Tumblr - Google+ - Blogspot - Youtube.
Creative Commons BY-NC-ND 2.5