venerdì 30 aprile 2010

Tastiera a matrice con Pic 16F84 e Basic

Un giorno mi capitò di trovare un vecchio telefono dal quale ci tolsi subito la tastiera per la combinazione dei numeri; dissi fra me… quando avrò tempo ci farò una bella serratura codificata. Sono passati gli anni e finalmente mi sono deciso.
Il progetto gira intorno all’ormai intramontabile e mitico microcontrollore Pic 16F84 della Microchip. Ho usato il linguaggio basic per stendere il programma di gestione in modo da poter essere facilmente personalizzato in base alle esigenze dell’utente.

Questo è lo schema elettrico

Lista componenti

U1 microcontrollore PIC 16F84
C1-C5 condensatori 100 nF
C2-C3 condensatori 22 pF
C4 condensatore 330 nF
R1 resistenza 100 kOhm
R2…R7 resistenze 470 Ohm
R8 resistenza 6800 Ohm
D1-D2 Diodi LED Rosso-Verde
D3 Diodo 1N4007
X1 Quarzo 4 Mhz
Q1 Transistor BC 547
Relè 9V
LM1 Stabilizzatore LM 7805

Questo è il PCB

Questo è il sorgente Basic per il “Crownhill Proton plus basic compiler”
'**************************************************************
'* Chiave elettronica con tastiera a matrice 4x4 V.1.1
'* Connessioni: 1 2 3 A
'* Alimentazione del PIC 16f84 come da datasheet 4 5 6 B
'* Tastiera colonna 1 a RB4 7 8 9 C
'* colonna 2 a RB5 * 0 # D
'* colonna 3 a RB6
'* colonna A a RB7 inutile se la tastiera è 4x3
'* riga 1 a RB0 tramite un resistore da 470 ohm
'* riga 4 a RB1 tramite un resistore da 470 ohm
'* riga 7 a RB2 tramite un resistore da 470 ohm
'* riga * a RB3 tramite un resistore da 470 ohm
'* Diodo Led 0 a RA0
'* Diodo Led 1 a RA1
'* Linea di uscita +5V a RA2
declare KEYPAD_PORT PORTB 'Dichiara la porta "b" come ingresso per tastiera a matrice
Dim VAR1, KEY, OLD_KEY, a As Byte 'Dichiara le variabili
dim contatore, indirizzo, dati_chiave[4] as byte
Dim chiave1, chiave2, chiave3, chiave4 As Byte
symbol LED = PORTA 'Alias LED come PORTA
delayms 500 'Aspetta la stabilizzazione del micro 500 mS
TRISA = 000000 'Configura tutti i pin della porta "a" in uscita
LED = 0 'Tutta la porta "a" (LED = PORTA) è "spenta"
contatore = 0 'Azzera il contatore per la matrice dati_chiave
indirizzo = 0 'Azzera il contatore per le celle della eeprom
dati_chiave[0] = eread 0 'Legge la prima cella della eeprom interna
if dati_chiave[0] = 255 then 'Se non contiene chiave va alla routine di inserimento
LED 0.1 = 1 'Accende il led sulla porta.1
KEY = "" 'Assegna il valore "niente" alla variabile key
GoTo registra_chiave 'Va alla routine di inserimento della nuova chiave
End If
dati_chiave[1] = eread 1 'Legge le altre 3 celle della eeprom
dati_chiave[2] = eread 2
dati_chiave[3] = eread 3
main: 'Routine principale
GoSub scansiona_tasti 'Salto e ritorno alla routine
If KEY = OLD_KEY Then GoTo main 'Se ci si "addormenta" sul tasto premuto la procedura non scansiona
OLD_KEY = "" 'di nuovo lo stesso tasto ma aspetterà che sia rilasciato
If KEY = "" Then GoTo main 'Premuto niente... torna a main
OLD_KEY = KEY 'Assegna a OLD_KEY il tasto premuto per ricordarsi se è sempre premuto
LED = 1 'LED porta.0 acceso
delayms 100 'Ritardo di 0.1 secondi
LED = 0 'LED porta.0 spento
If KEY = "#" And contatore = 4 Then 'Nel caso la serratura è aperta (contatore=4) con questo
LED 0.1 = 1 'pulsante si va a registrare le nuove 4 chiavi
GoTo registra_chiave
End If
if dati_chiave[contatore] = KEY then 'Se il tasto premuto è uguale alla chiave della
contatore = contatore + 1 'cella corrente, aumenta il contatore
Else 'Tasto sbagliato... riazzera il contatore...
contatore = 0
LED 0.2 = 0 'e uscita sul pin1 (RA2) azzerata
End If
If contatore = 4 Then 'Trovate tutte e 4 le chiavi giuste! Serratura aperta!
LED 0# = 1 'LED porta.0 acceso
LED 0.2 = 1 'Uscita sul pin1 (RA2) positiva
End If
KEY = "" 'Da a KEY il valore "niente"
GoTo main 'Fine routine principale, torna a main
registra_chiave: 'Routine di inserimento nuove chiavi
GoSub scansiona_tasti 'Salto e ritorno alla routine
'Se ci si "addormenta" sul tasto premuto la procedura non scansiona
If KEY = OLD_KEY Then GoTo registra_chiave
OLD_KEY = "" 'di nuovo lo stesso tasto ma aspetterà che sia rilasciato
If KEY = "" Then GoTo registra_chiave 'Premuto niente... torna a registra_chiave
OLD_KEY = KEY 'Assegna a OLD_KEY il tasto premuto per ricordarsi se è sempre premuto
If KEY < 10 then
ewrite indirizzo, [KEY] 'Registra la chiave premuta nella casella eeprom dove punta
indirizzo
dati_chiave [indirizzo] = KEY
indirizzo = indirizzo + 1
LED 0# = 1 'LED porta.0 acceso
delayms 100 'Ritardo di 0.1 secondi. Oltre a tenere acceso il LED per 0.1
'secondi ha anche la funzione di un ritardo antirimbalzo
LED 0# = 0 'LED porta.0 spento
End If
KEY = "" 'Da a KEY il valore "niente"
If indirizzo = 4 Then 'Arrivato all'ultima chiave torna alla routine principale
indirizzo = 0 'Azzera tutti i contatori
contatore = 0
LED 0.1 = 0 'Spegne il Led
GoTo main
End If
GoTo registra_chiave 'Torna alla label
scansiona_tasti: 'Routine per stabilire il tasto premuto
VAR1 = inkey 'Scansiona la Keypad (tastiera a matrice)
delayms 50 'Attesa antirimbalzo di 50ms
If VAR1 = 16 Then KEY = "" 'Tasto rilasciato KEY=""
'Assegna a KEY i valori secondo la scansione fatta da "VAR1 = inkey"
KEY = lookup VAR1, [1,2,3,"A",4,5,6,"B",7,8,9,"C","*",0,"#","D"]
Return 'Ritorna alla chiamata
'***********************************************

