Modulo Sonar Srf04

Bene, ora vediamo cosa è un modulo ad ultrasuoni, più comunemente chiamato Sonar. Tale modulo è un Trasmettitore e Ricevitore di segnali ad ultrasuoni(che si aggirano sui 40KHz). Il funzionamento è semplice, il modulo genera un segnale a 40KHz e viene emesso dalla capsula TX. Sul modulo e presente anche una capsula RX la quale capta il segnale di ritorno (chiamato anche echo nel linguaggio tecnico). Ma cosa significa segnale di ritorno(echo)? Una volta trasmesso il segnale a 40KHz nell’etere esso “rimbalza” sugli ostacoli posti davanti. Se noi poniamo un oggetto di fronte al modulo esso farà rimbalzare il segnale emesso in precedenza(40KHz) e questo segnale di ritorno verrà captato dalla capsula Ricevente.

Premesse: Il suono viaggia a 340 m/s, ovvero 0,34 mm/us (340000 /1000000), e dato che l’echo ritorna dopo aver percorso due volte la distanza tra oggetto e modulo(andata + ritorno). Quindi per avere la distanza esatta dovremo usare la formula:

S=(VxT)/2

Quindi si moltiplicherà il tempo per 0,17. A virgola fissa basterà quindi moltiplicare per 17 e dividere per 100. Il range massimo ottenibile sarà quindi 65535 * 0,17 = 11141 , ovvero 11,11 m. Il nostro modulo(in questo caso ho deciso di utilizzare il modulo SRF04 della Devantech) è in grado di captare oggetti al massimo distanti 3mt. Il funzionamento di tale modulo è abbastanza semplice (solo 4 reali connessioni da effettuare), la parte più difficile sta nel misurare la durata dell’impulso di ritorno(echo) che ci indicherà la distanza dell’oggetto.

Per generare il segnale a 40KHz ci baserà inviare un segnale di 10uS al modulo (sull’apposito pin , “trig” tutto raffigurato nelle pagine successive). Una volta trasmesso il segnale dei 40KHz(chiamato sul datasheet Sonic Brust ) il modulo resterà in attesa del segnale di echo che sarà presente sul pin “Echo pulse output “. Per sapere la distanza dell’oggetto noi andremo a misurare per quanto questo segnale è a livello alto. Per fare ciò utilizzeremo un Microcontrollore pic, precisamente il Modulo TIMER1 del pic 16F818.

Quindi procedendo per blocchi, appena arriva il segnale di echo, facciamo partire il timer che inizierà a contare, fino a quando il segnale echo ritornerà a livello basso. Nei due registri TMR1H e TMR1L avremo il valore del timer, che poi provvederemo ad elaborare per sapere la distanza. Sia per generare il segnale di trigger(quello di durata 10uS necessario per far generare al modulo i 40KHz) utilizzeremo il modulo TIMER1 del pic.

Nel mio caso ho scelto di visualizzare il tutto su un display 16 x 2 LCD.

Ora, dopo un po’ di cenni teorici passiamo alla pratica, vi allego qui sotto l’immagine del modulo , delle relative connessioni, del pic e dello schema elettrico.


































Clicca qui per ingrandire lo schema

Codice Sorgente

Il codice sorgente in C è il seguente
/***********************************************/
/* ULTRASUONI – MODULO SFR04 */
/* Devil_EvoXxX - Davide Dal Fra 05/05/2007 */
/***********************************************/

#include
#include"Delay.c"
#include"lcd.c"
#define trig RB0
#define echo RB1
unsigned int get_sfr04(void);
main(void)
{


unsigned int range;
TRISB=0x02; //RB1 ING,le altre tutte uscite per utilizzare il display
PORTB=0x02; //setto le porte tutte a livello basso
LCD_INIT(); //inizializzo il display
LCD_CLEAR();


while(1)
{
range=(17UL * get_sfr04())/100;
LCD_CLEAR();
LCD_CMD(LCD_line1);
DelayMs(10);
LCD_PUTUN(range);
TMR1H=0;
TMR1L=0;
T1CON=0x01;
TMR1IF=0;
while(!TMR1IF);
TMR1ON=0;
}
}
unsigned int get_sfr04(void)
{
TMR1H=0xFF; //prepara il timer per l’impulso da 10uS
TMR1L=0xF6;
T1CON=0x01; //setta il prescaler a 1:! e lo attiva
TMR1IF=0;
trig=1; //alza a livello alto la porta trig(RB0)
while(!TMR1IF); //attende 10uS
trig=0; //riporta a livello basso la porta trig(RBO)
TMR1ON=0; //ferma il timer

TMR1H=0; //prepara il timer per misurare la durata dell’echo(RB1)
TMR1L=0;
T1CON=0x00; //prescaler a 1:1 non attivo
TMR1IF=0;
while(!echo); //attende che echo(RB1) vada a livello alto
TMR1ON=1; //e attiva il timer
while(echo && !TMR1IF); //attende che echo(RB1) ritorni a livello basso
TMR1ON=0; //ferma il timer
if(!TMR1IF)
return (TMR1H<<8)+TMR1L; //TMR1H:TMR1L contiene il valore dell’echo in uS
return 0xFFFF; //out of range
}

Bene, una volta programmato il pic e montato il circuito alimentiamo e andiamo a vedere un po se funziona tutto. Prendiamo alla mano l’oscilloscopio analizziamo il segnale di echo. Se ci compare qualcosa del genere siamo a cavallo. Questa forma d’onda è la forma generata da un oggetto distante 1,73 mt.

Ora per verificare se il sensore funziona veramente, proviamo a mettere un oggetto piu vicino e noteremo che il segnale diventerà piu “stretto”(l’ampiezza di t diminuirà). Quindi più un oggetto sarà vicino, piu T sarà piccolo, e viceversa, se l’oggetto è distante T sara piu grande. Ma quanto piu grande? Leggendo il datasheet il nostro Sonar ha portata di 3 mt, ed analizzando il diagramma temporale si legge che se non incontra alcun oggetto il segnale di echo sarà al massimo di 36mS.

Per qualsiasi altro riferimento al sensore vi consiglio di cercare sul datasheet del costruttore. Se avete domande/consigli contattatemi pure alla mia e-mail

File

[ Articolo Completo]
Scarica

[ Sorgenti in c ]
Scarica