Utente:Galessandroni/HC-SR04: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Rimozione HC-SR04
Etichetta: Editor wikitesto 2017
 
Riga 1:
[[File:HC_SR04_Ultrasonic_sensor_1480322_3_4_HDR_Enhancer.jpg|miniatura|Il sensore a ultrasuoni HC-SR04]]
In questa risorsa viene illustrato come utilizzare il sensore a ultrasuoni HC-SR04 con Arduino per misurare distanze e - di conseguenza - rilevare ostacoli.
 
Quest'ultima azione è ampiamente utilizzata nell'ambito della robotica, come è facile intuire, o - più semplicemente - nella sensoristica quando è necessario individuare ostacoli, soprattutto per la prevenzione di infortuni. Se invece si vuole realizzare qualcosa di più articolato e canticchiare ''Il pipistrello come fa?'' (parafrasando una celebre canzone dello Zecchino d'oro), allora questo sarà il componente chiave.
 
Il sensore HC-SR04, nelle sue specifiche tecniche<ref>Elijah J. Morgan, [https://cdn.datasheetspdf.com/pdf-down/H/C/-/HC-SR04-ETC.pdf HCSR04 Ultrasonic Sensor], 16 Novembre 2014</ref>, dichiara di poter rilevare la presenza di un ostacolo quando questo si trova tra 2 centimetri e 4 metri di distanza, con un margine di errore di 3 millimetri. Utilizza una frequenza di <math>40~\text{kHz}</math>, pertanto la sua lunghezza d'onda approssimativa è di poco inferiore al centimetro (l'ordine di grandezza degli oggetti che si intende individuare).
 
Infine, l'oggetto da individuare deve essere collocato in un angolo non superiore a <math>15~{}^\circ</math>, rispetto al suo asse.
 
= Prerequisiti =
[[File:Bat_bug_eco.svg|miniatura|Come un pipistrello procaccia il suo cibo]]
Di seguito verranno riproposti tutti i concetti di fisica che ''dovrebbero'' essere noti a uno studente (o ignoti, se questa esperienza venisse proposta nelle scuole primarie).
 
L'eco si verifica quando un suono incontra un oggetto di dimensioni simili alla sua lunghezza d'onda (simbolo <math>\lambda</math>). In questo caso, si ha:
 
<math>\lambda=\frac{c}{f}=\frac{343~\text{m/s}}{40~\text{kHz}}\simeq 8,58~\text{mm}</math>
 
Fortunatamente, tutto è molto più semplice. Questo approccio serviva soltanto per mostrare che non tutti gli oggetti saranno individuabili, che l'eco (quando si urla a una montagna) si verifica se sussistono determinate condizioni e... come fanno i pipistrelli a procacciarsi il cibo. La cosa più interessante è la distanza <math>d</math>, che si calcola come segue:
 
<math>d=c \cdot t</math>
 
dove <math>c</math> è la velocità del suono, che si considera costante, pari a <math>c=343~\text{m/s}</math>. Tuttavia Arduino non lavorerà utilizzando le unità di misura del [[Il sistema internazionale di unità di misura (superiori)|Sistema Internazionale]] ma, per il tempo, utilizzerà i microsecondi e (per nostro comodo) esprimeremo la distanza in centimetri.
 
Pertanto la velocità del suono diventa:
 
<math>c = 343~\text{m/s}=343~\text{m/s} \frac{10^2~\text{cm/m}}{10^6~\mu\text{s/s}}= 0,0343~\text{cm/}\mu\text{s}</math>
 
Quest'equivalenza è fondamentale per comprendere la linea 16 del codice
 
= Esperienza n. 1 =
Di seguito si supporrà la velocità del suono nell'aria costante, pertanto, avente velocità <math>c</math> pari a <math>c=343~\text{m/s}</math>. Questa è la velocità del suono a <math>20~{}^\circ\text{C}</math>.
 
Questo significa che, se si riesce a comprendere il codice, lo schema di montaggio è composto dal microcontrollore Arduino, dal sensore di prossimità HC-SR04 e - letteralmente - quattro fili. Naturalmente, nello schema di montaggio, l'alimentazione di Arduino è sottintesa, poiché l'output è mostrato nel calcolatore.
 
== Schema di montaggio ==
[[File:Sensore_di_prossimità_1.svg|miniatura|Connessione del sensore di prossimità HC-SR04 ad Arduino]]
Lo schema di montaggio, come visibile in figura, è estremamente semplice.
 
Il sensore deve essere alimentato e la sua alimentazione (<math>V_{cc}=5~\text{V}</math>, filo rosso, e <math>GND = 0~\text{V}</math>, filo nero) sono fornite da Arduino.
 
Il sensore ha altri due pedini, uno chiamato <code>trigger</code>, al quale si invia un impulso per far partire l'impulso. Dopodiché vi è un secondo pedino, chiamato <code>echo</code>, che restituisce il tempo impiegato dal segnale a raggiungere il bersaglio (e ritornare). Pertanto, nel calcolo della distanza, questo tempo dovrà essere diviso per 2.
 
== Codice ==
Di seguito il codice utilizzato per visualizzare nel monitor seriale la distanza degli oggetti localizzati dal sensore.
 
Da sottolineare che - per l'utilizzo di questo sensore - non è stato necessario includere nessuna libreria. È sufficiente stimare il tempo in cui <code>echo</code> si porta a livello alto. Per far questo viene utilizzata la funzione <code>pulseIn</code> che risponde esattamente a questo scopo.<ref>[https://www.arduino.cc/reference/it/language/functions/advanced-io/pulsein/ pulseIn], come da documentazione ufficiale di Arduino</ref>
<syntaxhighlight lang="arduino" line="1">
/*
CONTROLLO DEL SENSORE DI PROSSIMITA' HR-SC04
 
Questo codice riceve i dati provenienti dal sensore di
prossimita' HR-SC04, li analizza e li mostra a video nel
monitor seriale.
 
3A/EN, ITIS "Enrico Mattei", Urbino, 8 Febbraio 2021
*/
 
// Definizione dei pin trigger ed echo
#define trigger 2
#define echo 3
 
// Definizione della velocita' del suono (centimetri / microsecondo)
#define c 0.0343
 
// Definizione delle variabili
long tempo;
float spazio;
 
void setup() {
// Definizione di input e output
pinMode(trigger, OUTPUT);
pinMode(echo, INPUT);
 
// Inizializzazione della comunicazione seriale
Serial.begin(9600);
}
 
void loop() {
// Prima della misurazione si porta trigger a livello basso
digitalWrite(trigger, LOW);
delayMicroseconds(5);
 
// Invio di un impulso (porta trigger a livello alto per 10 microsecondi)
digitalWrite(trigger, HIGH);
delayMicroseconds(10);
digitalWrite(trigger, LOW);
 
// Lettura di echo, tramite pulseIn, che restituisce la durata dell'impuso (in microsecondi)
// Il dato acquisito viene poi diviso per 2 (andata e ritorno)
tempo = pulseIn(echo, HIGH) / 2;
// Calcolo della distanza in centimetri
spazio = tempo * c;
 
// spazio viene visualizzata nel monitor seriale (Ctrl + Maius + M)
// approssimata alla prima cifra decimale
Serial.print("Distanza = " + String(spazio, 1) + " cm\n");
 
delay(50);
}
</syntaxhighlight>
 
= Esperienza n. 2 =