Sensore a ultrasuoni: misurare le distanze con Arduino

In molte occasioni può sorgere la necessità di avere una misurazione delle distanze continua e automatica, come ad esempio in un sonar, oppure in un sistema anti-intrusione che attivi un allarme all’avvicinarsi di un intruso in un determinato luogo, ma anche nel caso di un robot che debba trovare l’uscita da un labirinto destreggiandosi tra le pareti.

Obiettivi del genere possono essere raggiunti facilmente con un sensore a ultrasuoni, di cui vedremo un esempio funzionante in questo articolo.

Il sensore a ultrasuoni HC-SR04

Per ottenere una misurazione della distanza sufficientemente precisa, utilizzeremo, come già anticipato, il sensore a ultrasuoni HC-SR04, che è in grado di emettere un segnale attendendone l’eco e misurando l’intervallo di tempo trascorso tra emissione e ricezione del segnale stesso.

Il sensore restituisce dati sotto forma di impulsi a larghezza variabile con un range di valori che va da 2 centimetri a 4 metri, con un’accuratezza che può raggiungere i 3 mm.

Sensore a ultrasuoni HC-SR04

La formula di conversione del tempo del segnale del sensore a ultrasuoni in centimetri

Dato che il sensore non restituisce direttamente il valore della misura della distanza dall’oggetto verso cui lancia il segnale di andata, ma solo il tempo impiegato dal segnale per ritornare sul sensore, sarà necessario creare una funzione di conversione. Poiché, infatti, che il segnale emesso altro non è che un suono a 4 kHz e dato che il suono percorre una velocità di 343 metri al secondo, divideremo l’intervallo di tempo misurato per i microsecondi impiegati per percorrere un centimetro (e cioè 29,155 che per comodità arrotonderemo a 29). La formula di conversione sarà quindi la seguente:

microsecondi / 29 / 2;

Dividiamo per 2 per il semplice fatto che il tempo di misurazione risulta duplicato dal percorso di andata e ritorno del segnale.

Materiali e circuito di esempio

Per il prototipo di misurazione della distanza con Arduino avremo bisogno di:

  • Un sensore HC-SR04
  • 4 cavetti jumper di diverso colore
  • una breadboard
  • una scheda Arduino
  • un cavo usb per collegare Arduino al computer

Il sensore si presenta provvisto di quattro piedini dei quali collegheremo il Gnd an un pin di messa a terra di Arduino, il Vcc al pin a 5V, il pin Echo al pin digitale 12 e il pin Trigger al pin 13.

Circuito di misurazione distanza con Arduino e il sensore a ultrasuoni HC-SR04

Il pin Trigger verrà impostato in output, in quanto si occupa di inviare il segnale all’oggetto dal quale misurare la distanza, mentre il pin Echo rimarrà in ascolto del segnale di ritorno, rispondendo con un impulso HIGH della stessa durata dell’impulso inviato dal modulo HC-SR04 (esattamente otto onde a 4kHz).

Lo sketch di test

Ecco di seguito il listato per gestire la misurazione di temperatura con Arduino e un sensore a ultrasuoni:

#define PIN_TRIGGER 13
#define PIN_ECHO 12

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);

  pinMode(PIN_ECHO, INPUT);
  pinMode(PIN_TRIGGER, OUTPUT);
  
}

void loop() {
  // put your main code here, to run repeatedly:
  digitalWrite(PIN_TRIGGER, LOW);  
  digitalWrite(PIN_TRIGGER, HIGH);
  delayMicroseconds(10);  
  digitalWrite(PIN_TRIGGER, LOW);
  
  const unsigned long durata = pulseIn(PIN_ECHO, HIGH);
  if(durata == 0) {
    Serial.println("Impossibile acquisire l'impulso dal sensore");
  }
  else {
    Serial.print("Distanza dall'oggetto più vicino: ");
    Serial.print(convertiMicrosecondiInCm(durata));
    Serial.println(" cm");
  }
  delay(2500);
}

unsigned long convertiMicrosecondiInCm(const unsigned long microsecondi) {
  return microsecondi / 29 / 2;
}

Come si può notare, definiamo i pin 13 e 12 come pin rispettivamente di Trigger e di Echo; successivamente nel funzione setup, dopo aver impostato un baud rate di 9600 per la comunicazione sulla porta seriale, impostiamo il pin di Echo in input, come già anticipato, e il pin Trigger in output.

Nel loop di Arduino, configuriamo lo stato iniziale del pin di echo attendendo alcuni microsecondi; in tal modo viene garantita la presenza di impulsi HIGH corretti nelle successive misurazioni, eliminando eventuali picchi di tensione a cui i segnali elettrici sono sempre soggetti.

A questo punto siamo pronti per misurare l’intervallo di andata e ritorno del segnale tramite la funzione di Arduino pulseIn, che prende tra i suoi argomenti il pin da cui leggere la durata dell’impulso (il pin di echo, appunto), il tipo dell’impulso da leggere (in questo caso HIGH) e il timeout, che in questo caso non viene utilizzato, essendo un parametro opzionale valorizzato di default a un secondo.

Infine, se la durata viene acquista, ne convertiamo il valore in centimetri, tramite la funzione convertiMicrosecondiInCm la cui formula abbiamo visto più sopra in questo articolo; se invece il flusso di esecuzione entra nel primo ramo if, stampiamo sul monitor l’impossibilità di acquisire i dati dal sensore. Vengono utilizzati valori const e unsigned, sia per migliorare la leggibilità del programma, sia per ridurne le dimensioni

Conclusioni

In questo articolo abbiamo analizzato come sia possibile utilizzare un sensore a ultrasuoni per misurare la distanza da un oggetto. Dato che il sensore misura un intervallo di tempo di andata e ritorno del segnale che emette, abbiamo visto come convertirne i valori di output in cm. Abbiamo utilizzato valori di tipo long, sufficienti per una misurazione approssimativa, la cui precisione tuttavia può essere migliorata usando il tipo float, ma anche con un sensore di temperatura, dato che il modulo HC-SR04 è sensibile alle temperature, ciò che sarà argomento per un prossimo articolo.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.