Il sensore ad ultrasuoniAlimentazione: 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 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
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.
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
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:
Da cui:
=
N = 8 (se il sensore rileva un oggetto ad una
distanza di circa 10 cm)
Lo schema elettrico
main ( )
TRISA=0b00000001; // imposta RA0 come ingresso
TRISB=0; // imposta RB0 della porta B come uscita sul LED
RB0=0; // spegni LED
while (1)
T0IF=0;
ADIF=0;
HBYTE=ADRESH; // riversa parte alta del dato convertito in
HBYTE
LBYTE=ADRESL; // riversa parte bassa del dato convertito in
LBYTE
HBYTE<<=8; // shifta di 8 posizioni a sinistra HBYTE
N=HBYTE | LBYTE; // mette insieme - OR - la parte alta e la parte
bassa
if (N<=8) RB0=1; // accendi il LED se la distanza è <= 10
cm
else RB0=0; // oppure spegnilo
}
}
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
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),
EEPROM (PCF8582, 24C01), convertitori
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.
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
Pin RC3
Pin RC4
occorre connettere al bus
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.
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.
• Il sensore appare all`utilizzatore - Ed una serie di
come una serie di locazioni comandi possibili da
di memoria indirizzabili: potergli inviare:
Schema elettrico PIC – SRF02
Pinout del PIC 18F452
main:
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
if lettura <= 10 then porta.0 = 1
else porta.0 = 0