Sensore HC-SR04
Il sensore HC-SR04 è un sensore in grado di rilevare la distanza di un oggetto tra circa 2 cm a 4 m. La precisione è di circa 1 cm.
Per fare una misura di distanza è necessario inviare nel piedino denominato "Trig" un impulso della durata di 10 microsecondi.
Il modulo a questo punto genera automaticamente un treno di 8 impulsi a 40 KHz. Contemporaneamente il piedino echo viene portato a 5 V e tornerà a 0 V solo quando il treno di impulsi, incontrando un ostacolo, verrà rimbalzato indietro.
La distanza dell'ostacolo è quindi legata alla larghezza dell'impulso sul piedino echo.
La velocità del suono è di 331,5 m/s a 0 °C e di 343,4 m/s a 20 °C ed in generale varia secondo la relazione
v = 331.4 + 0.62 T
con T temperatura misurata in °C.
Assumendo di lavorare alla temperatura di 20°C la velocità del suono sarà di circa
v = 343 m/s = 343 * 102 cm/s = 343 * 10-4 cm/microsecondo
Poiché
velocità = spazio / tempo
lo spazio percorso sarà
spazio = velocità * tempo
da cui
spazio = 0.0343 * t
se il tempo è espresso in microsecondi.
Per calcolare lo spazio percorso, bisogna tener conto che il suono percorre due volte la distanza da misurare (giunge sull’oggetto e ritorna indietro al sensore) quindi il valore di tempo misurato dev’essere diviso per 2.
La distanza dell'oggetto in centimetri è quindi
distanza = (0.0343 * t)/2 = tempo / 58.31
OSSERVAZIONE: il ciclo di misurazione deve essere di almeno 60 ms per evitare che il nuovo segnale di trigger generi un falso eco.
Per testare il modulo HC-SR04 è possibile utilizzare varie librerie distriduite con l'IDE di Arduino. Per installarle è sufficiente andare in Sketch > #Include Libreria > Gestione librerie... successivamente nel campo di ricerca digitare HC-04 e nell'elenco selezionare una delle possibili scelte. Successivamente andare su File > esempi e cercare gli esempi relativi alla libreria importata.
È possibile tuttavia fare una lettura senza installare librerie, usando la funzione Arduino pulseIn() che legge un impulso (HIGH o LOW) su un pin. Ad esempio, se il valore è HIGH, pulseIn() attende che il pin passi da LOW a HIGH, avvia il cronometraggio, quindi attende che il pin diventi LOW e interrompe il cronometraggio. Restituisce la lunghezza dell'impulso in microsecondi oppure rinuncia e restituisce 0 (zero) se non è stato ricevuto alcun impulso completo entro il timeout. La temporizzazione funziona correttamente su impulsi da 10 microsecondi a 3 minuti di durata.
Qui in seguito è riportato un esempio di utilizzo:
lo sketch da caricare è:
#define trigger 8
#define echo 7
int tempoVolo;
float distanza;
void setup(){
Serial.begin(9600);
pinMode(trigger,OUTPUT);
pinMode(echo,INPUT);
}
void loop(){
digitalWrite(trigger,LOW);
delayMicroseconds(5);
digitalWrite(trigger,HIGH);
delayMicroseconds(10);
digitalWrite(trigger,LOW); // Creazione del segnale di trigger
tempoVolo = pulseIn(echo,HIGH); // Lettura del tempo di volo
distanza = (float)tempoVolo/58.31; // Calcolo della distanza in centimetri
Serial.print ("Distanza = ");
Serial.print (distanza);
Serial.println (" [cm]");
delay (200);
}