Misurare una distanza con Arduino e un sensore ultrasuoni hc-sr04

L’hc-sr04 è un sensore ultrasuoni ed in questo articolo vedremo come funziona, come collegarlo ad Arduino, in fine scriveremo il codice quindi lo sketch per testarlo.

L’hc-sr04 può essere utile per calcolare una distanza / spazio tra un oggetto e l’hc-sr04 stesso.
La logica è abbastanza semplice, l’hc-sr04 sfrutta il suono o meglio le onde sonore, come?
Sappiamo che la velocità del suono è circa 343,4 m/s considerando come mezzo di propagazione l’aria con una temperatura di circa 20°C, e dato che il suono rimbalza incontrando un ostacolo / superficie, possiamo calcolare in modo abbastanza semplice la distanza tra l’hc-sr04 ed un dato punto tramite l’equazione: spazio = velocità * tempo
Cioè lo spazio percorso è uguale alla velocità nel nostro caso quella del suono, per il tempo impiegato per percorrere tale spazio.
Datasheet.

Come avviene tutto questo?

Guardando l’hc-sr04 notiamo sulla parte frontale due capsule (se così vogliamo chiamarle), quella sulla sinistra emette un suono a 40KHz, quella sulla destra invece lo riceve quando riflesso dall’eventuale ostacolo, un po’ come fanno i pipistrelli 🙂

L’hc-sr04 dispone quattro piedini, di cui due sono rispettivamente Vcc e Gnd e gli altri due invece sono Trigger il quale mantenuto su HIGH per 10uS “lancia” questo ping (suono), l’altro invece e l’Echo un segnale che serve per determinare la durata di andata e ritorno del suono, segnale che sarà direttamente proporzionale al tempo trascorso per andata e ritorno. Da questa nota ci rendiamo conto che quindi il tempo restituito dal segnale dovrà essere diviso per 2 perché per l’equazione per il calcolo dello spazio serve solo il tempo impiegato per l’andata non serve sommare anche il tempo di ritorno, altrimenti vien da sè che è come aver percorso una distanza doppia.

l’hc-sr04 è un modulino di piccole dimensioni, preciso per quello che è il suo costo, il range di misura in generale va dai circa 2cm ai circa 4m.

Il collegamento non richiede nessun accorgimento particolare, basta utilizzare due pin digitali che non siano 0 e 1 perché come sappiamo sono usati dalla porta seriale di Arduino, comunque vi riporto il collegamento utilizzato per lo sketch che troverete più in basso.

Prima di passare al codice dobbiamo però precisare alcune cose, magari qualcuno di voi ci avrà già pensato, una di queste è cambiare l’unita di misura indicata in alto nell’equazione.
Dato che sappiamo che il sensore arriva a misurare un massimo di circa 400cm e che quindi i tempi di andata e ritorno dell’onda sonora che andrà a colpire l’ostacolo saranno nell’ordine dei uS (microSecondi) ci conviene lavorare con i centimetri ed i microsecondi perciò:
velocità-suono = 343,4 metro/secondo
diventa:
da metri a centimetri moltiplichiamo per 100 velocità-suono = 34340 centimetro/secondo
e per sapere quanti centimetri vengono percorsi ogni microsecondo dividiamo per 1000000 velocità-suono = 0,03434 centimetro/microsecondo.
A questo punto ci ricordiamo di dover dividere per 2 il tempo che abbiamo ricevuto dall’hc-sr04 sul pin Echo.
Ed i tutto diventa:
Spazio = 0,03434 * Tempo / 2 semplificando otteniamo Spazio = 0,01717 * Tempo
Altra cosa da tenere in considerazione è che dopo 38 millisecondi (38000 microsencondi) si prende in considerazione che non sia stato incontrato alcun ostacolo anche perché fuori dalla portata del range dell’hc-sr04, basta fare il calcolo per rendersene conto:
====> distanza = 0.01717 * durata
====> distanza = 0.01717cm * 38000uS = 652.46cm
ben oltre i 400cm dichiarati sul datasheet.
Volendo possiamo aggiungere anche un controllo per quando si superano i 4m, facendo due calcoli si ottiene che la durata rilevata sull’Echo verso i 4m dovrebbe essere di circa 23500uS.

Lo sketch:

const int trigger = 12;
const int echo = 13;
long durata;
long distanza;

void setup()
{
  pinMode(trigger, OUTPUT);
  pinMode(echo, INPUT);

  Serial.begin(9600);
  Serial.println("HC-SR04");
  Serial.println(" ");
}

void loop()
{
  digitalWrite(trigger, LOW);
  digitalWrite(trigger, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigger, LOW);

  durata = pulseIn(echo, HIGH);
  distanza =  0.01717 * durata;

  if (durata > 38000) {
    Serial.println("Fuori range!");
  }
  else if (durata >= 23500) {
    Serial.println("Oltre i 4 metri!");
  }
  else {
    Serial.print("Distanza: ");
    Serial.print(distanza);
    Serial.print(" cm     ");

    Serial.print("Tempo: ");
    Serial.print(durata);
    Serial.println(" uS");
  }

  delay(1000);
}

Buon lavoro e alla prossima 😉