Il sensore ad ultrasuoni Caratteristiche elettriche Alimentazione: 5 Vcc Il sensore rileva oggetti da 0 cm fino a 6,45 metri. Tre diverse possibiltà per leggere il dato di uscita del sensore: 1. lettura seriale del dato che indica la distanza dell’oggetto dal sensore (piedini TX-RX) con velocità di 9600 baud; 2. lettura dal piedino AN del sensore di una tensione proporzionale alla distanza dell’oggetto rilevato, con una precisione di 3,86 mV/cm. 3. lettura dell’uscita sul pin PW di un impulso di durata proporzionale alla distanza dell’oggetto, con una precisione di 57,87 μs/cm. Lettura del dato • Nel nostro esperimento utilizzeremo la modalità di lettura del dato del sensore, mediante la misura della tensione analogica presente sul pin AN . • Come detto la tensione misurata su questo pin risulta proporzionale alla distanza dell’oggetto dal sensore, con un fattore di 3,86 mV per ogni cm di distanza. Esperienza di laboratorio • Progettiamo adesso un circuito per la “rilevazione della prossimità di un oggetto”. • Il circuito è basato sul PIC 16F876, perché questo modello dispone di un convertitore A/D, per la conversione del dato analogico proveniente dal sensore ad ultrasuoni. • Il requisito principale del circuito è che il circuito segnali la “prossimità” di un oggetto, mediante l’accensione di un LED. Rivelatore di prossimità • Se l’oggetto ha una distanza inferiore a 10 cm, il circuito deve segnalare questo evento. • Poiché la caratteristica del sensore è di 3,86 mV/cm, ne segue che quando l’oggetto si trova a 10 cm, sul pin AN del sensore ci saranno 38,6 mV. • Il software deve prevedere l’accensione del LED se la tensione sull’ingresso del convertitore A/D del PIC è pari o al di sotto di 38,6 mV. CONVERTITORE AD PIC16F87X Il PIC16F877 possiede ben 8 ingressi analogici di tipo sample and hold con risoluzione di 10 bit. Abbiamo quattro registri per interagire con il convertitore: - ADRESH - Parte alta risultato della conversione - ADRESL - Parte bassa risultato della conversione - ADCON0 e ADCON1 - Registri di controllo Registro ADCON0 Registro ADCON0 Passi da seguire per avviare una conversione 1. Configurare il pin da utilizzare come ingresso analogico nel registro TRISA come input. 2. Configurare il registro ADCON1 (es. poniamo ADCON1 = 10001110 ). 3. Configuriamo il registro ADCON0 (es. poniamo ADCON0= 00000001 ). In questo modo selezioniamo il canale RA0, la frequenza di conversione (Fosc/2) e accendiamo il convertitore (ADON) 4. Avviamo la conversione, flag GO/DONE=1 . 5. Attendiamo il termine della conversione (la conversione termina quando il flag GO/DONE diventa = 0 , oppure quando il flag ADIF diventa = 1). 6. Leggere il dato convertito dai registri ADRESH e ADRESL. La lettura del dato dall’ADC Il dato digitale a 10 bit fornito dall’ADC interno al PIC16f876 viene reso disponibile al termine della conversione nella coppia di registri a 8 bit rispettivamente ADRESH per la parte alta e ADRESL per la parte bassa. Questi due registri vengono letti dal programma software che gira sul PIC e i dati vengono messi nelle due variabili di programma HBYTE e LBYTE. Quindi al fine di ottenere un unico dato digitale, si combinano insieme HBYTE e LBYTE mediante una operazione di OR logico. Calcolo del dato dell’ADC corrispondente alla distanza di 10 cm Per calcolare qual è il dato fornito dall’ADC ( con una risoluzione di 10 bit) per una distanza dell’oggetto pari a 10 cm, occorre impostare la seguente proporzione: 5 V : 1024 = 38,6 mV : dato_ADC Da cui: dato_ADC = 1024 * 0,0386 / 5 = 7,905 ~ 8 = Ricapitolando N N = 8 (se il sensore rileva un oggetto ad una distanza di circa 10 cm) Lo schema elettrico LED Il programma in c++ per il PIC #include <pic.h> main ( ) { int LBYTE, HBYTE, N; ADCON0=0b01000001; OPTION=0b10000111; TRISA=0b00000001; TRISB=0; RB0=0; ADCON1=0b10001110; while (1) { while (!(T0IF)) { } T0IF=0; ADGO=1; while (!(ADIF)) { } ADIF=0; } } // Fosc/8 , A/D abilitato // TMR0 prescaler, 1:256 // imposta RA0 come ingresso // imposta RB0 della porta B come uscita sul LED // spegni LED // right justify, ingresso analogico=RA0 // aspetta che il timer vada in timeout // AVVIA CONVERSIONE // aspetta che la conversione finisca HBYTE=ADRESH; LBYTE=ADRESL; HBYTE<<=8; N=HBYTE | LBYTE; // riversa parte alta del dato convertito in HBYTE // riversa parte bassa del dato convertito in LBYTE // shifta di 8 posizioni a sinistra HBYTE // mette insieme - OR - la parte alta e la parte bassa if (N<=8) RB0=1; else // accendi il LED se la distanza è <= 10 cm // oppure spegnilo RB0=0; UTILIZZO DEL SENSORE SRF02 PER FAR FUNZIONARE QUESTO ALTRO TIPO DI SENSORE AD ULTRASUONI OCCORRE REALIZZAREUN COLLEGAMENTO DI TIPO IIC (detto anche I2C) FRA IL PIC ED IL SENSORE. Lo standard I2C • Il bus I2C è un sistema messo a punto dalla Philips nella metà degli anni ottanta che consente di pilotare una famiglia molto vasta di circuiti integrati utilizzando solamente due linee I/O più la massa. • Si tratta dunque di un economico protocollo di comunicazione seriale a bassa o media velocità (100kbit/s, 400kbit/s o più recentemente 3,4Mbit/s) • Esso consente di indirizzare un numero molto grande di dispositivi sullo stesso bus, grazie ad un codice d'indirizzo proprio a ciascun dispositivo. Utilizzo del bus I2C Molti dei dispositivi che adottano il bus I2C sono costruiti dalla Philips, ma anche aziende indipendenti adottano quello che è ormai diventato uno standard molto diffuso. Fra i modelli forniti dalla Philips, troviamo diversi orologi/calendari (PCF8573, PCF8583), memorie RAM statiche (PCF8570), memorie EEPROM (PCF8582, 24C01), convertitori analogico/digitali (PCF8591) e molto altro. Hardware del bus I2C • Il bus I2C è composto, come si è detto, da due sole linee bidirezionali più la massa. • La prima linea, denominata SCK è il clock della trasmissione e la seconda, denominata SDA è la linea su cui transitano i dati al ritmo scandito da SCK. • Il protocollo in questo modo è sincrono (a differenza, per esempio del protocollo RS232 che è asincrono e più complesso da gestire). • Data la possibilità di avere più dispositivi presenti sulle linee, normalmente esse sono gestite con una logica a drain aperto e richiedono una resistenza di pull-up collegata con il positivo di alimentazione. Gestione del bus I2C La situazione più semplice è quella in cui vi sia un solo trasmettitore ed un solo ricevitore sul bus I2C. Si può distinguere tra dispositivo master e dispositivo slave a seconda di chi genera il clock, in altre parole a seconda di chi impone la cadenza con cui i dati vengono inviati sulla linea, sia in un senso che nell'altro. In questo modo, il dispositivo master potrà essere sia un trasmettitore o un ricevitore, in modo complementare rispetto al dispositivo slave. Come regola generale, ad un istante prefissato, sul bus I2C vi può essere un solo master ed un numero anche rilevante di slave. Nella stragrande maggioranza dei casi, il microcontrollore funge da master ed il dispositivo da gestire da slave. In altre parole, il clock SCK sarà sempre gestito dal microcontrollore mentre la linea SDA è generalmente bidirezionale. Connessione del PIC16F876 al bus I2C Le uniche linee del PIC che occorre connettere al bus sono i pin RC3 ed RC4. Pinout della EEPROM 24LC64 Ogni device deve avere un indirizzo unico. Ad esempio per una sola EEPROM collegata al bus, si può impostare il suo indirizzo come 000, mettendo a massa i pin A0, A1, A2 della EEPROM. PIC 16F876 Pin RC3 Pin RC4 Il livello fisico del protocollo I2C Quando il MASTER vuole comunicare con uno SLAVE allora egli inizia la sequenza di START. Quando la comunicazione deve finire allora egli attiva la sequenza di STOP. I dati sono trasferiti in sequenze da 8 bit, che viaggiano sulla linea SDA a cominciare dal bit MSB (più significativo). Ogni bit spedito sulla linea SDA, viene anche sincronizzato dal segnale SCL (clock). Ogni 8 bit traferiti il dispositivo che riceve i dati, invia indietro un bit di ACK (ackowledge=conferma) per confermare che gli 8 bit sono stati acquisiti correttamente. GESTIONE DEL SENSORE SRF02 • L`indirizzo base dell`SRF02 è 0xE0. • Il sensore appare all`utilizzatore come una serie di locazioni di memoria indirizzabili: - Ed una serie di comandi possibili da potergli inviare: Schema elettrico PIC – SRF02 Pinout del PIC 18F452 Il programma del PIC program parcheggio dim dato_high, dato_low, lettura as integer main: TRISA=0 PORTA.0=0 while (1) I2C_Init(1000000) ` frequenza di clock I2C_Start I2C_Wr($E0) ' il PIC indirizza il sensore SRF02, indirizzo di default = $E0 + bit W/R = 0 (cioè esegui WRITE) I2C_Wr(0) ' locazione 0, cioè comandi I2C_Wr($51) ' il comando è fai una lettura del sensore I2C_Stop delay_ms(70) I2C_Start I2C_Wr($E0) ' il PIC indirizza il sensore SRF02, indirizzo di default =$E0 + bit W/R = 0 (cioè esegui WRITE) I2C_Wr(2) ' leggi dal registro 2 del SRF02 la parte alta del dato acquisito I2C_Repeated_start I2C_Wr($E1) ' il PIC indirizza il sensore SRF02 + bit W/R = 1 (cioè esegui READ) dato_high = I2C_Rd(1) ' legge un dato dal sensore (con acknoledge) dato_low = I2C_Rd(0) ' legge un dato dal sensore (senza acknoledge) I2C_Stop lettura = dato_low or (dato_high<<8) if lettura <= 10 then porta.0 = 1 else porta.0 = 0 endif wend end.