Sensore ad ultrasuoni con ESP32
Introduzione
In questo articolo analizzeremo un progetto con l’ESP32 e il sensore ad ultrasuoni, in particolare il dispositivo HC-SR04, prodotto in Cina e ampiamente usato per il costo basso e dalle buone prestazioni.
Gli ultrasuoni sono onde sonore a frequenza superiore i 20 KHz, non sono udibili dall’orecchio umano.
La banda di frequenza è compresa nel range tra 20 KHz e 100 KHz.
Il principio di funzionamento di un sensore ad ultrasuoni
Quando si applica una differenza di potenziale ad un materiale piezoelettrico, esso vibra ad una determinata frequenza, viceversa quando è sollecitato meccanicamente, ai suoi capi si può prelevare una differenza di potenziale.
Il principio di funzionamento di un sensore ad ultrasuoni è simile ad un RADAR, cambia solo la frequenza di lavoro e la capacità di discriminare gli ostacoli.
Il sensore è formato da un trasmettitore , che emette l’onda ultrasonica e da un ricevitore che rileva l’onda riflessa dall’ostacolo, una figura animata può chiarire il concetto.
Il sensore ad ultrasuoni, sia la parte di trasmissione che di ricezione, ha una piccola membrana incollata su uno strato di materiale piezoelettrico.
Il trasmettitore del sensore è connesso al driver che applica una differenza di potenziale al materiale piezoelettrico, per il principio precedentemente descritto, esso inizia a vibrare insieme alla membrana.
La membrana quando vibra esercita una pressione sull’aria e in questo modo si genera un’onda acustica e nel nostro caso ad una frequenza ultrasonica.
Il ricevitore, sfrutta il principio inverso dei materiali piezoelettrici, quando la membrana è colpita dall’onda acustica, riflessa dall’ostacolo, quest’ultima esercita una pressione sulla membrana che lo trasmette al materiale piezoelettrico, deformandolo.
La deformazione del materiale piezoelettrico, provoca la generazione di una differenza di potenziale ai suoi capi, rilevata da un circuito elettronico interno al sensore.
Per determinare la distanza tra l’ostacolo e il sensore, quest’ultimo calcola il tempo intercorso dalla trasmissione dell’onda ultrasonica e quando essa è stata ricevuta.
Conosciamo la velocità di propagazione di un’onda sonora e quindi da questa equazione ricaviamo la distanza:
Dove:
- d è la distanza
- v è il modulo della velocità del suono
- t è l’intervallo temporale che ha impiegato l’onda ultrasonica a propagarsi.
Il modulo della velocità di propagazione del suono non è costante ma può variare in funzione delle condizioni atmosferiche, come la temperatura, l’umidità e la pressione, comunque, per applicazioni hobbistiche si può trascurare questa piccola variazione.
Caratteristiche del sensore HC-SR04
Di seguito riporto le caratteristiche del sensore HC-SR04, indicate nel datasheet del costruttore:
Voglio farvi subito notare che il sensore deve essere alimentato alla tensione di 5V, come indicato nel datasheet del produttore.
L’uscita del sensore “Echo Output Signal” ha un livello di tensione che può raggiungere la tensione d’alimentazione.
Ogni volta che si collega una periferica ad un altro dispositivo, bisogna sempre, verificare la compatibilità dei segnali, altrimenti, questa negligenza può portare alla rottura dei dispositivi o provocare dei malfunzionamenti.
Il dispositivo può operare nel range di lunghezza compreso tra 2cm e 4m, il limite minimo è dovuto alla capacità del sensore di discriminare intervalli di tempo estremamente brevi, mentre il limite massimo è dovuto alla capacità del sensore di discriminare il livello del segnale riflesso, cioè maggiore è la distanza e minore sarà l’entità del segnale riflesso.
Timing del sensore HC-SR04 per la rilevazione dell’ostacolo
Per attivare il sensore e avviare la misurazione della distanza di un ostacolo , bisogna fornire all’ingresso Trig del sensore HC-SR04, un impulso di livello alto, compreso nell’intervallo di tensione 2V a 5V, poiché l’ingresso è TTL compatibile, l’impulso deve avere una durata minima di 10us.
Il sensore, dopo aver ricevuto l’impulso di Trig, trasmetterà otto impulsi alla frequenza di 40kHz, per poi attendere sul ricevitore, se è presente un ostacolo, il segnale riflesso.
Se il sensore ha rilevato la presenza di un ostacolo, genererà sull’uscita Echo un impulso la cui durata è funzione della distanza, come riportato nella seguente equazione.
Dove:
- d è la distanza espressa in cm
- T è la durata dell’impulso ricevuto
- 58 è la costante di proporzionalità
Se la durata dell’impulso di Echo è compresa tra 150µs – 25ms, significa che il sensore ha rilevato un ostacolo e la distanza si determina, con l’equazione indicata sopra.
Se la durata dell’impulso è di 38ms, significa che non è presente un ostacolo.
Schema elettrico e pin function del sensore
Il sensore utilizzato in questo post , ha la seguente forma e pin function:
La tabella di connessione:
Abbiamo inserito un traslatore di livello (BOB-12009), tra l’ESP32 e il sensore ad ultrasuoni.
Il sensore ad ultrasuoni è alimentato a 5V e il livello di tensione dell’uscita è TTL, quindi, può raggiungere il livello di tensione dell’alimentazione.
La board ESP32 non può accettare livelli di tensione dei segnali d’ingresso maggiori di 3.5V, pertanto è stato aggiunto il circuito BOB-12009 per traslare i livelli di tensione dei segnali tra i due dispositivi.
Mentre l’ingresso Trig del sensore è anch’esso TTL compatibile e quindi può accettare il livello di tensione d’ingresso generato dalla board ESP32. Per maggiori dettagli sull’argomento dell’adattamento dei segnali, vi consiglio di leggere l’articolo.
Codice
Il codice riportato di seguito implementa la funzione di base del sensore ad ultrasuoni, legge la durata dell’impulso e calcola la distanza in centimetri per poi stamparla su terminale della seriale.
/* /**************************************************************** Data 03-05-22 scritto da Gennaro Vitiello codice per un sistema radar ad ultrasuoni Maggiori informazioni sul sito www.quattrodispositivi.it ******************************************************************/ const int pinTrig = 5; const int pinEcho = 18; //define velocita' del suono in cm/uS #define VELOCITA_SUONO 0.0343 long durataImpulso; float distanzaCm; void setup() { Serial.begin(115200); // Configurazione seriale pinMode(pinTrig, OUTPUT); // settiamo pinTrig come una uscita pinMode(pinEcho, INPUT); // settiamo pinEcho come un'ingresso } void loop() { // azzeriamo l'uscita digitalWrite(pinTrig, LOW); delayMicroseconds(2); // attiviamo il sensore e settaimo alto l'ingresso pinTrig per 10 micro secondi digitalWrite(pinTrig, HIGH); delayMicroseconds(10); digitalWrite(pinTrig, LOW); // legge l'ingresso pinEcho con la funzione pulseIn. durataImpulso = pulseIn(pinEcho, HIGH); // calcola la distanza in centimetri distanzaCm = durataImpulso * SOUND_SPEED/2; // stampiamo sul terminale il risultato. Serial.print("Distance (cm): "); Serial.println(distanzaCm); delay(1000); }
const int pinTrig = 5; const int pinEcho = 18;
Definiamo le costanti per i pins della board ESP32 che verranno usati e collegati al sensore.
//define velocita' del suono in cm/uS #define VELOCITA_SUONO 0.0343
Definiamo la costante della velocità del suono espressa in cm/µs.
void loop() { // azzeriamo l'uscita digitalWrite(pinTrig, LOW); delayMicroseconds(2); // attiviamo il sensore e settaimo alto l'ingresso pinTrig per 10 micro secondi digitalWrite(pinTrig, HIGH); delayMicroseconds(10); digitalWrite(pinTrig, LOW);
In questa parte di codice inviamo al sensore l’impulso di trigger, della durata di 10µs.
// legge l'ingresso pinEcho con la funzione pulseIn. durataImpulso = pulseIn(pinEcho, HIGH);
Memorizziamo nella variabile “durataImpulso”, la durata dell’impulso misurata grazie alla funzione “pulseIn” aspetta che il pin vada nello stato HIGH, incomincia a contare, fino a quando il pin non va nello stato LOW per poi smette di contare.
// calcola la distanza in centimetri distanzaCm = durataImpulso * SOUND_SPEED/2;
Converte il tempo misurato nella distanza dell’ostacolo.
// stampiamo sul terminale il risultato. Serial.print("Distance (cm): "); Serial.println(distanzaCm);
Stampa sul terminale seriale la distanza in cm dell’ostacolo.
Conclusioni
Con questo sensore si possono realizzare diversi progetti, la robotica, con intelligenza artificiale o alla semplice applicazione per rilevazione della distanza in un garage quando si parcheggia l’auto, magari collegando anche un display che indica anche la distanza.
Se hai dei dubbi e vuoi pormi delle domande non esitare a scrivermi nel form riportato di seguito.