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?

HC-SR04

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 🙂

hc-sr04-pipistrello

ultrasonic_sensor_schema

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.

HC-SR04-dimensione

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.

hc-sr04-collegamento-arduino

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 😉