Robotica educativa/Misurazione della distanza

Indice del libro

Prima di cominciare è bene riepilogare tutti i concetti di fisica classica che si spera siano noti allo studente (o ignoti, se l'esperienza venisse proposta nelle scuole primarie).


L'eco si verifica quando un suono incontra un oggetto di dimensioni proporzionali alla sua lunghezza d'onda (che verrà indicata col simbolo , per non confonderla con la lunghezza ).

In questo caso, conoscendo la frequenza di lavoro e la velocità del suono si ha:

Fortunatamente, la natura non è così rigorosa, pertanto l'eco si otterrà anche intercettando oggetti di dimensioni differenti. Questo approccio serve per illustrare che non tutti gli oggetti saranno individuabili e che l'eco (come quando si urla verso una montagna) si verifica poiché sussistono determinate condizioni e... i pipistrelli, per procacciarsi il loro cibo, emettono frequenze con lunghezze d'onda della dimensione degli insetti. Solo queste verranno riflesse e... buon appetito.

Bat ha fame e vuole mangiare Bug (i suoi gusti non li capirò mai). Ecco come farà.

In questo caso, la cosa più interessante è la distanza del bersaglio, che si calcola con la solita formula della velocità:

dove è la velocità del suono, che si considera costante, pari a . Tuttavia il dispositivo scelto, Arduino, non utilizza le unità di misura del Sistema Internazionale ma, per la misurazione del tempo, utilizza i microsecondi e (per nostro comodo) la distanza verrà espressa in centimetri.

Pertanto, con un'opportuna equivalenza, la velocità del suono diventa:

Quest'equivalenza è fondamentale per comprendere la linea dove verrà definita la velocità del suono.

Schema di montaggio

modifica
Il sensore a ultrasuoni HC-SR04

Come sempre, si inizia con le cose facili. Si supporrà la velocità del suono nell'aria costante, avente velocità pari a . Questa è la velocità del suono a , come a casa o in un'aula scolastica.

Questo significa che, se si riesce a comprendere il codice, lo schema di montaggio è composto soltanto dal microcontrollore Arduino, dal sensore di prossimità HC-SR04 e – letteralmente – quattro fili.

Si noti che la breadboard è facoltativa (i cavi potrebbero essere connessi direttamente al sensore). È invece opportuna in due contesti:

  1. quando si desidera una discreta accuratezza nella misurazione delle distanze;
  2. quando, oltre al sensore di prossimità, si desiderano inserire anche altri componenti (come nel Telepass, un'espansione di questo progetto).

Naturalmente, nello schema di montaggio, l'alimentazione di Arduino è sottintesa, poiché l'output viene mostrata nel computer.

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 (, filo rosso, e , filo nero) sono fornite da Arduino.

Il sensore ha altri due pedini, uno chiamato trigger, al quale si invia un impulso di per far partire l'impulso. Dopodiché vi è un secondo pedino, chiamato echo, 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 (andata e ritorno).

Va ricordato che il sensore a ultrasuoni HC-SR04 nelle sue specifiche tecniche[1], 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 lavoro pari a , 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 , rispetto al suo asse.

Utilizzo del sensore HC-SR04

modifica

Dalle specifiche tecniche del sensore[1] si legge che il trigger deve essere portato a livello alto per . Pertanto, per essere certi del suo corretto funzionamento, prima lo si porta a livello basso per almeno , come mostrato in figura.

HC-SR04 triggering

In questo modo il sensore invierà un segnale a della durata di e l'echo (dopo aver riportato il trigger a livello basso) si metterà in ascolto. Quando riceverà il segnale inviato (la sua eco) ne darà notifica al microcontrollore portandosi a livello alto.

Cronometrando il tempo intercorso tra invio e ricezione del segnale, e dividendolo per due (andata e ritorno) si ha il tempo che il suono impiega per incontrare l'ostacolo (o il bersaglio). Moltiplicando questo tempo per la velocità del suono si ottiene, finalmente, la distanza cercata.

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 utilizzare nessuna libreria. È sufficiente stimare il tempo in cui echo si porta a livello alto. Per far questo viene utilizzata la funzione pulseIn che risponde esattamente a questo scopo.[2]

// 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 dei pin di input e output
  pinMode(trigger, OUTPUT);
  pinMode(echo, INPUT);

  // Inizializzazione della comunicazione seriale col computer
  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] + [Maiusc] + M)
  // approssimata alla prima cifra decimale
  Serial.print("Distanza = " + String(spazio, 1) + " cm\n");

  // Attende 50 millisecondi prima di inviare un altro impulso
  delay(50);
}

Espansioni suggerite

modifica

Questo progetto si presta a numerose espansioni.

  • In primo luogo si è ipotizzata la velocità del suono costante. Non è così: la velocità del suono varia al variare della temperatura. Pertanto si può migliorare il risultato utilizzando un sensore di temperatura e – attraverso la temperatura acquisita – determinare la velocità del suono e una stima della posizione del bersaglio migliore.
  • Questi parametri possono essere mostrati mediante un display: così facendo non sarà più necessario l'utilizzo del computer.
  • Similmente – anzi, più semplicemente – possono essere espressi tramite segnali acustici, realizzando un vero e proprio sensore di parcheggio.
  • Infine, il sensore di prossimità può essere collocato al di sopra di un servomotore, così da simulare il comportamento di un radar. Quest'ultima applicazione è particolarmente suggestiva se si dispone di una stampante 3D con la quale stampare un supporto analogo a quello di un radar.

Datasheet e funzioni di riferimento

modifica
  1. 1,0 1,1 Datasheet by SparkFun, Ultrasonic Ranging Module HC - SR04, su Digi-Keys Electronics
  2. pulseIn, come da documentazione ufficiale di Arduino