Distanziometro a ultrasuoni con LCD display su Arduino UNO

Introduzione

In questo tutorial vedremo come realizzare un distanziometro ad ultrasuoni. Gli ultrasuoni sono onde acustiche aventi frequenza superiore a quella udibile dall’essere umano. Il mezzo attraversato dagli ultrasuoni ne condiziona la velocità di propagazione. Essi sono più lenti nei mezzi aeriformi e più veloci nei mezzi solidi. Nell’aria la velocità di propagazione è di circa 340 m/s. Vengono generalmente utilizzati in campo medico (ecografie), nei controlli non distruttivi, nei robot per individuare gli ostacoli oppure, come nel nostro caso, per misurare le distanze.

Nel nostro progetto utilizzaremo un modulo ad ultrasuoni HC-SR04 per la misura della distanza che verrà poi visualizzata su un display LCD a 2 righe e 16 caratteri.

Se il vostro display LCD non ha il connettore da 16 pin saldato e non sapete come fare, il nostro tutorial Un altro tutorial su come saldare può fare al caso vostro.

La massima distanza misurata dall’HC-SR04 è di circa 4 metri, la minima è di 2 cm con una accuratezza di 3 mm. Abbiamo previsto anche l’utilizzo di un cicalino piezoelettrico che suona quando la distanza diventa maggiore di 4 metri (e quindi non più misurabile dal modulo).

Altre due cose necessarie se volete fare misure più accurate:

  • una livella a bolla
  • un puntatore laser

Purtroppo, durante le nostre fasi di test, abbiamo scoperto che questo dispositivo non può essere alimentato con una comune batteria da 9V perché non è in grado di fornire tutta la corrente necessaria. Quindi il distanziometro dovrà essere necessariamente alimentato connesso alla presa USB di un PC oppure ad un alimentatore da muro (o magari con una batteria che fornisce molti più mA/h rispetto alla classica da 9V).

Il video seguente mostra il funzionamento del nostro distanziometro ad ultrasuoni:

Come funziona il distanziometro ad ultrasuoni

Di che componenti abbiamo bisogno?

La lista dei componenti non è particolarmente lunga:

  • una breadboard per connettere la scheda Arduino UNO agli altri componenti
  • alcuni fili DuPont (maschio – maschio, maschio – femmina, femmina – femmina)
  • un modulo HC-SR04
  • 2 resistori da 10kΩ
  • un potenziometro da 10kΩ
  • un display LCD 2 x 16
  • un transistor 2N3904 (o un 2N2222)
  • un interruttore a pulsante
  • un cicalino piezoelettrico
  • e, ovviamente, una scheda Arduino UNO!

Abbiamo anche bisogno degli sketch da caricare su Arduino che possiamo scaricare dal link seguente:

Qual è il principio di funzionamento del distanziometro?

Il sistema trasmette un treno di impulsi a frequenza ultrasonica verso l’oggetto e ne riceve l’eco. In base al tempo di riflessione (cioè il tempo che l’impulso impiega per andare verso l’ostacolo e tornare indietro), Arduino calcola la distanza grazie alla formula seguente:

