Sensore di distanza ad ultrasuoni HC SR04 con Arduino

Sensore di distanza ad ultrasuoni HC SR04 con Arduino

Esistono varie versioni di sensori agli ultrasuoni, una di queste è l’HC-SR04

L’utilizzo con Arduino è molto semplice, anche senza l’aiuto di librerie.
Le principali caratteristiche sono:
Tensione di lavoro: 3 – 5.5 Vdc.
Corrente assorbita: 3 mA circa.
Frequenza di lavoro: 40 Khz.
Distanza min: 2 cm.
Distanza max: 450 cm.
Risoluzione: 3 mm.
Angolo di misura: 15 – 20°.
Ingresso: Trigger 10us Impulso TTL.
Uscita: Echo segnale PWM TTL

Ha 4 pin:
– Vcc – viene collegato alla tensione di alimentazione da 3 a 5.5V.
– Trig – è il pin “Trigger” che deve essere portato alto per inviare il segnale ad ultrasuoni.
– Echo – è il pin che produce un impulso che si interrompe quando viene ricevuto il segnale riflesso dall’ostacolo.
– GND – viene collegato GND.

Principio di funzionamento:

Il sensore HC-SR04 non ci da direttamente la misura della distanza dell’oggetto, ma lo si utilizza per emettere un treno di impulsi ad ultrasuoni (ne saranno emessi 8 quando verrà portato per 10 microsecondi a stato alto il suo pin Trigger). Gli impulsi sonori saranno propagati nell’ambiente circostante e, se incontrano uno ostacolo, torneranno indietro verso il sensore che li ha emessi. Quando il sensore “sentirà” il ritorno dell’impulso sonoro porterà a stato basso il suo pin Echo (che nel frattempo era stato portato automaticamente alto).

Misurando il tempo che intercorre tra l’emissione del segnale sonoro ed il suo ritorno potremo calcolare la distanza dell’ostacolo sul quale è rimbalzato. Come?

La velocità del suono è la velocità con cui un suono si propaga in un certo ambiente, detto mezzo. La velocità del suono varia a seconda del mezzo (ad esempio, il suono si propaga più velocemente nell’acqua che non nell’aria), e anche al variare delle proprietà del mezzo, specialmente con la sua temperatura.

Il nostro mezzo è l’aria, nella quale la velocità del suono è di 331,2 metri al secondo (1 192,32 km/h) a 0 °C e di 343,1 m/s (1 235,16 km/h) a 20 °C temperatura nella quale normalmente utilizziamo i sensori agli ultrasuoni (per chi vuole approfondire l’argomento della velocità del suone si rimanda alla pagina di Wikipedia).

Detto questo convertiamo la velocità del suono da 343,1 m/s a 0,03431 cm/microsecondi.

Dato che lo spazio percorso = velocità x il tempo, la nuova formula sarà:

Spazio (cm) = 0,03431 x t (microsecondi)

Dobbiamo però ricordarci che la distanza percorsa dal suono è doppia rispetto alla distanza dell’ostacolo, in quanto l’impulso sonoro deve andare verso l’ostacolo e tornare indietro, quindi anche il tempo impiegato in totale è doppio.

La nuova formula sarà quindi:

Spazio = 0.03431 x t / 2

che equivale a:

Spazio = 0,017155 x t

In alcuni esempi sulla rete si potrà trovare la formula scritta anche così:

Spazio = t / 58.3 (deriva da aver diviso 1 su 0,017155) e spesso viene approssimato a:

Spazio = t / 58 per sapere la distanza in cm, oppure:

Spazio = t / 148 per sapere la distanza in pollici.

Messa da parte la matematica vediamo come utilizzare l’HC SR04 con Arduino

In sintesi dobbiamo inviare un impulso di 10 ms sul pin Trig del sensore e calcolare il tempo che impiega il sensore a sentire il segnale di ritorno, quindi dopo quanto tempo si porterà basso il pin Echo del sensore.

Uno schema per testare il HC SR04 con Arduino è il seguente:

Lo sketch da caricare nel nostro Arduino è :

#define trigPin 6
#define echoPin 7

long durata, cm;

