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.