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 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.

DIAGRAMMA DI FLUSSO DEL SISTEMA

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

K/h

t(mS)

Y

X

N(xy)

50

14,4

2

228

738

51

14,11765

2

213

723

52

13,84615

2

200

710

53

13,58491

2

186

696

54

13,33333

2

173

683

55

13,09091

2

161

671

         

100

7,2

1

114

369

105

6,857143

1

96

351

110

6,545455

1

80

335

115

6,26087

1

66

321

120

6

1

52

307

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

(c) by Vittorio Crapella       [ Return ]      [Le mie pagine]