Brainbooster
Il sensore ad Ultrasuoni SRF05 e simili
Tutorials -
Sabato 07 Agosto 2010 11:36
Scritto da Brainbooster

Cosa è un SRF05?

SRF05 non è altro che l'acronimo di Sonic Range Finder 05 e come dice il suo stesso nome è un misuratore di distanze che sfrutta gli ultrasuoni per determinare la distanza dall'ostacolo che ha di fronte, ed in questo caso è il quinto della serie (05) .

FotoFrontale

 

Come vedete dall'immagine qui sopra, il sensore è costituito in verità da due elementi (i due trasduttori di ultrasuoni) ben evidenti e distinti, il loro compito sarà rispettivamente trasmettere e ricevere il suono (ultrasuono) rimbalzato dall'ostacolo.

Retro

Proseguendo nell'osservazione esterna del sensore vediamo che sul retro della scheda di supporto ci sono varii circuiti integrati ed altri componenti, questi costituiscono l'intelligenza del sensore e renderanno a noi pi√Ļ semplice la vita quando andremo ad utilizzarlo.

I fori presenti sul lato inferiore sono destinati al collegamento con arduino, mentre quelli superiori sono usati per la programmazione del sensore in fase di produzione.

Pinuot

 

Ma prima di metterci al lavoro con i cavi il sensore e arduino....

Un pò di teoria...

Per capire bene il funzionamento di questo tipo di sensori analizziamone il funzionamento.

Grazie all'"intelligenza" inclusa nel sensore, tutto quello che dobbiamo fare con arduino è inviare al piedino del sensore denominato trigger, un impulso (valore alto) della durata di dieci microsecondi, questo vale per il sensore come richiesta di lettura.

A questo punto il sensore tramite una delle due capsule ultrasoniche, sparer√† un treno di 8 impulsi di ultrasuoni (quindi fuori dal campo dell'udito umano), i qualii rimbalzeranno sull'ostacolo pi√Ļ vicino e dopo un certo tempo ritorneranno indietro per essere captati dall'altra capsula ultrasonica.

L'altra capsula (che in questo caso fà da microfono per ultrasuoni), una volta ricevuto il suono un pò attenuato da tutti questii giri ,lo passa alla circuiterie interna del sensore che lo normalizzerà e lo elaborerà restituendoci un impulso squadrato e pulito di livello ttl.

Il diagramma successivo mostra questi avvenimenti sulla stessa linea temporale visti dai varii pin del sensore.

Diag1

Quindi in fin dei conti, a noi resta solo il compito (con arduino) di contare quanto tempo passa fra la trasmissione e la ricezione dell'impulso quindi dobbiamo "cronometrarlo"...

Ricordate la formula

Velocità = Spazio/Tempo

bè questo è uno dei casi in cui applicarla :)

Se noi vogliamo sapere lo spazio che c'è fra il sensore e l'ostacolo useremo la formula inversa:

Spazio=tempo/velocità

quindi sapendo che la velocità del suoono nell'aria è di circa 340m/s ed avendo ricevuto da arduino il tempo intercorso, non ci resta che calcolarci lo spazio o distanza con la semplice formula (vi risparmio i calcoli intermadii):

Distanza(cm)=Tempo(uS)/58

ed avremo la distanza dal sensore direttamente calcolata in centimetri!

Arduino ti presento il sensore SRF05

E' finalmente arrivato il momento di mettere in pratica ciò che abbiamo appreso ed applicarlo alla vita reale!

Iniziamo con i collegamenti:

Colleghiamo tutto

come vedete abbiamo sempllicemente collegato i due pin del sensore denominati vcc e gnd, rispettivamente al +5V e l'altro a gnd su arduino e poi colleghiamo il pin chiamato trigger al pin 3 di arduino (ci serve un pwm) ed il pin chiamato echo lo connetteremo al pin 2 . (potete anche omettere il led esterno, funzionerà comunque)

