Gestire un sensore ad ultrasuoni SRF02

Finalmente è giunto il momento di mettere le mani su uno dei sensori ad ultrasuoni che conservo nei cassetti dei componenti, in particolare sto parlando del sensore SRF02, un telemetro ad ultrasuoni in grado di eseguire misurazioni comprese tra  16cm e 6m.

Questo sensore può essere controllato sia in I2C che in seriale, la scelta della modalità di controllo avviene tramite uno dei 5 pin, che va collegato a massa se si vuole usare la seriale, o lasciato non collegato se si vuole usare il controllo tramite I2C. In questo articolo parlerò della mia esperienza con il sensore controllato in I2C tramite un PIC 18F2620, e come si potrà vedere la gestione del sensore è identica a quella di una comune EEPROM I2C. I dettagli sul sensore e il suo utilizzo li potete trovare a questo link.

Cominciamo ad analizzare lo schema elettrico del circuito che è quanto di più semplice possa esistere.

srf02.png

Come si può vedere, oltre alla circuiteria di base per il PIC (quarzo, condensatori e resistenza su MCLR) il sensore è collegato ai pin RC3 e RC4 rispettivamente SCL e SDA, utilizzati dal modulo MSSP del PIC per la comunicazione con dispositivi Slave I2C. Entrambi questi pin sono tenuti a livello alto tramite due resistenze di pull-up da 1,8K ohm, così come richiesto dalle specifiche del BUS I2C. Ho aggiunto allo schema anche un display, per poter visualizzare i valori restituiti dal sensore.

Vediamo ora il codice:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
void main(void)
{
unsigned char counter;
unsigned int range=0, autotune=0;
 
    // Configurazione del PIC
    config_system();
    // Esegue 6 letture ravvicinate per l'autotune
    srf02_init();
 
    // Loop infinito
    for(;;)
    {
        // Invia al sensore la richiesta per avviare la misurazione in cm
        srf02_tx(SRF08, 0, 81);
        Delay10KTCYx(70);
        // Legge i sei registri del sensore
        srf02_rx(SRF08, 0, 6);
        lcd_clear();
        // Scrive la versione del software del Sensore
        lcd_put_uchar(srf02_buffer[0],0,0);
        // Scrive il valore del registro non usato (dovrebbe essere 0x80)
        lcd_put_uchar(srf02_buffer[1],0,4);
        // Scrive il valore letto dal sensore
        range = (srf02_buffer[2]<<8);
	range += srf02_buffer[3];
        lcd_put_uint(range,0,8);
        // Scrive il valore di autotune
        autotune = (srf02_buffer[4]<<8);
	autotune += srf02_buffer[5];
        lcd_put_uint(autotune,0,14);
 
        Delay10KTCYx(500);
    }
}

Come si può vedere anche il codice (quello completo è scaricabile da questo link) è molto semplice, alla riga 15 viene chiamata la funzione che avvia la misurazione della distanza in centimetri da parte del sensore. Poi un delay attende che siano passati 70 millisecondi, il tempo necessario per ricevere l’eco più lontana e poi vengono letti i 6 registri del sensore, memorizzando i valori nell’array srf02_buffer. Come indicato nella guida ogni registro del sensore contiene delle informazioni specifiche, come si può facilmente capire dai commenti nel codice, la parte che ci interessa di più è quella alle righe 25 e 26, dove viene letta la distanza misurata tra il sensore e l’oggetto che si trova di fronte. Sul display, a scopo puramente didattico, il codice visualizza tutti gli altri valori, e come si può vedere tutto il ciclo viene ripetuto ogni mezzo secondo. Alla riga 9 viene chiamata la funzione srf02_init(), questa non fa altro che eseguire sei misurazioni in rapida sequenza, come indicato nelle specifiche del sensore le prime 5/6 misurazioni vengono usate per fare un’auto calibrazione del sensore.

In un primo momento, seguendo l’esempio riportato sulle pagine della documentazione, andavo a leggere solamente i due registri che contengono la misura della distanza, facendo in questo modo però avevo delle strane misure che, partendo da un minimo cominciavano ad incrementarsi per dieci letture consecutive per poi ricominciare da capo. La misura più piccola risultava però essere molto più precisa di quella che ottengo leggendo tutti e 6 i registri. Non avendo trovato informazioni utili su questo strano comportamento ho comunque deciso di considerare il metodo della lettura di tutti i registri come più stabile, e quindi come sistema da utilizzare. Se avete delle esperienze diverse sarei curioso di capirne di più quindi non esitate a postare commenti con le vostre esperienze.

IMG_9731.JPG

Prossimamente voglio provare ad utilizzare anche il modello SRF10, che viene gestito analogamente al SRF02, ma essendo dotato di una capsula US trasmittente ed una ricevente riesce a gestire una misura minima più bassa pari a 6cm.

:: Scarica il codice completo ::

Un Commento:

  1. Nel post successivo [http://www.it-robotix.net/2011/11/02/412/] potete trovare il nuovo codice che ora funziona correttamente.

I commenti sono chiusi