Funzionamento del circuito

Il programma è composto dalla routine principale la quale si occupa di controllare i tasti premuti e ad ogni pressione si ha l’accensione del led verde.
A serratura aperta si accende il led rosso, ed oltre ad avere un livello logico altro (+5) sul pin 1 del PIC (RA2), si ha la possibilità di modificare la sequenza della combinazione premendo il tasto “RP” o “#” (dipende dalla serigrafia sulla vostra tastiera). Dopo la prima programmazione ed all’inserimento in circuito, il programma andrà a verificare se nella eeprom è presente la combinazione password. In caso negativo lo segnala con il led rosso e va nella routine di inserimento sequenza chiave.
A combinazione esatta, come già descritto sopra, si hanno 5 volt positivi sul pin 1 utili per pilotare tramite un’eventuale relè (con adeguato circuito pilota… la massima corrente erogabile sul pin è 20 mA!)
La pecularietà di questo piccolo progetto è la possibilità, tramite il sorgente basic, di personalizzare a vostro piacimento la serratura. Ad esempio… ho messo solo 4 tasti per la combinazione, potreste metterne 8.
Per collegare l’uscita del PIC con un relè, si procede portandolo un transistor in saturazione. Per l’esempio prendiamo un relè con una tensione di attivazione di 8.5 V, una corrente di assorbimento di 50 mA ed un transistor npn BC547. Quello che si deve trovare è la resistenza di base Rb per pilotare tramite l’uscita del pin del PIC, la base del transistor.
Le grandezze che ci servono sono: Tensione di Base Vb (in pratica i 5 volt in uscita dal pin del PIC); Tensione di saturazione Base Emettitore Vbe sat (0.7 V); Corrente di saturazione di Collettore Ic sat (spesso viene posta ad 1/10 della corrente di collettore massima. In questo caso è noto il carico (Rc = Relè) per cui le diamo i 50 mA che passano attraverso il relè); Coefficiente di amplificazione di corrente minima hfe min del transistor (I transistor della stessa specie e sigla, hanno delle tolleranze e non tutti hanno il medesimo coefficiente; meglio tener conto del valore minimo). La formula da applicare è questa:
Rb < (Vp-Vbe sat)/Ics at * hfe min. Quindi, resistenza di base più piccola di: (V5 - V0.7) / A0.05 * 120 = 4.3 / 0.05 * 120 = 10320 OhmE’ bene ridimensionare la resistenza ben al di sotto di 10320 ohm. Questa scelta è dettata dal fatto che le varie tolleranze (Un diverso transistor usato, tensione sul pin del PIC scarsa), potrebbero interferire sul funzionamento del circuito. Una resistenza da 6800 ohm dovrebbe essere idonea a far commutare il transistor ed a far circolare la necessaria corrente nel relè. In parallelo alla bobina del relè si applica un diodo 1n4007 come protezione del transistor dai picchi. Una resistenza di 6k8 ohm limita la corrente in uscita dal pin del PIC a soli 0.6 mA, molto al di sotto della soglia sopportabile di 20 mA.

1 commento:

  1. ciao molto interessante.
    io ho un pic 16f876 e volevo chiederti se si poteva fare la stessa cosa.
    grazie emanuele.

    RispondiElimina