Sul sensore c'è anche un altro contatto di cui non abbiamo parlato ed è quello che si occupa della scelta della modalità di lavoro delle 2 disponibili (la seconda modalità usa un solo pin per trigger e echo e quindi và comandata diversamente).

Una volta fatti tutti i collegamenti possiamo caricare il seguente codice su arduino (grazie a LukyLerry):

const int numOfReadings = 10;                   // numero di letturesu cui fare la media
int readings[numOfReadings];                    // creo un array apposito per conservare le letture
int arrayIndex = 0;                             // inizializzo l'indice dell'array corrente
int total = 0;                                  // conterrà il totale cumulativo
int averageDistance = 0;                        // conterrà la media calcolata
// setup dei pins 
int echoPin = 2;                                // SRF05 echo su pin (digital 2)
int initPin = 3;                                // SRF05 trigger su pin (digital 3)
unsigned long pulseTime = 0;                    // conterrà il tempo intercorso in us
unsigned long distance = 0;                     // conterrà la distanza (in cm)
// setup pins/values for LED
int redLEDPin = 9;                              // il  LED, collegato al pin 9
int redLEDValue = 0;                            // conterrà la variabile della luminosità del led 
void setup() {
  pinMode(redLEDPin, OUTPUT);                   // setto il pin 9 come output
  pinMode(initPin, OUTPUT);                     // sett il pin 3 come output
  pinMode(echoPin, INPUT);                      // setto il pin 2 come input per l'eco
  // creiamo la struttura che serve a riempire l'array
  for (int thisReading = 0; thisReading < numOfReadings; thisReading++) {
readings[thisReading] = 0;
 }
// Inizializziamo la porta seriale che ci mostrerà le letture
 
     Serial.begin(9600);
 }
// Il programma
void loop() {
digitalWrite(initPin, HIGH);                    // manda un impulso di 10 microsecondi
delayMicroseconds(10);                  // attende 10 microsecondi prima di andare a low
digitalWrite(initPin, LOW);                     // Piedino low, stop impulso
pulseTime = pulseIn(echoPin, HIGH);             // Attendi in ascolto l'impulso di rimbalso e cattura il tempo impiegato
distance = pulseTime/58;                        // Distance = pulse time / 58 to convert to cm.
 total= total - readings[arrayIndex];           // applichiamo la formula
readings[arrayIndex] = distance;                // aggiungiamo la lettura all array
total= total + readings[arrayIndex];            // aggiungiamo la lettura al totale
arrayIndex = arrayIndex + 1;                    // posizioniamoci sul prossimo elemento dell'array
// alla fine dell' array (10 oggetti) inizia da capo
if (arrayIndex >= numOfReadings)  {
    arrayIndex = 0;
  }
  averageDistance = total / numOfReadings;      // fai la media delle distanze
  // se la distanza è meno di 255cm cambia la luminosità del LED
  if (averageDistance < 255) {
    redLEDValue = 255 - averageDistance;        // questo serve a dare a distanza minore, luminosità superiore.
  }
  analogWrite(redLEDPin, redLEDValue);          // scriviamo il valore corrente della luminosità
  Serial.println(averageDistance, DEC);         // stampiamo sul serial monitor il valore letto
  delay(100);                                   // attesa di 100 milli prima del prossimo loop
}

 

Al termine dell'upload del programma aprite il serial monitor e dovreste poter leggere la distanza rilevata dal sensore agli ostacoli, provate a metterci una mano di fronte e a vedere la variazione di lettura.

Il range di localizzazione di questo tipo di sensori è quello che vedete nell'immagine qui sotto:

 

 

Range

 

 

quindi oggeti troppo "laterali" rispetto al campo visivo frontale potrebbero non essele localizzati.

Ciao da BrainBooster divertitevi!

 

Gioblu Robotics ¬© 2010 - 2012 · Sitemap · privacy

gioscarab@gmail.com

Gioblu BOTServer è online dal 10 Aprile 2010 - 319.232 Visite - 1.027.175 Pagine visualizzate - 182.309 Visitatori unici - 536 utenti attivi