Programmare il Sensore HC-SR04 per misurare distanze
Tra i diversi tipi di sensori, il Sensore HC-SR04 è uno dei più adoperati nel mondo Arduino principalmente per la misurazione delle distanze, quindi diventa un ottimo strumento per la robotica didattica se si intende realizzare un robot in grado di muoversi liberamente e rilevare ostacoli. Possiamo acquistarlo per circa 2€ su Aliexpress o 6€ su Amazon. Abbiamo già visto come viene adoperato questo sensore in alcuni robot come per esempio la Tartaruga di KeyEstudio.
Specifiche
Il Sensore HC-SR04 è digitale ed è abbastanza economico e semplice da collegare, oltre ad ispirarsi al regno animale; il sistema ultrasuoni è, infatti, un valido meccanismo adoperato dai pipistrelli per muoversi al buio.
Nel sensore HC-SR04 troviamo un oscillatore a cristallo, una parte trasmittente (TRIG) che invia un impulso (con una frequenza di circa 40KHz) ed un parte ricevente (ECHO) che capta quest’impulso quando esso viene rifletto da una superficie. Queste due parti sono riconoscibili dalla presenza di una lettera stampata al loro fianco.
Questo sensore è, altresì, dotato di ben 4 PIN, due dei quali sono per l’appunto ECHO e TRIG, da collegare ,mentre gli altri due sono il GND e il Vcc a cui possiamo collegare sia i 3,3V che i 5V come tensione di lavoro.
Collegamento
Trattandosi di un sensore digitale, procediamo al collegamento dei pin TRIG e ECHO ai pin digitali di Arduino numero 13 e 12 come nel nostro esempio, ma possiamo anche adoperarne altri.
Per evitare che il sensore si muova durante l’esecuzione dello sketch, vi suggeriamo di porto su una breadboard.
Codice
Abbiamo due possibili scelte: la prima è scaricare dalla Gestione Librerie una libreria già pronta da usare per adoperare il nostro sensore HC-SR04, mentre la seconda sarà scrivere da noi il codice per farlo funzionare. Inutile dire che abbiamo scelto la seconda opzione, scaricabile QUI.
Partiamo come sempre dal dichiarare i pin che doppiamo usare e inserire nel VOID SETUP la loro direzione, ricordandoci che il pin ECHO sarà di INPUT mentre il TRIG sarà di OUTPUT. Dichiariamo anche una variabile a virgola mobile che chiamiamo distanceCm dove leggeremo la distanza calcolata.
#define ECHO_PIN 12 #define TRIG_PIN 13 float distanceCm; void setup() { pinMode(TRIG_PIN, OUTPUT); pinMode(ECHO_PIN, INPUT); Serial.begin(9600); }
Nel VOID LOOP eseguiamo il codice che consentirà, tramite funzione di digitalWrite, di attivare il pin ECHO per emettere 8 impulsi a 40KHz per 10 microsecondi, dopodiché disattiveremo il pin e predisporremo il pin TRIG alla ricezione dell’onda riflessa tramite comando pulseIn. In questa fase il sensore registrerà il ritorno dell’ultrasuono, solo se la superficie riflettente si trova ad una distanza massima di 4 metri.
digitalWrite(TRIG_PIN, LOW); delayMicroseconds(2); digitalWrite(TRIG_PIN, HIGH); delayMicroseconds(10); digitalWrite(TRIG_PIN, LOW); unsigned long impulso = pulseIn(ECHO_PIN,HIGH); distanceCm = impulso / 2.0 * 0.0343;
Facciamo ora riferimento alla fisica scolastica per il calcolo dello spazio. Sappiamo che la velocità è il rapporto tra lo spazio ed il tempo, pertanto possiamo calcolare lo spazio moltiplicando la velocità per il tempo. Tale spazio sarà la distanza espressa in centimetri, ovvero moltiplicheremo la velocità del suono nell’aria a 20°Celsius (0,0343 cm/μs) per il tempo, memorizzato nella variabile impulso che intendiamo come il tempo trascorso tra l’emissione dell’ultrasuono e la ricezione dello stesso (dividiamo per 2 perchè il tempo tra la ricezione e l’emissione è doppio). Otteniamo così una misurazione precisa, ma possiamo modificare la precisione adeguando la velocità del suono in base alla temperatura atmosferica; ad esempio, a 0° Celsius la velocità sarà di circa 0,331 cm/μs.
Otteniamo così sul monitor seriale la distanza rilevata in centimetri.