In questo articolo vi spiegherò come funziona e come usare, in special modo con Arduino, il sensore di distanza ad ultrasuoni HC-SR04. Vediamo anche come inviare i dati al monitor seriale, e come calcolare la variazione della velocità del suono per avere delle misure più precise. Alla fine vedremo anche uno sketch per utilizzare i sensori ad ultrasuoni sulla macchina.
Curiosità: anche gli animali utilizzano gli ultrasuoni. Ad esempio il pipistrello utilizza gli ultrasuoni per localizzare ostacoli e prede.
In questo progetto useremo la celebre board Arduino, acquistabile da Conrad, ed il sensore di distanza HC-SR04.
Il sensore è costituito da una scheda, con a bordo integrati ed altri componenti, davanti un oscillatore e due cilindri vuoti; uno di questi invia ultrasuoni che rimbalzano contro il generico oggetto posto di fronte ad esso ed entrano nell'altro cilindro. Il sensore misura il tempo che ha impiegato il suono e da questo si può ricavare la distanza.
L'HC-SR04 è un sensore digitale ed utilizza due pin, uno per inviare il suono ed uno per riceverlo. Esso misura una distanza compresa tra 2 e 400 cm con una precisione di 3 mm.
Caratteristiche tecniche:
- Tensione di lavoro: 5 v;
- Corrente assorbita: 15 mA;
- Frequenza di lavoro: 40 Hz;
- Distanza max: 400 cm;
- Distanza min: 2 cm;
- Angolo di misura: 15°.
Funzionamento
- Bisogna inviare un impulso di 10 us al sensore sul pin trig;
- Il sensore invia 8 impulsi di ultrasuoni ad una frequenza di 40 Hz;
- Bisogna calcolare il tempo da quando si è mandato il primo impulso fino a quando riceve un impulso sul pin echo.
Per fare il calcolo della distanza la formula base è:
Distanza = tempo * velocità del suono / 2 = tempo * 3,4 * 10^-2 / 2
Velocità di propagazione delle onde sonore
La velocità di propagazione di un’onda sonora dipende fondamentalmente dal mezzo che deve attraversare e non dalle caratteristiche del suono. La velocità delle onde aumenta all’aumentare della temperatura e della densità del mezzo e per quanto riguarda quelli presi in esame, essa è:
Mezzo | Velocità (m/s) |
Aria | 340 |
Acqua | 1480 |
Acciaio | 5980 |
Ma concentriamoci sulla velocità delle onde sonore in base alla temperatura. L’equazione che ci permette di venir a conoscenza della stessa è per l’aria la seguente:
V = 331.4 + 0.62 * T
Se si vuole calcolare la distanza in modo più preciso è quindi necessario tenere conto della temperatura dell'ambiente. Quindi bisogna usare anche un sensore di temperatura.
Utilizzo con Arduino
Per questo sensore non esistono librerie, visto che l'utilizzo è molto semplice.
Ecco uno sketch che misura la distanza e la trasmette al PC tramite il monitor seriale.
/* Per HC-SR04 Temperatura di 20 *C VVC del sensore connesso a +5V GND del sensore connesso a GND TRIG del sensore connesso al pin digitale 12 ECHO del sensore connesso al pin digitale 13 */ const int TRIG_PIN = 12; const int ECHO_PIN = 13; void setup() { // Inizializza la comunicazione seriale: Serial.begin(9600); pinMode(TRIG_PIN,OUTPUT); pinMode(ECHO_PIN,INPUT); } void loop() { long durata, distanza; // Dare un corto segnale basso per poi dare un segnale alto puro: digitalWrite(TRIG_PIN, LOW); delayMicroseconds(2); digitalWrite(TRIG_PIN, HIGH); delayMicroseconds(10); digitalWrite(TRIG_PIN, LOW); durata = pulseIn(ECHO_PIN,HIGH); // Converti il tempo in distanza: distanza = durata / 29.1 / 2 ; if (distanza <= 0){ Serial.println("Out of range"); } else { Serial.print(distanza); Serial.println("cm"); Serial.println(); } delay(1000); }
Lo sketch che vediamo adesso è più complesso e serve per essere precisi nelle misure anche con il variare della temperatura ambientale. Per misurare la temperatura si può utilizzare il sensore BMP085 descritto in questo articolo o il sensore DHT11 descritto in questo articolo:
Io ho scritto lo sketch per il BMP085.
Trovate lo sketch in allegato nel file ZIP in fondo alla pagina.
Sensori per Auto/Ape Car o altro mezzo
Per l'Ape Car di un mio amico ho realizzato un sensore di retromarcia, con due sensori ad ultrasuoni, un sensore di temperatura e umidità, un RTC e un display acquistabile da Conrad.
Come sensore di temperatura e umidità ho usato il DHT-22, che misura la temperatura da -40 °C a +80 °C con un accuratezza di 0.5 °C. Misura anche l’umidità da 0% a 100% con un accuratezza da 2% a 5%. È un sensore lento, che bisogna leggere massimo ogni due secondi, ma da’ buoni risultati.
RTC significa Real Time Clock ed è un orologio e calendario, che conteggia il tempo anche senza alimentazione, visto che ha integrata una batteria tampone. Io ho usato il DS3231, collegato ad arduino attraverso l'interfaccia I2C (di cui ho parlato qui) e l'ho gestito tramite una libreria.
Sul display vengono visualizzati sempre ora e data, e tramite la pressione di un pulsante si alterna distanza sensori e temperatura e umidità.
Per capire cosa visualizzare ho utilizzato una variabile, che viene incrementata di un'unità ad ogni pressione di un tasto. Con il comando modulo (%) ho calcolato il resto della variabile diviso due.
Ho 2 risultati, zero se il numero è pari e uno se è dispari. Se:
- Risulta 1 visualizzo sul display la temperatura e l'umidità;
- Risulta 0 visualizzo sul display la distanza.
E' possibile eliminare tutto questo sistema utilizzando un display a quattro righe per far stare per intero tutti i dati senza cambiare schermata.
Non mi è stato ancora possibile testare il sistema sul mezzo di trasporto ma mi riservo di farlo quanto prima.
Trovate lo sketch in allegato nel file ZIP in fondo alla pagina.
Adesso usate la vostra fantasia per trovare un'applicazione e magari condividerla con la community. Se vi è piaciuto condividete questo articolo su Facebook, Twitter, Google+ e Linkedin.
Allegato
Distanza sensore ultrasuoni HC-SR04 e Arduino
Ottimo articolo !.
Personalmente ho utilizzato il modello SFR08 e recentemente i sensori a ultrasuoni della MaxBotix per la misura del livello dell’acqua: hanno qualche funzione aggiuntiva ma però il costo il avvicina a 100 euro.
Massimo
Grazie per i complimenti.
Ho dato un occhiata al SFR08 e ai sensori della MaxBotic che mi sembrano molto precisi e ben fatti.
Giovanni
Bellissimo articolo,molto dettagliato specialmente per chi è alle prime armi 🙂
Domenico
Salve sono una ragazza che studia design e sto preparando un esame su dispositivi di ausilio per ipovedenti per praticare attività sportiva. Premetto che non sono preparata sul campo dell'elettronica, ma vorrei avere informazioni riguardo a questi sensori, per quanto riguarda dimensioni, e se fosse possibile inserirli in un braccialetto o una cavigliera in modo da poter individuare per tempo eventuali ostacoli ed inviare dei feedback ad altri dispositivi per avvertire la persona per tempo.
Buona sera,
Il sensore che ho utilizzato io ha dimensioni:
Ci sono anche sensori più piccoli.
In un braccialetto non metterei il sensore:
Il sensore, secondo me, è possibile metterlo in una cavigliera. Si può controllare il sensore con un arduino tipo come il LilyPad creato appositamente per prodotti indossabili.
Ad esempio si può mettere una condizione che se la distanza è minore di 30cm inizi a suonare un cicalino
Sono a disposizione per ulteriori informazioni
Giovanni Lorenzini
Innanzitutto, grazie infinite per la risposta e per la disponibilità, ho dato un' occhiata al sensore, ed il fatto che interagisca con prodotti indossabili è esattamente quello che cercavo, però c'è un punto che non ho ben specificato nel commento, che forse può cambiare le cose. Per attività sportiva vorrei riferirmi alla corsa, in quanto potrebbe risultare l'attività sportiva più alla portata di tutti, e più praticabile per un ipovedente (non cieco). Allo stesso tempo però, correndo, c'è un movimento continuo sia di gambe che di braccia. Questi sensori sarebbero comunque in grado di rilevare gli ostacoli? Se sì, è possibile rilevarli ad una distanza maggiore? (ripeto, sono ignorante sul campo dell' elettronica)
Per farle capire meglio, nel mio progetto volevo creare sia una cavigliera, sia un braccialetto, che potessero rilevare gli ostacoli, alle rispettive altezze, ed interagire: o con degli auricolari bluetooth tramite un segnale sonoro, o con l'abbigliamento (maglietta e pantaloncini) tramite segnali meccanici (vibrazione ad esempio).
E' possibile o è pura fantascienza?
La ringrazio in anticipo.
Allora, il sensore può misurare una distanza fino a 4 metri. Per rilevare ostacoli nella corsa è meglio usare un sensore con un angolo di misura alto e metterlo in modo che quando la gamba è rivolta verso terra, la misura inizia a farla dal livello della caviglia in su (quindi con il sensore rivolto leggermente verso l'alto).
Per fare una misura il sensore ci mette poco tempo, quindi si possono fare misure ripetute e confrontarle.
Inoltre si può istallare un sensore per gamba, e quindi confrontare i dati.
Si può anche fare una scala di suono (tipo i sensori di retromarcia delle auto) che mano a mano che ti avvicini all'oggetto la frequenza del suono emesso dagli auricolari aumenta.
Ad arduino è possibile collegare un modulo bluetooth e inviare e ricevere dati con smartphone ed altri dispositivi. Io non so se è possibile configurare degli auricolari bluetooth, ma mi informerò.
Sono a disposizione per ulteriori informazioni.
Complimenti, ti sei messo davvero d’impegno nella spiegazione 🙂
Ottimo articolo!
Veramente ben fatto e molto dettagliato.
Devo farti i miei complimentiAndrea
Buonasera,
una cosa non mi è chiara, perchè si utilizza la stringa:
da dove esce 29,1/2?
Grazie per un'eventuale risposta
Grazie per i complimenti,
Distanza = tempo * velocità del suono / 2
2 perché il suono compie due volte il percorso.
Quindi sarebbe:
Distanza (cm) = 1 (ms) * 0,034 (cm/ms) / 2
Distanza (cm) = 0,034 cm / 2 = 0,017 cm
Volendo si può invece che moltiplicare dividere per un numero:
1 / 0,034 (cm/ms) = 29,1 (ms/cm)
Quindi con questo numero risulta uguale:
Distanza (cm) = 1 (ms) / 29,1 (ms/cm) / 2
Distanza (cm) = 0,034 cm / 2 = 0,017 cm
Grazie mille!
😉
buon giorno a io mi chiamo Antonio
sono entusiasta di Arduino e mi dispiace di non averlo conosciuto prima
volevo chiedere una cosa ho realizzato il sensore ad ultrasuoni
e funziona molto bene pero’ ho un dubbio se volessi misurare quanti ultrasuoni
escono come faccio , ho letto che gli hertz di lavoro sono 40 faccio una domanda stupida
se volessi portarli a 40Khz e’ possibile o devo cambiare sensore ?
grazie
Antonio
Ciao Antonio, evidentemente hanno commesso un errore di battitura.
il sensore HC-SR04 è un sensore ad ultrasuoni che lavora già a 40k Hertz
Ad ogni modo, non si sarebbe potuto modificare…
(Paolo)
Ciao!
Io ho utilizzato l’SFR05, ed così funziona.
Quello che ho fatto successivamente è stato di staccare dalla propria sede una delle due capsule, non sono riuscito a capire bene quale delle due se la trasmittente o la ricevente.
Sai darmi un indizio?
Ho anche acquistato 4 capsule nuove da futura elettronica ma non sono sicurissimo di quale sia il trasmettitore.
Una ha un piedino collegato all’involucro esterno, l’altra invece i due contatti sono isolati, c’e in questa una T maiuscola dovrebbe essere questa la trasmittente.
Cerco conferme.
Ne ho parlato anche con Adriano ( adrirobot ) e anche secondo lui è questa la trasmittente.
Ti ringrazio.
Sergio
Sergio ti confermo che quello con la T sia il trasmettitore. Prova a fammi sapere se funziona
Ti ringrazio per la sollecita risposta.
Ho un progetto in testa che penso sia per le mie capacità un poco oltre.
Ma mi faro aiutare dalla comunità
Grazie!
Sergio
Condividici il tuo progetto, così possiamo aiutarti
Si certo l’idea è quella di condividere, per adesso pubblico tutto sul mio blog, vedi il post con il titolo SFR05.
Da quel tentativo fallito ho intenzione di ricominciare con un nuovo progetto.
Grazie della disponibilità.
Sergio.
Salve sono nuovo, ho un problema non riesco a trovare lo sketch in allegato nel file ZIP in fondo alla pagina.
Sapete dove posso trovarlo!!!!!
mi riferisco al modulo con il sensore di temperature.
buona serata.
OK, grazie della segnalazione 🙂
Salve Giovanni avrei riscontrato un problema con un mio progetto. Ho utilizzato una scheda driver motor-shield alla quale ho collegato sopra una scheda robot-shield nella quale sono integrati i connettori per inserire un sensore HC-SR04. Ho avuto bisogno però di un nuovo sensore che ho collegato tramite una breadbord alla scheda robot_shield. Il problema è che il secondo sensore mi da sempre come risultato che la distanza è 0. Se collego però il secondo sensore, sempre tramite la breadboard e con la solita sezione di programma, direttamente sulla scheda di arduino il sensore non mi da alcun tipo di problema. Come posso collegare due sensori alla stessa scheda? potrebbe essere un problema del programma o della scheda? Grazie mille cordiali saluti Luca Martinelli.
Salve,
complimenti per il progetto, ne ho fatto uno simile, ma ho notato che la parte che include il sensore di temperatura e pressione è una parte interessante che ridurrebbe gli errori nelle rilevazioni acquisite.
Mi chiedevo, essendo alle prime armi, come posso archiviare i dati rilevati all’interno di una sd o micro sd?
Mi spiego meglio, è da mesi che misuro degli oggetti al volo con gli ultrasuoni e vorrei memorizzare le misure fatte.
Praticamente con un pulsante vorrei avviare un ciclo di 3 letture, di queste 3 farli fare la media e registrarla sulla scheda di memoria (ESEMPIO: lettura1-xxcm) magari finche fà le letture un led lampeggia per indicare “lettura in corso” e “fisso” quando posso ripremere il pulsante per fare la “lettura2-xxcm”. Dove potrei chiedere un aiuto a sviluppare uno sketch simile?
Grazie