Il sensore ad ultrasuoni è un oggetto che possiede 2 dispositivi: un trigger (emettitore) ed un echo (ricevitore), il primo serve ad emettere un suono mentre il secondo serve a riceverlo. Il suono emesso dal trigger rimbalza contro gli oggetti che si trovino ad una certa distanza dall’ultrasuono e ritorna in dietro. Se Echo riceve il suono di ritorno si può misurare il tempo che intercorre tra emissione e ricezione del suono per stimare la distanza dell’oggetto. Infatti, la velocità di propagazione del suono nell’aria è nota, varia leggermente a seconda di umidità, altitudine ed altri parametri ma sostanzialmente è prossima ai 340 metri/secondo.
In base ad alcuni calcoli, se “t” è il tempo impiegato a ricevere il segnale, t*0.017 è la distanza a cui si trova l’oggetto.
Come visibile nella figura, il dispositivo ad ultrasuoni HC-SR04 dispone di 4 pin, Vcc va alimentato a 5V, GND è il pin da collegare al “ground” di Arduino, TRIG è il pin di trasmissione impulso sonoro, ECHO è il pin collegato al ricevitore del eco. Collegate il sensore ai pin 11 (trigger) e 10 (echo) come in figura:
Un semplice programma che misura la distanza di un oggetto è il seguente:
void setup() {
pinMode(11, OUTPUT); // TRIGGER
pinMode(10, INPUT); // ECHO
Serial.begin(9600);
}
void loop() {
digitalWrite(11, LOW);
digitalWrite(11, HIGH);
delayMicroseconds(10);
digitalWrite(11, LOW);
long t;
t=pulseIn(10,HIGH);
Serial.println(t*0.017);
}
Esercizio: utilizzare due sensori ad ultrasuoni.
Collegate due sensori ad ultrasuoni (li chiameremo sensore destro e sensore sinistro). Il sensore sinistro viene gestito dai pin 13 (trigger) e 12 (echo) mentre il sensore destro viene gestito dai pin 11 (trigger) e 10 (echo). Scrive il programma che costantemente visualizzi sul monitor seriale le distanze di 2 oggetti che passino davanti ad essi.
Il programma potrebbe essere il seguente:
//
void setup() {
pinMode(11, OUTPUT); // TRIGGER
pinMode(10, INPUT); // ECHO
pinMode(13, OUTPUT); // TRIGGER
pinMode(12, INPUT); // ECHO
Serial.begin(9600);
}
void loop() {
Serial.print(” Destro: “);
digitalWrite(11, LOW);
digitalWrite(11, HIGH);
delayMicroseconds(10);
digitalWrite(11, LOW);
long dd;
dd=pulseIn(10,HIGH)*0.017;
Serial.print(dd);
Serial.print(” Sinistro: “);
digitalWrite(13, LOW);
digitalWrite(13, HIGH);
delayMicroseconds(10);
digitalWrite(13, LOW);
long ds;
ds=pulseIn(12,HIGH)*0.017;
Serial.println(ds);
}
Lo schema di collegamento è invece questo:
Una variante potrebbe essere la seguente, in cui sono state create 2 funzioni: “destro” e “sinistro”.
void setup()
{
pinMode(11, OUTPUT); // TRIGGER
pinMode(10, INPUT); // ECHO
pinMode(13, OUTPUT); // TRIGGER
pinMode(12, INPUT); // ECHO
Serial.begin(9600);
}
void loop()
{
destro();
sinistro();
}
void destro(){
Serial.print(” Destro: “);
digitalWrite(11, LOW);
digitalWrite(11, HIGH);
delayMicroseconds(10);
digitalWrite(11, LOW);
long dd;
dd=pulseIn(10,HIGH)*0.017;
Serial.print(dd);
}
void sinistro(){
Serial.print(” Sinistro: “);
digitalWrite(13, LOW);
digitalWrite(13, HIGH);
delayMicroseconds(10);
digitalWrite(13, LOW);
long ds;
ds=pulseIn(12,HIGH)*0.017;
Serial.println(ds);
}
Progetto: movimentare la sbarre di uscita in un parcheggio.
Il circuito è visibile nell’immagine che segue: un sensore di distanza (quello destro) rileva la presenza del veicolo, Arduino fa aprire la sbarra, il secondo sensore (quello sinistro) si accorge se il veicolo passa oltre la sbarra, Arduino chiude la sbarra.
Il dispositivo si può programmare in modo che funzioni anche con il veicolo che entra nel parcheggio, cioè procede in senso opposto, prima passando davanti al sensore sinistro e poi davanti al destro.
Un programma che potrebbe risolvere parzialmente il problema è il seguente:
#include<Servo.h>
Servo sbarra;
void setup()
{
pinMode(11, OUTPUT); // TRIGGER
pinMode(10, INPUT); // ECHO
pinMode(13, OUTPUT); // TRIGGER
pinMode(12, INPUT); // ECHO
Serial.begin(9600);
sbarra.attach(9);
}
void loop()
{
if (destro()<50 && sinistro()>50) apri();
else if (sinistro()<50 && destro()>50) chiudi();
else chiudi();
}
long destro(){
Serial.print(” Destro: “);
digitalWrite(11, LOW);
digitalWrite(11, HIGH);
delayMicroseconds(10);
digitalWrite(11, LOW);
long dd;
dd=pulseIn(10,HIGH)*0.017;
Serial.println(dd);
return dd;
}
long sinistro(){
Serial.print(” Sinistro: “);
digitalWrite(13, LOW);
digitalWrite(13, HIGH);
delayMicroseconds(10);
digitalWrite(13, LOW);
long ds;
ds=pulseIn(12,HIGH)*0.017;
Serial.println(ds);
return ds;
}
void apri(){
sbarra.write(90);
delay(1000);
}
void chiudi(){
sbarra.write(0);
delay(1000);
}
Esercizio: aggiungete un led rosso ed uno verde, quest’ultimo si accende quando si apre la sbarra.