È possibile utilizzare le chip card telefoniche (anche utilizzate) come chiave elettronica per il controllo accessi.
Controllo accessi con card telefonica
Il circuito non scrive alcun dato sulla carta, bensì legge i primi 16 byte della memoria della carta, li confronta con quelli memorizzati in un database interno, quindi, se la carta è presente nel database attiva un relè. Per aggiungere una carta al database basta inserirla nello slot e premere il tasto SW2, mentre per rimuovere una card memorizzata è sufficiente inserirla e premere SW3. La EEPROM interna del micro è di 128 byte per cui è possibile registrare fino ad 8 card diverse. Premendo SW3 per almeno due secondi senza alcuna carta inserita, verrà cancellata l’intera memoria EEPROM del micro. La figura 1 riporta lo schema elettrico del circuito, mentre il listato seguente contiene il codice assembler per AVR studio 4.
;***** Definizione dei pin .equ reg_crd =0 ;Pulsante di registrazione card PB0 (SW2) .equ unreg_crd =1 ;Pulsante di rimozione card PB1 (SW3) .equ relay =2 ;uscita rele .equ crd_sw =3 ;Switch di lettura card PB3 .equ Data =4 ;Input-Output pin PB4 .equ CLK =5 ;Clock pin PB5 .equ RST =6 ;Reset pin PB6 .equ green_led =0 ; LED verde PD0 .equ red_led =1 ; LED rosso PD1 ;***** varibili .def temp =R16 .def byte_length =R17 .def group_length =R18 .def EEadr =R19 ;indirizzo EEPROM da leggere .def Byte =R20 ; card data .def delay2seconds =R20 .def temp2 =R21 .def leds_flash =R22 .include "2313def.inc" reset: ldi temp,RAMEND out SPL,temp ldi temp,0b11100100 out DDRB,temp ser temp out PortB,temp ldi temp,0xff out DDRD,temp clr temp out portD,temp ;-------------------------------------------------------------------------- ; Lettura card ;-------------------------------------------------------------------------- read_card: cbi portD,red_led cbi portD,green_led cbi portB,relay ;diseccitazione rele ldi delay2seconds,6 chk_sw3: sbic PINB,unreg_crd ;controllo pressione di SW3. rjmp nxt ;non premuto rcall delay rcall delay rcall delay rcall delay ;ritardo di 2 secondi, per vedere se SW3 viene premuto per + di 2 secondi dec delay2seconds brne chk_sw3 ;richiesta cancellazione EEPROM? ldi group_length,127 ;si clr EEadr ;cancellazione EEPROM ldi Byte,$0F ;scrittura del valore $0F ldi leds_flash,4 ;lampeggio di 4 volte del led rosso flash_led2: cbi portD,green_led ;spegnimento led rosso rcall delay rcall delay rcall delay rcall delay sbi portD,green_led ;accensione led rosso rcall delay rcall delay rcall delay rcall delay dec leds_flash brne flash_led2 rcall clr_group nxt: sbis PINB,crd_sw ;card inserita? rjmp read_card ;no rcall delay ;si sbi portB,RST ;reset della card rcall delay rcall delay rcall delay rcall delay cbi portB,RST rcall delay rcall delay rcall delay rcall delay ldi YL,96 ;primo indirizzo RAM clr eeadr ldi group_length,16 ;lettura dei primi 16 byte della card next_byte: clr Byte ldi byte_length,8 next_bit: ror Byte sbi PORTB,clk nop nop nop nop sbic PINB,data sbr Byte,0x80 nop nop nop nop cbi PORTB,clk nop nop nop nop dec byte_length brne next_bit st Y+,Byte ;memorizzazione del byte in RAM dec group_length brne next_byte ;controllo se ultimo byte ;-------------------------------------------------------------------------- ; comparazione del byte letto con quello memorizzato in EEPROM ;-------------------------------------------------------------------------- compare: ldi YL,96 clr EEadr ldi group_length,16 ldi temp,16 lnb: ld temp2,Y+ rcall EEread dec group_length breq arm_relay cp Byte,temp2 breq lnb ldi temp2,15 ldi group_length,16 add temp2,temp mov temp,temp2 ldi YL,96 mov EEadr,temp cpi temp,127 breq read_switches rjmp lnb ;-------------------------------------------------------------------------- ; corrispondenza trovata, eccitazione del rele ;-------------------------------------------------------------------------- arm_relay: sbi portD,green_led cbi portD,red_led sbi portB,relay rcall delay sbis PINB,unreg_crd rjmp unregister_card sbic PINB,crd_sw ;controllo se la card è ancora inserita rjmp arm_relay rjmp read_card ;-------------------------------------------------------------------------- ; corrispondenza non trovata. Controllo per la registrazione di una nuova card ;-------------------------------------------------------------------------- read_switches: cbi portD,green_led sbi portD,red_led sbic PINB,crd_sw rjmp read_next_sw ;richiesta la registrazione della card? rcall delay rjmp read_card read_next_sw: sbis PINB,reg_crd rjmp reg_card ;si rjmp read_switches ;no ;-------------------------------------------------------------------------- ; Registrazione di una card in EEPROM ;-------------------------------------------------------------------------- reg_card: sbis PINB,reg_crd rjmp reg_card ldi temp2,8 clr EEadr read_again_eeprom: ldi temp,16 rcall EEread dec EEadr cpi Byte,$0F breq store dec temp2 breq memory_full add EEadr,temp rjmp read_again_eeprom store: ldi group_length,16 ldi YL,96 nxt_byte: ld Byte,Y+ rcall EEwrite dec group_length brne nxt_byte rjmp reset ;-------------------------------------------------------------------------- ; Eliminazione di una card da EEPROM ;-------------------------------------------------------------------------- unregister_card: sbis PINB,unreg_crd ; rjmp unregister_card ldi group_length,16 subi EEadr,16 ldi Byte,$0F clr_group: rcall EEwrite dec group_length brne clr_group rjmp read_card ;-------------------------------------------------------------------------- ; Lettura di un byte da EEPROM ;-------------------------------------------------------------------------- EERead: sbic EECR,EEWE rjmp EERead out EEAR,EEadr sbi EECR,EERE in Byte,EEDR inc EEadr ret ;-------------------------------------------------------------------------- ; Scrittura di un byte da EEPROM ;-------------------------------------------------------------------------- EEWrite: sbic EECR,EEWE rjmp EEWrite out EEAR,EEadr out EEDR,Byte sbi EECR,EEMWE sbi EECR,EEWE inc eeadr ret ;-------------------------------------------------------------------------- ; EEPROM piena, lampeggio di 4 volte dei LED ;-------------------------------------------------------------------------- memory_full: ldi leds_flash,4 flash_leds: sbi portD,red_led cbi portD,green_led rcall delay rcall delay rcall delay rcall delay dec leds_flash cbi portD,red_led sbi portD,green_led rcall delay rcall delay rcall delay rcall delay dec leds_flash brne flash_leds ret ;-------------------------------------------------------------------------- ; Routine di ritardo ;-------------------------------------------------------------------------- delay: ldi temp2,255 delay_: ldi temp,255 delay1: dec temp brne delay1 dec temp2 brne delay_ ret ;-------------------------------------------------------------------------- ; Contenuto della EEPROM interna (128 bytes) ;-------------------------------------------------------------------------- .eseg .db $0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F .db $0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F .db $0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F .db $0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F .db $0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F .db $0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F .db $0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F .db $0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F

Con questo articolo si apre una infinita’ di applicazioni: migliorare la sicurezza nel riconoscimento, aggiungere moduli gsm…bell’articolo! Nulla vieta di usare il pic e tradurre in c il codice.
Bellissimo articolo,
ma è prevista una versione dell’articolo in C per PIC?
Grazie
Salve Enzo,
non non sono previste altre versioni del firmware. Ma essendo abbastanza semplice non sarà difficile portarlo in asm per il PIC 😉
Articolo molto interessante. Sto cercando di interfacciare un lettore Smart card (carta nazionale servizi) con Arduino, tuttavia non riesco a trovare una libreria adatta.