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.

Figura 1

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à
Figura 2

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:

Figura 3

La tabella di connessione:

Figura 4

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.

Lascia una risposta

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Ti sei iscritto alla newsletter

There was an error while trying to send your request. Please try again.

Quattrodispositivi utilizzerà le informazioni fornite in questo modulo per restare in contatto con te e fornire aggiornamenti del sito