Sensore a ultrasuoni HC SR04 e Arduino
Un sensore a ultrasuoni come il HC SR 04 misura il tempo impiegato dalle onde sonore emesse da un sorgente a ritornarvici dopo aver incontrato un ostacolo che le riflette. Il fascio di onde sonore emesso ha forma conica e lo stesso vale per le onde riflesse da un ostacolo, questo fa si che il sensore riceva molte riflessioni da diversi oggetti, ciò rende il sensore, da solo, incapace di distinguere un oggetto da un altro o aperture negli oggetti troppo piccole.
Calcolo della distanza
La velocità del suono nell’aria alla temperatura di 20° è di circa 343,4 m/s, qui usero la velocità approssimata di 340 m/s per semplicità, se è necessaria una maggior precisione si può usare la seguente legge in funzione della temperatura t: V = 331.4 + 0.62*t
Il sensore restituisce il tempo impiegato per andare e tornare dalle onde sonore in microsecondi, inoltre è comodo avere la misura in cm, quindi bisogna convertire la velocità del suono da m/s in cm/microsecondo: 1 m/s = 10^2/10^6 cm/microsec = 10^-4 cm/microsec => 340 m/s = 3,4*10^-2 cm/microsec
Il tutto va ancora diviso per 2 in quanto il tempo che abbiamo convertito è quello impiegato per andare e tornare indietro dalle onde, mentre per calcolare la distanza dall’oggetto ci basta metà di questo tempo, la formula finale, dove t è il tempo restituito dal sensore in cm/microsec è:
S = 1.7 * 10^-2 * t cm
HC SR 04
Il sensore dispone di 4 pin: Vcc (+5V), Trigger, Echo, GND. Si invia un impulso alto sul pin Trigger per almeno 10 microsec, a questo punto il sensore invierà il ping sonoro e aspetterà il ritorno delle onde riflesse, il sensore risponderà sul pin Echo con un impulso alto della durata corrispondente a quella di viaggio delle onde sonore, dopo 38 millisec si considera che non sia stato incontrato alcun ostacolo. Per sicurezza si aspettano in genere 50-60 millisec per far si che non vi siano interferenze con la misura successiva. Per maggiori informazioni c’è il datasheet.
Connettere Arduino e il sensore
Basta connettere il sensore a +5V e GND di arduino rispettivamente ai pin Vcc e GND del sensore, e Trigger ed Echo a due porte qualsiasi di Arduino( o anche una sola se si fosse a corto di uscite ). Lo schema è il seguente:
Codice di esempio
Il seguente codice è un esempio per provare il funzionamento del sensore, il file può essere scaricato qui.
//HC RS04 Sensore ultrasuoni
int triggerPort = 7;
int echoPort = 8;
void setup() {
pinMode( triggerPort, OUTPUT );
pinMode( echoPort, INPUT );
Serial.begin( 9600 );
Serial.println( "Sensore ultrasuoni: ");
}
void loop() {
//porta bassa l'uscita del trigger
digitalWrite( triggerPort, LOW );
//invia un impulso di 10microsec su trigger
digitalWrite( triggerPort, HIGH );
delayMicroseconds( 10 );
digitalWrite( triggerPort, LOW );
long duration = pulseIn( echoPort, HIGH );
long r = 0.034 * duration / 2;
Serial.print( "durata: " );
Serial.print( duration );
Serial.print( " , " );
Serial.print( "distanza: " );
//dopo 38ms è fuori dalla portata del sensore
if( duration > 38000 ) Serial.println( "fuori portata");
else { Serial.print( r ); Serial.println( "cm" );}
//aspetta 1.5 secondi
delay( 1500 );
}


usando questo codice e aprendo il serial monitor mi appare sempre 0 cm non è che mi daresti una mano
#define echo 13
#define trig 12
void setup ()
{pinMode (echo,INPUT );
pinMode (trig,OUTPUT );
Serial.begin(9600) ;}
void loop ()
{digitalWrite (trig,LOW);
digitalWrite (trig,HIGH);
delayMicroseconds (10);
digitalWrite (trig,LOW);
long time= pulseIn (echo,HIGH);
long distance=time/58;
Serial.print(distance);
Serial.print(“cm”);
delay (500);}
Leonardo Awanasgana Pergola
22 marzo 2012 at 9:22 PM
risolto inserendo un delayMicroseconds (10); nella riga 17
Leonardo Awanasgana Pergola
19 febbraio 2013 at 9:43 am
il monitor seriale registra continuamente i 234 cm circa costantemente….anche se passo un oggetto davanti al sensore, dove sbaglio?
Daniele
11 settembre 2013 at 5:25 PM
[…] fanno gli altri provider) attraverso un ip pubblico ma li “rinchiude” invece in una MAN e attraverso una tecnica chiamata NAT permette la comunicazione con internet. Risultato è che noi […]
Ip pubblico con fastweb (metter su un server) « Tauon Barcadero
22 ottobre 2012 at 7:00 PM
Provato a portare la variabile Duration a 400000 (che sarebbe un tempo di 0,4 secondi , ora leggo con precisione fino a 4 metri!
Oggetto molto versatile 😀
Ruby
13 aprile 2013 at 8:24 PM
Se volessi usare due sensori ad ultrasuoni invece che uno, come posso fare?
Alessandro
2 gennaio 2015 at 10:18 am
[…] Il sensore ha bisogno di 4 connessioni e non tre come il Ping ma non richiede pin PWM e costa sei volte di meno…Questo tutorial è molto chiaro e pure in italiano. […]
Egg box con Sensore sonico | Gioorgi
27 marzo 2015 at 11:34 PM
Purtroppo a mio avviso non è un buon sensore. Spesso mi da valori sballati o errori di lettura (mi cade nel FUORI PORTATA). ho cambiato i pin di ingresso, ho aggiunto qualche delay per lasciarlo riposare, ma nulla. soprattutto quando l oggetto posto di fronte non è perpendicolare al sensore, temo che l’ onda riflessa punti in un’ altra direzione e quindi di fatto non “ritorna”. Presto misurerò la durata dell ECHO con un oscilloscopio, per capire se il difetto è nella programmazione o nell hardware.
konig87
1 Maggio 2017 at 10:30 am