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