Maturità-1995 Sistemi
© by Vittorio Crapella - i2viu
ESAMI DI MATURITÀ PROFESSIONALE
EX PROGETTO 92
Indirizzo : TECNICO DELLE INDUSTRIE ELETTRONICHE
TEMA 1995 :
In una cittadina in alcune strade è stata predisposta una rete di centraline per la rivelazione delle velocità dei mezzi in transito, collegate ad una centrale operativa tramite linee dedicate.
Ogni centralina è costituita da:
- un sistema basato su un dispositivo programmabile;
- due coppie sorgente/rivelatore a raggi infrarossi con fascio orientato orizzontalmente alla strada, poste a 20 cm di distanza l'una dall'altra;
- una macchina fotografica automatica, posizionata in modo da poter acquisire l'immagine della targa della vettura in contravvenzione quando supera il Limite di velocità di 50 km/h ;
- Un sensore di luminosità, opportunamente tarato, per valutare la fattibilità della foto.
I1 sistema risale alla velocità del mezzo in transito misurando il tempo che intercorre tra la interruzione del primo fascio e quella del secondo.
Rilevato l’eccesso di velocità, se la luminosità è sufficiente (uscita del sensore superiore a 15m A), il sistema provvede ad inviare il comando di azionamento della macchina fotografica e a confrontare il numero di foto scattate con quelle a disposizione nel rullino.
Dopo aver scattato l'ultima foto, la centralina invia a una centrale il suo codice di identificazione e le velocità misurate in corrispondenza di tutte le foto scattate; quindi diventa non operativa fino all'arrivo della manutenzione.
II candidato, formulate le necessarie ipotesi aggiuntive:
1) disegni e commenti lo schema a blocchi dell'intero sistema;
2) proponga ed illustri un sistema ed i mezzi per il collegamento tra le centraline e la centrale operativa;
3) proponga una realizzazione pratica, basata su componenti o linguaggi che conosce, per almeno una delle seguenti funzioni a sua scelta:
a) un blocco di interfaccia, ritenuto idoneo alla situazione considerata. tra il sensore di luminosità ed il sistema programmabile;
b) un sistema in grado di misurare il tempo di transito dell'automezzo tra i due punti di rivelazione ;
c) l’algoritmo di misura della velocità e quello relativo alle operazioni di registrazione della infrazione.
Soluzione © by Vittorio Crapella
SOLUZIONE DEL PROBLEMA
IPOTESI AGGIUNTIVE
La scheda della centralina dovrà avere un microcontrollore come dispositivo programmabile per la gestione verifica sensori, misura intensità luce, valutazione velocità e memorizzazione dati e inoltre un UART (Universal Asynchronous Receiver Trasmitter) per comunicare con il modem. L’UART prenderà i dati in forma parallela e li invierà al modem in forma seriale nello standard RS232. Non avendo particolare esigenza di velocità, sull’invio dei dati, le centraline saranno collegate alla centrale con un collegamento dedicato del tipo punto-punto mediante doppino telefonico e modem con velocità di trasmissione anche basse (4800-14400 Bps).In centrale i dati ricevuti dal modem verranno letti mediante RS232 da un PC che con adeguato programma archivierà le informazioni in file diversificati secondo il codice della centralina che ha inviato i dati. Si suppone:
- che la macchina fotografica entri in funzione alla chiusura di un contatto elettrico mediante ad esempio un transistore in saturazione per qualche frazione di secondo,
- che il sensore per la misura dell’intensità luminosa sia una fotoresistenza,
- che la sorgente degli infrarossi sia emessa da un diodo led,
- che il rivelatore agli infrarossi sia un foto diodo,
- che il dispositivo programmabile sia un microcontrollore ST6265.
SCHEMA D’INSIEME A BLOCCHI
EMETTITORE ALL’INFRAROSSO TX1-2
È composto essenzialmente da un diodo led emettitore di luce all’infrarosso (o più diodi in parallelo per aumentare l’intensità). Il fascio dovrà essere concentrato il più possibile mediante un sistema di lenti per coprire la distanza necessaria e per avere una più precisa distanza fra i due fasci e di conseguenza una misura corretta della velocità.
Per certe applicazioni il diodo viene alimentato con un segnale ad onda quadra di B.F. per poterlo riconoscere in ricezione e non avere false ricezioni dovute a segnali infrarossi non desiderati.
Nel nostro caso essendo, già un sistema con un puntamento a fasco stretto, conviene usare un fascio continuo per non commettere errori nella valutazione del tempo di interruzione.
Infatti se un’auto taglia il fascio nel momento che il led non emette, perché si trova nel semiperiodo dell’onda quadra con livello di tensione a zero volt, si commette un errore nella valutazione del tempo pari a ½ del periodo dell’onda quadra e di conseguenza errore di valutazione della velocità.
Per ovviare ai possibili segnali indesiderati si sceglierà il fototransistore sensibile alla stessa lunghezza d’onda dell’emettitore infatti ci sono in commercio emettitori e ricevitori accoppiati come ad esempio l’emettitore OP165 e il ricevitore OP505.
Il diodo emettitore con una corrente di 20 mA fa una caduta ai suoi capi di 1,6 V pertanto, alimentandolo ad una tensione di 12 V si dovrà mettere in serie una resistenza di :
R = (12 - 1,6) : 20 = 520 W Valore commerciale 560 W.
SENSORE DI RICEZIONE ALL’INFRAROSSO
Il fototransistore (OP505), colpito dal fascio all’infrarosso, condurrà in modo da portare il pin invertente a potenziale più alto di quello non invertente mandando pertanto l’uscita pin 6 a livello - Vcc così da avere il transistore interdetto. L’operazionale è in configurazione a trigger di Shmitt per avere commutazioni adeguatamente rapide e sicure al momento dell’interruzione del fascio. All’interruzione del fascio il fototransistore si interdice portando il pin invertente a -Vcc sicuramente meno positivo del pin non invertente e pertanto l’uscita andrà alta saturando il transistore che porterà basso l’OUT.
SENSORE DI LUMINOSITÀ
La fotoresistenza con luce sufficiente fornirà una corrente superiore a 15 m A, misureremo la caduta di tensione ai capi di una resistenza e adattatandola con un amplificatore operazionale ne verrà valutato il valore in Volt.
Tale valore verrà letto mediante un ingresso ADC del microcontrollore e il software confronterà tale valore con quello minimo previsto abilitando oppure no lo scatto della foto.
Con luce sufficiente la fotoresistenza lascia scorrere una corrente di almeno 15m A e di conseguenza sulla resistenza da 100K cadranno 1,5 V che entrano sull’ingresso non invertente dell’amplificatore operazionale.
Alla sua uscita avremo Vout= Vin x A dove A = 1+ R1/R2 = 2 pertanto
Vut = 1,5 x 2 = 3V.
Il convertitore ADC del micro ST6265 restituirà un valore numerico pari a
N= 3 x 255/5 infatti essendo un convertitore a 8 bit il valore massimo per 5V di ingresso sarebbe 255 pertanto la proporzione sarebbe 5 : 255 = 3 : N da cui N= 3 x 255 : 5= 153.
Il software del micro per capire se la luminosità sarà sufficiente o no dovrà verificare che il valore di N non sia inferiore a 153 prima di abilitare lo scatto della macchina fotografica
MICROCONTROLLORE
Il controllore usato ST6265 ha un totale di 20 pin I/O programmabili da software e al suo interno 128 Byte di memoria EEPROM dove poter salvare i dati.
Si opta per una memoria di tipo EEPROM perché i dati vengono mantenuti integri anche se il sistema dovesse rimanere senza alimentazione.
Ogni foto verrà salvata in due byte, uno per il numero progressivo delle foto e l’altro byte per immagazzinare il valore della velocità (un byte è più che sufficiente visto che può contenere un numero fino al valore 255).
Una porta di otto pin sarà configurata come output per l’uscita dei dati in forma parallela da inviare all’UART che a sua volta invierà in forma seriale al modem.
Quattro pin saranno d’ingresso, due per i sensori dell’interruzione dei fasci infrarossi, uno per sensore della luminosità e uno per il reset del sistema dopo il blocco per fine foto da scattare.
Vi saranno pure due altre pin d’uscita, uno per attivare la macchina fotografica e uno per segnalare dell’UART il dato pronto da inviare.
Nel blocco START si dovrà "inizializzare" il micro specificando quali sono i pin INPUT e quali OUTPUT.
Si dovrà verificare se il fascio del SENSORE 2 è ancora interrotto e se sì (livello 0) non proseguire ma attendere che torni alto (fine transito auto).
Se il SENSORE 1 non viene tagliato, cioè livello alto, non proseguire ma attendere il transito di un auto.
Se il fascio del SEN 1 viene tagliato inizia la valutazione del tempo che impiega a tagliare il secondo fascio del
SENS 2. Infatti se il fascio 2 non è interrotto continua a valutare il tempo impiegato.
Se SEN 2 va basso valuterà il valore del tempo trascorso per percorrere i 20 cm.
Sapendo che la velocità è data dallo spazio diviso il tempo avremo :
V= S/t da cui t= S/V troviamo il tempo t per una velocità di 50K/h
50 K/h sono (50 x 1000 ) m : 3600sec = 13,888889 m/s pertanto il tempo necessario per percorrere 20 cm sarà :
t = 0,2 : 13,888889 = 0,0144 S = 14,4 mS
Se il tempo misurato non è minore di 14,4 milli secondi allora significa che la velocità è uguale o minore a 50k/h pertanto torna all’inizio e aspetta fine transito auto. Altrimenti se il tempo è minore di 14,4 mS significa che la velocità é superiore a 50K/h pertanto va valutata la luminosità convertendo il valore di tensione dato dal sensore di luce in numero mediante ADC e se il valore numerico è inferiore a 153 non può essere scattata la foto e pertanto torna all’inizio.Se super il valore 153 la luce è sufficiente e attiva lo scatto della macchina fotografica.Il sistema ora deve calcolare la effettiva velocità del mezzo in transito e salvare i dati. Verifica se ci sono ancora foto da poter scattare, se si torna all’inizio programma altrimenti invia dati alla centrale e aspetta che avvenga un intervento manuale di ricarica foto e di reset del sistema.
VALUTAZIONE TEMPO :
Essendo il tempo da valutare di soli 14,4 mS sarà necessario usare una routine il più corta e veloce possibile. Dall’istante dell’interruzione del primo fascio intendo continuare ad incrementare un registro (con riporto) del micro sino all’interruzione del secondo fascio così da uscire dal loop con un valore nel registro direttamente proporzionale al tempo intercorso nell’interruzione dei due fasci, cioè il tempo che impiega il mezzo in movimento a percorrere i 20 Cm.La routine che intendo usare è la seguente :
ldi x,0 ;prepara azzerato il registro x
ldi y,0
aspetta jrs 0,port_b,aspetta ;rimani ad aspettare se non va a 0 il primo sensore
conta inc x ;aggiungi 1 al registro x
jrnc ok ;se non c’è riporto vadoa ok
inc y ;altrimenti incremento y
ok jrs 1,port_b,conta ;se il secondo fascio non è ancora
;interrotto continua a contare
Con un quarzo di 8Mhz il micro esegue un ciclo macchina in un tempo di 1,625 micro secondi.
Per eseguire l’istruzione inc x ci vogliono 2 cicli, 4 per jrnc e 5 per l’istruzione jrs pertanto ogni incremento avviene in un tempo pari a 12 x 1,625 = 19,5 micro secondi.
Per il tempo di 14,4 mS il numero espresso nei due registri x e y avrà un valore pari a : 14400 : 19,5 = 738
VALUTAZIONE VELOCITÁ :
Essendo N(xy) direttamente proporzionale al tempo t si avrà :
N(xy) = k t dove k = N(xy) / t proviamo a 50K/h k= 738 / 14,4 = 51,25
dovrà valere per tutti gli altri casi, proviamo a 100 K/h k= 369 / 7,2 = 51,25
Per convertire il numero valutato, nella velocità effettiva, si dovrà scrivere :
V (K/h) = 36900 : N(xy) infatti 36900 : 307 = 120 K/h come risulta dalla tabella
Così vale per gli altri casi, esempio : 36900 : 738 = 50 K/h 36900 : 369 = 100 K/h
Questo calcolo conviene eseguirlo in centrale dove si dispone di un PC con un software in linguaggio sicuramente più idoneo per calcoli matematici.
Si potrebbe anche con il micro ST6265 ma appesantirebbe il software dovendo implementare in assembler una divisione a 16 bit (operando e dividendo a due byte).
Se proprio si volesse risolvere il problema con il micro si potrebbe semplificare l’operazione dividendo per quattro sia il dividendo che il divisore così da implementare una divisione finale fra un operando a 2 byte e un dividendo a 1 byte.
36900 : 4 = 9225 che espresso in due byte diventa 36 nel byte MSB e 45 nel byte LSB. Pertanto V(K/h) = 9225 / N(xy)
CALCOLO VELOCITÁ IN ASSEMBLER
n1 .def 084h ;n1 = byte MSB
n2 .def 085h ;n2 = byte LSB dividendo
n3 .def 086h ;n3 = byte del divisore
risul .def 087h ;risul = risultato
resto .def 088h ;resto = avanzo della divisione
byte_H .EQU 36 ;byte MSB del numero fisso 9225
byte_L .EQU 45 ;byte LSB del numero fisso 9225
Il valore di N(xy)sarà espresso dal byte MSB = y e dal
byte LSB = x che dovrò dividere per 4 invocando la routine
divide nel seguente modo :
calcola ld a,y ;carico y in a
ld n1,a ;metto MSB di N(xy) in n1 (n1 e n2 = dividendo)
ld a,x ;carico x in a
ld n2,a ;metto LSB di N(xy) in n2
ldi n3,4 ;metto nel divisore il valore 4
call divide ;eseguo la divisione, il risultato è in risul
ld a,byte_H ;MSB del numero fisso 9225 in a
ld n1,a ;e lo metto in n1
ld a,byte_L ;LSB del numero fisso 9225 in a
ld n2,a ;e lo metto in n2
ld a,risul ;prendo il N(xy) diviso per 4
ld n3,a ;e lo metto in n3=dividendo
call divide ;eseguo la divisione e torno con V(k/h) sia in a che in risul
ret
divide ldi wdog,254 ;carico wdog
clr risult ;azzeramento risultato
ld a,n1 ;carico nel reg a il byte MSB
jrnz div ;se non e` zero salto
ld a,n2 altrimenti prendo byte LSB
jp ancora ;e vado a dividere
div ld a,n2 ;prendo il byte LSB
suba ldi wdog,254
inc risult ;suppongo già che n3 ci stia una volta in n2
sub a,n3 ;sottraggo una volta n2-n3
jrnc suba ;se a>= n2 continuo a sottrarre e inc risultato
dec n1 ;chiedo riporto al byte + significativo
jrnz suba ;e se n1 non e` zero continuo a sottrarre
ancora ldi wdog,254
inc risult ;incremento ancora il risultato
sub a,n3 ;sottraggo ancora
jrnc ancora ;e continuo fino a che n2>n3
dec risult ;ho finito ma devo sottrarre 1 al risultato
add a,n3 ;rimetto a come prima dell'ultima sub non valida
ld resto,a ;cosi da avere in a il resto
ret
Il microcontrollore ha al suo interno 128 byte di EEPROM e considerato
che servono due byte per ogni velocità superiore ai 50 K/h,
ne consegue che sarà possibile registrare e fotografare 64 infrazione.
LISTATO ASSEMBLER ST6265
ldi pdir_a,11111111b ;definisce la port_a come output - uscite a 0
ldi popt_a,11111111b
ldi port_a,00000000b
ldi pdir_b,00001100b ;definisce la port_b - pb0 e pb1 input
ldi popt_b,00001100b ;pb2 e pb3 output
ldi port_b,00000000b
ldi pdir_c,00000000b ;definisce la port_a come input
ldi popt_c,00000001b ;pc0 input ADC
ldi port_c,00000001b
main ldi wdog,255
jrr 1,port_b,main ;resta a main se il sensore 2 non vede il fascio
jrs 0,port_b,main ;non va oltre se il primo fascio non viene interrotto
ldi x,0 ;prepara azzerato il registro x
ldi y,0
conta inc x ;aggiungi 1 al registro x
jrnc ok ;se non c’è riporto vado a ok
inc y ;altrimenti incremento y
ok jrs 1,port_b,conta ;se il secondo fascio non è ancora interrotto continua a contare
ld a,y ;prende valore di y e lo mette nel reg. a
cpi a,2
jrc veloce ;se già y minore di 2 significa che è sicuramente maggiore di 50k/h
ld a,x ;e salta a veloce, altrimenti valuta il valore di x
cpi a,220 ;se minore di 220 sicuramente supera 50k/h
jrc veloce ;pertanto salta a veloce
torna jp main ;altrimenti la velocità non supera i 50k/h pertanto salta a main
veloce ldi wdog,255
ldi adcr,00110000b ;abilita convertitore ADC (pc0)
attesa jrr 6,adcr,attesa ;attende fine conversone (circa 70 mS)
ld a,addr ;prende valore convertito
cpi a,153 ;verifica
jrc torna ;se minore, cioè luce insufficiente, salta e torna a main
ld a,port_b ;legge in a lo stato della port_b
set 3,a ;mette il bit 3 a livello alto +5V per abilitare scatto foto
ld port_b,a ;scrive a in port_b con il bit 3 a + 5V
ldi w,75 ;ritardo saturazione transistore
ldiv ldi v,255 ;circa 310 mS
decv ldi wdog,255 ;100 x 255 x 16,25mS = 310 mS
dec v
jrnz decv ;se non è zero continua a decrementare
dec w ;decrementa w
jrnz ldiv ;se non è zero ricarica v e ricomincia dec
ld a,port_b ;resetta il bit 3 interdicendo il transistore
res 3,a
ld port_b,a
;Se intendo calcolare la velocità già qui allora salterò le seguenti 4 istruzioni
ld a,y ;prende il byte MSB del valore tempo
call save ;va a salvare in EEPROM
ld a,x ;prende il byte LSB del valore tempo
call save ;va a salvare in EEPROM
;Le due istruzioni call che seguono sono in alternativa alle precedenti 4 istruz.
call calcola ;va a calcolare la velocità
call save ;salva il byte che esprime la velocità
dec foto ;conta nr foto scattate
jrnz altro ;se non sono ancora finite salta e va a min per altro controllo
call invio ;altrimenti invia dati alla centrale
fine ldi wdog,255 ;resta qui fino a reset manuale
jp fine
altro jp main ;torna a main
save ldi wdog,255
ldi a,foto
cpi a,65 ;se minore di 65 scrive nel banco 1
jrc write
ldi drbr,2 ;altrimenti banco 2
subi a,64 ;le celle del banco vanno dalla 0 alla 64
ld x,a ;prepara x a puntare alla cella col numero della foto
jp lda
write ldi drbr,1 ;primo banco
ld x,foto ;prepara x a puntare alla cella col numero della foto
lda ld a,risul ;riprende il valore della velocità
asp_ jrs 1,eecr,asp_
ldi eecr,1 ;abilita scrittura
ld (x),a ;scrive in (x) valore di a
ldi wdog,255
write_ jrs 1,eecr,write_ ;rimane qui fino a fine scrittura
ldi eecr,0 ;disabilita scittura
ret
code .EQU 1 ;code conterrà il numero progressivo della stazione
invio ld a,code ;carica codice come identificatore della stazione
call uscita ;lo invia alla centrale
ldi y,2 ;per contare numero banchi da leggere
banc2 ldi dbr,2 ;predispone lettura banco 2
jp ldix
banc1 ldi dbr,1 ;predispone lettura banco 1 (arriva dopo aver letto banco1)
ldix ldi x,64 ;x punta alla cella 64
asp jrs 1,eecr,asp ;aspetta pronta lettura
ldi wdog,255
ld a,(x) ;legge la cella puntata da x
call uacita ;invia dato all’UART
dec x ;conta numero celle lette e inviate
jrz jpbanc ;se finito primo banco passa al secondo
jp asp ;altrimenti legge altra cella e invia
jpbanc dec y ;verifica se letti entrambi i banchi
jrz finetx ;se sì ha finito
jp banc1 ;altrimenti va a predisporre per leggere banco 1
finetx ret
uscita ld port_a,a ;mette a sulla porta_a verso l’UART
ld a,port_b
set 2,a ;genera un impulso sul pb2 per segnalare dato pronto
ld port_b,a ;lo mette in out su pb2
nop ;piccolo ritardo per durata impulso
res 2,a ;rimette a livello basso pb2
ld port_b,a
ret