Distanza = (tempo per andare verso l'ostacolo e tornare indietro × velocità del suono) / 2

Come già detto, la velocità del suono in aria è pari a 340m/s

Vediamo alcune immagini del progetto realizzato:

Il nostro distanziometro ad ultrasuoni senza i tubi di carta
Il nostro distanziometro ad ultrasuoni senza i tubi di carta

Un'altra immagine del nostro distanziometro
Un’altra immagine del nostro distanziometro

Come è organizzato il tutorial?

Come al solito procederemo per passi:

  • inizialmente vedremo come collegare ad Arduino e far funzionare il modulo HC-SR04
  • aggiungeremo poi un pulsante per eseguire la misurazione
  • infine completeremo il progetto con l’aggiunta del display LCD e del cicalino piezoelettrico

Connettiamo il modulo ad ultrasuoni HC-SR04 ad Arduino

Iniziamo col collegare il modulo HC-SR04 ad Arduino come mostrato nello schema Fritzing seguente:

Schema Fritzing del collegamento
Schema Fritzing del collegamento

Il moduloHC-SR04 non necessita di alcuna libreria. Dovete semplicemente connetterlo ad Arduino seguendo lo schema Fritzing sopra oppure la tabella seguente:

  • 5V —-> Vcc
  • GND —-> GND
  • pin 7 —-> Trig
  • pin 8 —-> Echo

Caricamento del codice

A questo punto scaricate lo sketch ultrasonic.ino allegato (eliminate l’estensione .txt se presente) e cliccateci due volte. L’IDE di Arduino vi chiederà di salvare il nuovo sketch in una cartella il cui nome è lo stesso usato per il file .ino. Salvatelo dove preferite.

Funzione setup

All’inizio dello sketch, definiamo i due pin utilizzati per il trigger e l’echo:

int triggerPort = 7; 
int echoPort = 8;

Per far sì che il modulo HC-SR04 trasmetta un treno di 8 impulsi alla frequenza di 40kHz, Arduino manda un impulso della durata di 10us al pin 7.
Nella funzione setup definiamo i due pin come OUTPUT e INPUT:

pinMode( triggerPort, OUTPUT ); 
pinMode( echoPort, INPUT );

Funzione loop

Le prime quattro funzioni nel loop comandano al modulo HC-SR04 di trasmettere gli ultrasuoni verso un oggetto:

digitalWrite(triggerPort, LOW); // set to LOW trigger's output 
digitalWrite(triggerPort, HIGH); // send a 10us pulse to the trigger 
delayMicroseconds( 10 ); 
digitalWrite(triggerPort, LOW);

Per mandare un impulso di durata 10us alla triggerPort, Arduino mette il pin 7 sullo stato HIGH. Dopo questa istruzione, lo sketch aspetta 10us prima di rimettere lo stato del pin 7 a LOW.
Nelle prime righe del codice seguente, Arduino riceve il tempo di riflessione dell’onda ultrasonica misurato dal modulo HC-SR04. Questo tempo viene utilizzato per calcolare la distanza usando la formula

Distanza = (tempo per andare verso l'ostacolo e tornare indietro × velocità del suono) / 2 

nella seconda riga:

long duration = pulseIn(echoPort, HIGH); 
long r = 3.4 * duration / 2; // here we calculate the distance 
float distance = r / 100.00;

Le ultime righe calcolano se l’oggetto è troppo lontano, determinando se il tempo di riflessione è maggiore di 38ms:

if( duration > 38000 ) Serial.println("out of reach"); else { Serial.print(duration); Serial.println("cm");}

Potete osservare l’output dello sketch nello screenshot sottostante:

Il serial monitor mostra le misurazioni
Il serial monitor mostra le misurazioni

Aggiungiamo un pulsante

Aggiorniamo i collegamenti aggiungendo il pulsante secondo lo schema seguente:

Lo schema Fritzing del collegamento
Lo schema Fritzing del collegamento

Ovviamente noi vogliamo che il nostro distanziometro faccia le misurazioni solo quando necessario. Possiamo implementare semplicemente questa funzione aggiungendo un pulsante. Quindi, premendo il pulsante, Arduino e il modulo HC-SR04 inizieranno a fare le misurazioni.
Guardate lo schema Fritzing sopra per vedere come collegare il pulsante. Ricordate che per questo collegamento è necessaria anche una resistenza da 10kΩ.
Il primo passo è dichiarare il pin usato per rilevare lo stato del pulsante (noi abbiamo scelto il pin 10):

#define BUTTON 10

Quindi, settiamo questo pin come un INPUT, nella funzione setup:

pinMode(BUTTON, INPUT);

L’ultima istruzione deve essere messa nella funzione loop:

while(digitalRead(BUTTON) == LOW);

Ma che funzione svolge l’istruzione precedente?
Quando il pusante non è premuto, la condizione logica nel ciclo while è TRUE, quindi lo sketch rimane indefinitamente dentro il ciclo e non esegue le righe successive.
Al contrario, quando il pulsante è premuto, la condizione logica diventa FALSE e lo sketch esce fuori dal ciclo while, eseguendo quindi le righe successive e iniziando la misurazione. Come potete verificare voi stessi, il serial monitor mostra le misure solo se il pulsante viene premuto.
Lo sketch completo ultrasonic_and_button.ino è allegato (eliminate l’estensione .txt se presente).

Connettiamo un display LCD e un cicalino piezoelettrico

É giunto il momento di connettere il display LCD ad Arduino. Come già visto nell’introduzione, avrete bisogno anche di altri componenti: un transistor 2N3904 (o l’equivalente 2N2222), una resistenza da 10kΩ, un potenziometro lineare da 10kΩ per regolare il contrasto. Questi componenti li usiamo per far accendere la retroilluminazione del display LCD quando premiamo il pulsante. Seguite lo schema Fritzing qui sotto per aggiornare i collegamenti:

Lo schema Fritzing del collegamento
Lo schema Fritzing del collegamento

Dato che il pin 7 ora è usato dal display, abbiamo cambiato il pin usato dal modulo HC-SR04 collegandolo sul pin 9.

Un altro componente utile è il cicalino piezoelettrico che suona quando l’oggetto si trova ad una distanza troppo elevata.

NOTA: non spiegheremo come connettere un display LCD ad Arduino e come controllare la retroilluminazione perché questi temi sono stati trattati nel tutorial Termoigrometro con orologio e display LCD su Arduino UNO.

Lo sketch

Adattiamo ora lo sketch per mettere in atto le modifiche che vogliamo attuare. Nella prima parte dello sketch dobbiamo dichiarare due costanti e una variabile.
La prima costante definisce il pin del PWM usato per accendere e spegnere la retroilluminazione del display e la seconda definisce la nota che il cicalino piezoelettrico emetterà quando l’oggetto è troppo lontano.
La variabile invece setta la luminosità della retroilluminazione al massimo valore:

#define LUMIN 11 
#define NOTE_A4 440 
int l = 255;

Ora includiamo la libreria LiquidCrystal e la inizializziamo:

// include the library code: 
#include <LiquidCrystal.h> // initialize the library with the numbers of the interface pins 
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);

Funzione setup

Nella funzione setup dobbiamo dichiarare il pin 11 come OUTPUT e inizializzare il display LCD(16 colonne e 2 righe):

pinMode(LUMIN, OUTPUT); // set up the LCD's number of columns and rows: 
lcd.begin(16, 2);

Funzione loop

Nella funzione loop facciamo alcune modifiche. Prima di tutto modifichiamo il ciclo while come mostrato sotto:

while(digitalRead(BUTTON) == LOW) 
{ 
    analogWrite(LUMIN, 0); // turn LED off 
    lcd.clear();     
    noTone(12); 
}

Quando il pulsante non è premuto, la condizione logica è TRUE, di conseguenza lo sketch aspetta nel ciclo while. In questa situazione la prima riga nel blocco spegne la retroilluminazione, la seconda pulisce lo schermo del display e la terza spegne il generatore di nota che pilota il cicalino piezoelettrico.
Quando invece il pulsante è premuto, la condizione logica diventa FALSE e Arduino salta il ciclo while ed esegue la riga seguente…

analogWrite(LUMIN, l); // turn LED on

…che accende la retroilluminazione.
Dato che non usiamo più il serial monitor ma il display LCD, dobbiamo cambiare le funzioni Serial.print in lcd.print:

lcd.setCursor(0, 0); 
lcd.print("time: "); 
lcd.print(duration); 
lcd.print(" us "); 
lcd.setCursor(0, 1); 

if( duration > 38000 ) 
{
    lcd.println("out of reach "); 
    tone(12, NOTE_A4);} 
else 
{ 
    lcd.print("dist: "); 
    lcd.print(distance); 
    lcd.println(" cm "); 
    noTone(12);
}

La prima riga del display mostra il tempo di riflessione mentre la seconda riga mostra la distanza calcolata. Se il tempo di riflessione è maggiore di 38ms, l’ostacolo è fuori range e il cicalino piezoelettrico emette una nota mentre il display mostra il messaggio “out of reach”, altrimenti lo sketch mostra la distanza misurata.
Lo sketch completo ultrasonic_button_lcd_buzz.ino è allegato (rimuovete l’estensione .txt se presente).

Test e misure

Per poter utilizzare il dispositivo agevolmente, abbiamo piazzato i componenti su una tavoletta di legno da 24×8 cm. Abbiamo pure usato due differenti breadboard: una mini per il modulo ad ultrasuoni e il pulsante ed una media per gli altri componenti.
Inoltre abbiamo installato due oggetti essenziali per aumentare l’accuratezza delle misure: un semplice puntatore laser e una livella a bolla.
Un’ultima utilissima aggiunta è costituita da una coppia di tubi di carta (lunghi ciascuno 7.5cm) che abbiamo piazzato davanti ai trasduttori del modulo ad ultrasuoni. Questi tubi sono necessari per focalizzare gli impulsi emessi dal modulo che altrimenti divergerebbero eccessivamente. Infatti, se si controlla il datasheet del modulo, si può notare che l’angolo di misurazione è di 15 gradi.
Durante i nostri test ci siamo accorti che i tubi sono necessari per “lunghe distanze” (maggiori di un metro) mentre possono dar luogo a misurazioni non veritiere se usati per distanze inferiori.
La massima distanza che è stato possibile misurare è di 418cm.

Misure eseguite col modulo ultrasuoni e la rotella metrica
Misure eseguite col modulo ultrasuoni e la rotella metrica

Operazioni di misura
Operazioni di misura

Operazioni di misura
Operazioni di misura

Per migliorare la direzionalità del sensore ad ultrasuoni, abbiamo utilizzato due tubi di carta. Abbiamo notato che in questo modo la misura è più precisa dato che gli ultrasuoni vengono direzionati meglio e quindi non rimbalzano su oggetti laterali che non stiamo puntando:

I tubi di carta
I tubi di carta

Particolare del display LCD
Particolare del display LCD

Misurazione vicina al massimo range
Misurazione vicina al massimo range

Come si può vedere il dispositivo è molto preciso
Come si può vedere il dispositivo è molto preciso

Misurazione oltre il limite massimo (4.1m)
Misurazione oltre il limite massimo (4.1m)

Considerazioni finali

L’utilizzo più immediato di questo distanziometro è quello di misurare la distanza di un oggetto. Un possibile utilizzo alternativo potrebbe essere come sensore di parcheggio: basterebbe installarlo sul muro del nostro box auto e modificargli la funzione che fa suonare il cicalino in modo che suoni quando l’ostacolo (in questo caso l’automobile) è troppo vicino.

Newsletter

Se vuoi essere aggiornato sui nuovi articoli, iscriviti alla newsletter. Prima dell’iscrizione alla newsletter leggi la pagina Privacy Policy (UE)

Se ti vuoi disiscrivere dalla newsletter clicca sul link che troverai nella mail della newsletter.

Inserisci il tuo nome
Inserisci la tua email
0 0 votes
Valutazione articolo
guest
0 Commenti
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
Torna in alto