Sensore ad ultrasuoni HC-SR04 – Arduino

Misurare la distanza con un sensore ad ultrasuoni HC-SR04 può essere utile in molte occasioni, ad esempio in un sistema anti-intrusione che deve far suonare un allarme o su un robot che deve evitare ostacoli.
In questo tutorial viene utilizzato il sensore ad ultrasuoni HC-SR04, sensore economico e con un buon range operativo.
I sensori ad ultrasuoni non forniscono direttamente la misura della distanza dell’oggetto più vicino, ma misurano il tempo impiegato da un segnale sonoro a raggiungere l’ostacolo e poi ritornare al sensore.
L’impulso ad ultrasuoni inviato dal HC-SR04 è di circa 40KHz, il tempo viene misurato in microsecondi, la tensione di funzionamento è di 5V, quindi potremo alimentarlo direttamente utilizzando Arduino.
Lista dei componenti
- Arduino UNO (o equivalente)
- HC-SR04
Di seguito elenco alcuni sensori ultrasuoni compatibili con lo sketch presente in questo articolo:
HC-SR04
Il sensore HC-SR04 dispone di 4 pin: Vcc (+5V), Trigger, Echo, GND. Viene inviato un impulso alto sul pin Trigger per almeno 10 microsecondi, 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 millisecondi si considera che non sia stato incontrato alcun ostacolo. Per sicurezza si aspettano in genere 50-60 millisecondi per far si che non vi siano interferenze con la misura successiva. Per maggiori informazioni è possibile consultare il datasheet.


Per convertire l’intervallo di tempo misurato in una lunghezza, bisogna ricordare che la velocità del suono è di 331,5 m/s a 0 °C e di 343,4 m/s a 20 °C ed in generale varia secondo la relazione v = 331,4 + 0,62 T dove la temperatura T è misurata in °C.
Per la realizzazione del nostro metro elettronico assumiamo di lavorare ad una temperatura ambiente di 20 °C e quindi la nostra costante di velocità del suono sarà di 343 m/s (approssimiamo) o meglio 0,0343 cm/microsecondi.
Quindi, ricordando che v=s/t (v: velocità, s: spazio, t: tempo) allora lo spazio percorso sarà:
s = v*t
da cui
s = 0,0343 *t
però, per calcolare lo spazio percorso, bisogna tener conto che il suono percorrerà due volte la distanza da misurare (giunge sull’oggetto e ritorna indietro al sensore) quindi il valore di t ottenuto deve essere diviso per 2. La formula corretta per la misura dello spazio percorso è:
s = 0,0343 * t/2
eseguendo la divisione di 0,0343/2 possiamo scrivere:
s = 0,01715 * t
oppure:
s = t/58,31
approssimando
s = t/58
formula più semplice da ricordare.
Come collegare il sensore ad Arduino

Per collegare il sensore HC-SR04 ad Arduino basta collegare i 2 pin di alimentazione rispettivamente a 5V e GND e gli altri 2 pin (Trigger e Echo) a 2 ingressi digitali.
Ecco lo schema di collegamento:

Sketch con monitor Seriale
//HC RS04 Sensore ultrasuoni
//Giuseppe Caccavale
const int triggerPort = 9;
const int echoPort = 10;
const int led = 13;
void setup() {
pinMode(triggerPort, OUTPUT);
pinMode(echoPort, INPUT);
pinMode(led, OUTPUT);
Serial.begin(9600);
Serial.print( "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 durata = pulseIn( echoPort, HIGH );
long distanza = 0.034 * durata / 2;
Serial.print("distanza: ");
//dopo 38ms è fuori dalla portata del sensore
if ( durata > 38000 ) {
Serial.println("Fuori portata ");
}
else {
Serial.print(distanza);
Serial.println(" cm ");
}
if (distanza < 10) {
digitalWrite(led, HIGH);
}
else {
digitalWrite(led, LOW);
}
//Aspetta 1000 microsecondi
delay(1000);
}
Sketch con display LCD
//HC RS04 Sensore ultrasuoni
//Giuseppe Caccavale
#include <LiquidCrystal.h>
const int triggerPort = 9;
const int echoPort = 10;
const int led = 13;
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
void setup() {
pinMode(triggerPort, OUTPUT);
pinMode(echoPort, INPUT);
pinMode(led, OUTPUT);
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print( "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 durata = pulseIn( echoPort, HIGH );
long distanza = 0.034 * durata / 2;
lcd.setCursor(0, 1);
lcd.print("dist.: ");
//dopo 38ms è fuori dalla portata del sensore
if ( durata > 38000 ) {
lcd.setCursor(0, 1);
lcd.println("Fuori portata ");
}
else {
lcd.print(distanza);
lcd.println(" cm ");
}
if (distanza < 10) {
digitalWrite(led, HIGH);
}
else {
digitalWrite(led, LOW);
}
//Aspetta 1000 microsecondi
delay(1000);
}
AGGIORNAMENTO GIUGNO 2015
Di recente ho trovato sul web una libreria in grado di migliorare la lettura e la sensibilità di questo sensore. Potete scaricare la libreria da QUI.
Ricordate di copiarla in \Documents\Arduino\libraries\…
oppure in
C:\ProgramFiles\Arduino\libraries\…
Posto qui un esempio di codice, i collegamenti sono uguali a quelli dell’esempio con monitor seriale 😉
//HC RS04 Sensore ultrasuoni
//Giuseppe Caccavale
#include <NewPing.h>
#define TRIGGER_PIN 2 // Arduino pin tied to trigger pin on the ultrasonic sensor.
#define ECHO_PIN 3 // Arduino pin tied to echo pin on the ultrasonic sensor.
#define MAX_DISTANCE 400 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
int SetDistance = 0;
int ValueDist = 0;
void setup() {
Serial.begin(115200);
}
void loop() {
delay(50); // Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings.
unsigned int uS = sonar.ping(); // Send ping, get ping time in microseconds (uS).
ValueDist = uS / US_ROUNDTRIP_CM;
Serial.print("Ping: ");
Serial.print(ValueDist); // Convert ping time to distance in cm and print result (0 = outside set distance range)
Serial.println("cm");
}