void setup() {
  Serial.begin(9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
}
void loop()
{
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  durata = pulseIn(echoPin, HIGH);
  cm = durata / 58; // per i pollici la formula è durata / 148;
  Serial.print("Cm = ");
  Serial.println(cm);
  Serial.println();
}

Il comando che si occuperà di contare il tempo che impiega l’impulso ad andare e ritornare è pulseIn (qui troverete una trattazione dettagliata del comando).

Descrizione del comando pulseIn:
Sintassi

pulseIn(pin, valore) Il valore per il sensore HC-SR04 deve essere HIGH

pulseIn(pin, valore, timeout) Timeout può essere omesso (di default è 1 secondo, 1.000.000 µs).

Si deve comunque considerare che la massima distanza di lavoro del sensore è 400 cm, che corrispondono a poco meno di 24 ms e che automaticamente il pin Echo dopo 38ms passa basso ed il segnale emesso deve essere considerato perso.

Inoltre come scritto nel Datasheet si devono aspettare almeno 50ms tra un invio di impulso ed un altro, per evitare che echi di vecchi impulsi siano erroneamente letti come validi e dare false letture.

Inoltre gli ostacoli da rilevare, oltre ad essere entro una distanza di 400 cm, devono essere all’interno di un cono di 30° come da foto

Alimentare il HC-SR04 con un pin di Arduino

Dato che per funzionare il sensore ha bisogno di pochi mA e che il pin di Arduino è in grado di fornirne fino a 40 mA, si può utilizzare un pin settato come uscita per alimentare il sensore. Questo può essere utile nelle applicazioni che funzionano a batteria per limitarne i consumi.

Uno schema per alimentare il HC SR04 con un pin di Arduino è il seguente:

Lo sketch da caricare nel nostro Arduino è:

#define trigPin 6
#define echoPin 7
#define pinAlimenta 8

long durata, cm;

void setup() {
  Serial.begin(9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(pinAlimenta, OUTPUT);
  digitalWrite(pinAlimenta, HIGH);
}
void loop()
{
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  durata = pulseIn(echoPin, HIGH);
  cm = durata / 58; // per i pollici la formula è durata / 148;
  Serial.print("Cm = ");
  Serial.println(cm);
  Serial.println();
}

Utilizzare più HC-SR04 contemporaneamente con Arduino

Se si volesse utilizzare più di un HC-SR04 con un solo Arduino occorrerebbero due pin per ogni modulo ultrasuoni.

Per risparmiare pin possiamo unire tutti i pin Trig dei vari sensori, connetterli ad un unico pin di Arduino ed ascoltare la risposta di un pin Echo alla volta.

L’unico inconveniente di questo sistema è che contemporaneamente verranno inviati molti segnali ultrasuoni che potrebbero causare letture di distanze errate.

Uno schema per utilizzare vari HC-SR04 è il seguente:

Lo sketch da caricare nel nostro Arduino è:

#define trigPin 6
#define echo1Pin 5
#define echo2Pin 4
#define echo3Pin 3
#define echo4Pin 2

long durata, cm1,cm2,cm3,cm4;

void setup() {
  Serial.begin(9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echo1Pin, INPUT);
  pinMode(echo2Pin, INPUT);
  pinMode(echo3Pin, INPUT);
  pinMode(echo4Pin, INPUT);
}

void loop() {
  trig();
  durata = pulseIn(echo1Pin, HIGH);
  cm1 = durata / 58;
  delayMicroseconds(50);
  trig();
  durata = pulseIn(echo2Pin, HIGH);
  cm2 = durata / 58;
  delayMicroseconds(50);
  trig();
  durata = pulseIn(echo3Pin, HIGH);
  cm3 = durata / 58;
  delayMicroseconds(50);
  trig();
  durata = pulseIn(echo4Pin, HIGH);
  cm4 = durata / 58;
  delayMicroseconds(50);

  Serial.print("Cm1 = ");
  Serial.println(cm1);
  Serial.println();
  Serial.print("Cm2 = ");
  Serial.println(cm2);
  Serial.println();
  Serial.print("Cm3 = ");
  Serial.println(cm3);
  Serial.println();
  Serial.print("Cm4 = ");
  Serial.println(cm4);
  Serial.println();
}

void trig () {
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
}