[TUTORIAL] Misurare la distanza con Arduino – HR-SR04 Sensore Ultrasuoni

Uno degli argomenti, che trovo spesso girovagando per i forum su Arduino, riguarda la realizzazione di rover e piccole macchine in grado di muoversi in autonomia, evitando ostacoli o addirittura, creando mappe dell’ambiente all’interno del quale si trovano.

Alla base del rilevamento degli ostacoli e della creazione delle mappe c’è la necessità di poter misurare distanze. Il metodo più economico e, con i dovuti accorgimenti anche preciso, è il sensore di distanza ad ultrasuoni HR-SR04.

Iscriviti al nostro canale YouTube per saperne di più! :)Il principio di funzionamento si questo dispositivo si basa sulla misura del TOF (Tempo di volo) di un fronte d’onda acustica, emesso da una capsula ad ultrasuoni trasmittente e ricevuto da una ricevente.


Iscriviti al nostro canale YouTube per saperne di più! 🙂

L’HR-SR04 implementa automaticamente questo processo che porta alla misura indiretta della distanza.

Come dicevo all’inizio si tratta di un dispositivo molto economico (anche al di sotto delle 2€) che però garantisce un buon risultato se usato bene.

PRINCIPIO DI FUNZIONAMENTO

I pin che devono essere connessi ad Arduino sono 4:

VCC     -> Connesso al 5V di Arduino

GND    -> Connesso alla MASSA di Arduino

TRIG   -> Connesso ad un PIN digitale qualsiasi di Arduino (Nel nostro caso utilizzeremo D9)

ECHO -> Connesos ad un PIN digitale qualsiasi di Arduino (Nel nostro caso utilizzeremo D10)


La funzione svolta da Arduino è quella di misurare il tempo che intercorre tra il cambio di livello del pin TRIG (che è controllato da Arduino) e il cambio di livello del pin ECHO (è controllato dall’HC-SR04).

Il sensore è tutto sommato molto semplice da utilizzare e non è necessaria una particolare libreria o classe per gestirlo bene. E’ infatti sufficiente utilizzare la libreria

Pagina Ufficiale Arduino:NewPing.

GitHub: NewPing.

Questa Libreria si occupa essenzialmente di misurare il TOF e supponendo la velocità del suono costante a 350m/s, che corrisponde alla velocità di propagazione del suono a circa 30°C.Esiste però un legame tra velocità di propagazione del suono in aria e temperatura dell’aria. Se si necessitano precisioni elevate potrebbe valere la pena tenerne conto.

L’approssimazione lineare che descrive l’andamento della velocità di propagazione in funzione della temperatura è la seguente:

V(T) = (331,45 + (0,62 * T)) m/s

Spiegando questa “formulaccia” in “soldoni” diciamo che, se poniamo T=0°C, troviamo che la velocià di propagazione del suono a 0°C è di 332,45°C in accordo con la tabella riportata sotto (presa da Wikipedia).

Influenza della temperatura dell’aria sulla velocità del suono
T in °C a in m/s ρ in kg/ Z in N·s/m³
 −10 325,4 1,341 436,5
  −5 328,5 1,316 432,4
   0 331,5 1,293 428,3
  +5 334,5 1,269 424,5
+10 337,5 1,247 420,7
+15 340,5 1,225 417,0
+20 343,4 1,204 413,5
+25 346,3 1,184 410,0
+30 349,2 1,164 406,6

Ma facciamo adesso un esempio ancora più pratico per quantificare l’errore che si commette quando si approssima la velocità del suono ad una costante.

Supponiamo di essere a  20°C, e quindi considerare una velocità costande di  343,4m/s. Se a nostra insaputa, la temperatura assume un valore di 30°C, la velocità realre di propagazione assumerà dil valore di 349,2m/s.

In questo modo si commetterebbe un errore percentuale sulla misura di:

Er%=( (349,2-343,4)/343,4)*100 = 1,69

Questo vuol dire che con una tale variazione di temperatura l’errore commesso sarebbe di 1,69cm su una misura di 1m. In alcuni casi questo errore può risultare accettabile, in altri no.

IL CODICE

Arriviamo al dunque! Il codice per utilizzaro! Come abbiamo anticipato nel capitolo precedente, il modo più semplice per utilizzare il Distance Sensor HC-SR04 è la libreria NewPing.

Di seguito trovare un esempio di codice, molto semplice, ma che svolge in poche righe la misura della distanza in cm e la stampa nel monitor seriale.

    #include <NewPing.h>
     
    #define TRIGGER_PIN  9
    #define ECHO_PIN     10
    #define MAX_DISTANCE 200
     
    NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
     
    void setup() {
      Serial.begin(115200);
    }
     
    void loop() {
      delay(50);
      Serial.print("Ping: ");
      Serial.print(sonar.ping_cm());
      Serial.println("cm");
    }

I pin dichiarati nel codice (TRIGGER_PIN e ECHO_PIN) sono in accordo con lo schema precedentemente illustrato. Il parametro MAX_DISTANCE è espresso in cm e imposta una sorta di timeout sul tempo massimo di ricezione dell’impulso. Se la distanza è maggiore di quella impostata, il valore restituito sarà 0.

Di seguito trovate un video-tutorial dove viene illustrato il funzionamento del sensore


Buon divertimento!