Keypad 4x5 per microcontrollore
v. 1.1

Siete il visitatore n.

Click here for English version

Pagina ottimizzata per risoluzione 1024x768


     
 
 
Il tastierino e la Development Board v. 1.1 con un PIC 16F877 per la lettura
 

Torna alla Home Page

Recapiti

 

A cosa serve questo tastierino?

Il circuito qui presentato è un semplice tastierino 4 x 5 che può essere utilizzato in particolare con il microcontrollore PIC 16F877, per il quale è stato progettato con riferimento alle correnti di perdita dei suoi pin di I/O, al livello elettrico riconosciuto come stato logico in funzionamento con livelli TTL e in modo ST, ecc., quando il microcontrollore è alimentato a 5V. Data comunque la semplicità del circuito e il valore non critico delle resistenze, dovrebbe comunque andare bene anche per altri PIC e altri microcontrollori. Il tastierino può inoltre essere utilizzato anche in circuiti logici e analogici; in tal caso potrebbe essere necessario ritoccare i valori delle resistenze. Faremo riferimento in queta pagina all'utilizzo con il PIC 16F877. I tasti utilizzati sono quelli normalmente aperti a quattro terminali; nello stato di riposo (vedi disegno sottostante), i piedini su uno stesso lato del tasto (i più lontani fra loro) sono collegati; premendo il tasto i quattro piedini risultano tutti collegati.

Una caratteristica di questo circuito è la scalabilità: il circuito può infatti essere realizzato con un numero di righe da 1 a 4 e un numero di colonne da 1 a 5 (potete aggiungere in seguito nuovi tasti ed eventualmente nuove resistenze); potete così realizzare, ad esempio, un tastierino numerico a 12 tasti, un semplice tastierino a 4 tasti per le 4 direzioni, un tastierino per giocare a tris :-) ... in una parola, ciò che volete.

Il disegno seguente illustra il principio di funzionamento (classico).

componenti 300 dpi




Al circuito arriva il solo terminale di alimentazione positiva Vdd (connettore JP1); ciascuna riga della matrice della tastiera è connessa a Vdd mediante un proprio pull-up (da R1 a R4), e, attraverso una resistenza di protezione (da R5 a R8), al piedino del microcontrollore destinato a rilevare lo stato di tale riga (connettore JP2). Le colonne sono invece pilotate dal PIC (connettore JP3), ancora attraverso resistenze di protezione da 220 Ohm (da R9 a R13).
   

Pilotaggio delle colonne e lettura dello stato delle righe

Con riferimento al funzionamento di questo tastierino come interfaccia verso un microcontrollore (non necessariamente il 16F877), la strategia per la rilevazione dello stato dei tasti è legata alla classica organizzazione a matrice delle connessioni. Come anticipato, ciascun tasto possiede quattro terminali connessi fra loro a due a due; nella vista dall'alto, quello superiore di sinistra è collegato ad una riga, quello superiore di destra ad una colonna. Il piedino inferiore di sinistra non è utilizzato, il piedino inferiore di destra porta semplicemente il segnale di colonna al tasto della riga successiva. Consideriamo una determinata riga: quando non è premuto alcun tasto ad essa collegato, tutti i piedini di riga della stessa sono tenuti a potenziale alto dal pull-up di riga; quando si preme un tasto, il piedino di colonna diviene collegato con quello di riga; se tale colonna è in quel momento in alta impedenza, assume anch'essa il valore di riga; se, invece, essa è pilotata a massa dal microcontrollore, anche la riga assume lo stato del piedino di colonna (stato basso). Le porte del microcontrollore collegate alle righe devono essere sempre settate come ingressi, ovvero, in generale, devono essere in alta impedenza; le colonne devono essere tenute anch'esse, in generale, in alta impedenza; quando si vuole leggere lo stato dei tasti appartenenti a una colonna, si porta la colonna stessa a livello basso (una sola alla volta) e si attende qualche millisecondo sia per la stabilizzazione della tensione di riga sia, soprattutto, per evitare il fenomeno del rimbalzo del tasto stesso; a questo punto si legge lo stato della colonna stessa sui piedini collegati alle righe. Un tipico tempo di attesa per la stabilizzazione è di cinque-dieci millisecondi. Sapendo qual'è la colonna pilotata, leggendo lo stato delle righe si ricava la configurazione dei tasti su tale colonna. Si mette poi nuovamente in alta impedenza il piedino che pilota la colonna, si attende eventualmente qualche millisecondo e poi si può pilotare un'altra colonna. Naturalmente non è necessario far perdere tutto questo tempo al nostro microcontrollore: durante l'attesa per la stabilizzazione, e in generale fra letture di colonne diverse, il microcontrollore può eseguire (migliaia di) altre istruzioni. Una tipica strategia di lettura potrebbe essere quella che fa uso dell'interruzione di programma. Ad esempio, nei PIC si potrebbe configurare il timer in modo da generare una interruzione ogni alcune decine di millisecondi. Si può utilizzare una variabile che tenga conto della azione da eseguire (action), e di una che tenga conto del numero di colonna da leggere (coltoread). La prima volta che la routine di interruzione va in esecuzione, vede le variabili suddette a zero (esse devono naturalmente essere state azzerate): in tal caso l'azione da eseguire è di porre a massa la colonna 0 e di incrementare la variabile che determina l'azione da eseguire. Alla successiva interruzione, la routine vede a 1 tale variabile e va quindi a leggere lo stato delle righe relativo alla colonna 0, mette poi di nuovo la colonna in alta impedenza, incrementa il numero di colonna, pone a 0 la variabile che indica il tipo di azione da eseguire. Naturalmente, quando il numero di colonna appena letto è quello massimo, la variabile che ne tiene conto deve essere azzerata. In "pseudo" C++:

void main( )
{
const int NCOL=numero di colonne del tastierino;
int action=0;
int coltoread=0;
...
}

// routine di interruzione
{salvataggio stato;
if (action==0)
{poni a massa la colonna coltoread;
action=1;
}
else //(action=1)
{leggi lo stato delle righe;
action=0;
coltoread++;
if (coltoread==NCOL)
coltoread=0;
}
...
ripristina stato;
ritorna dall'interruzione;
}

Alcune note

Il livello logico associato ai tasti premuti risulta basso.

Quando nessuna colonna è pilotata (a livello logico basso), lo stato dei piedini che pilotano le colonne, essendo essi in alta impedenza e non collegati con pull-up o pull-down ad alcun riferimento, non è significativo: una loro lettura produce in genere un valore variabile nel tempo.

Quando più tasti sono premuti su una stessa colonna, la lettura avviene correttamente. Quando più tasti sono premuti su colonne diverse, e non vi sia nessuna riga in comune fra i tasti premuti, la lettura avviene correttamente.

Quando più tasti sono premuti su colonne diverse, e vi siano invece righe in comune fra i tasti premuti, la lettura delle colonne a cui appartengono i tasti che hanno in comune la stessa riga fornisce il medesimo risultato, e la lettura globale è dunque falsata.

Le uniche letture significative relative alla pressione di più tasti su ciascuna colonna sono dunque quelle relative alla pressione simultanea di più tasti che non abbiano righe in comune.

Esempio: se pensiamo i tasti identificati come gli elementi di una matrice 4 x 5, la pressione dei tasti k11, k22, k31, k44 produce correttamente le seguenti letture (* = tasto premuto, - = tasto non premuto):

  colonna 0 colonna 1 colonna 2 colonna 3 colonna 4
  * 0 - 1 - 1 - 1 - 1
  - 1 * 0 - 1 - 1 - 1
  * 0 - 1 - 1 - 1 - 1
  - 1 - 1 - 1 - 1 * 0

La pressione dei tasti k11, k31, k32 produce invece la seguente lettura errata:

  colonna 0 colonna 1 colonna 2 colonna 3 colonna 4
  * 0 - 0 - 1 - 1 - 1
  - 1 - 1 - 1 - 1 - 1
  * 0 * 0 - 1 - 1 - 1
  - 1 - 1 - 1 - 1 - 1

Riconoscimenti e avvertenze

Lo schema di principio della lettura di una tastiera organizzata a matrice è ovviamente assai noto in letteratura. L'ideazione del circuito stampato è totalmente personale; un riconoscimento va comunque al software che mi ha permesso di realizzare il layout del circuito elettrico. Si tratta del programma PCB Elegance v. 2.0, che io posseggo in versione FREEWARE limitata a 200 pin, realizzato dalla MERCO Electronics, la quale mi ha inoltre concesso l'autorizzazione al suo uso anche per scopi non personali.
I nomi Microchip e PIC sono marchi registrati.
Trattandosi di materiale messo gratuitamente a disposizione di chiunque lo desideri, ne è assolutamente vietata ogni forma di utilizzazione a fini commerciali.
Se in qualche modo si intende utilizzare questo circuito per scopi non puramente personali o divulgare il materiale contenuto in questa pagina, è fatto obbligo di richiedere un permesso scritto all'autore di questo articolo (anche via e-mail).
Il layout del circuito e tutte le informazioni contenute in questa pagina sono fornite così come sono, senza alcuna forma di garanzia. Non mi assumo naturalmente alcuna responsabilità per danni diretti o indiretti a persone o a cose derivanti dalle informazioni contenute in questo articolo.
Sono infine gradite segnalazioni di qualunque genere che possano consentirmi di migliorare il circuito stesso.


Elenco dei componenti

Tutti i resistori sono da 1/4 W, 5% di tolleranza.
I tre connettori hanno il passo di 2.54 mm.

R1, R2, R3, R4 - 47 KOhm
da R5 a R13 - 220 Ohm
da S1 a S20 - Pulsante instabile normalmente aperto da circuito stampato
JP1 - Connettore 2 poli (in realtà ne basta uno)
JP2 - Connettore SIL 4 poli
JP3 - Connettore SIL 6 poli (in realtà ne bastano 5)

Dove trovare i componenti?

I componenti sono abbastanza standard, dovreste essere in grado di trovarli in qualsiasi negozio di articoli elettronici. Per quanto riguarda il PIC (non necessario, naturalmente), potete ordinarlo (magari anche insieme alla basetta e a gran parte dei componenti) presso uno dei numerosi rivenditori on-line di materiale elettronico.


Realizzazione del circuito

Sono riportate, nelle seguenti immagini, le figure relative al layout del circuito e alla disposizione dei componenti.

Si tratta di immagini a 100 o 300 dpi. Per avere le stesse immagini, a 300 dpi, in una nuova finestra, da dove potrete stamparle o semplicemente vederle ingrandite, potete fare click direttamente su quelle visibili qui sotto o sui link sottostanti, oppure, se utilizzate un sistema Windows (TM) 95/98, utilizzare il tasto destro del mouse e scegliere "Apri collegamento in un'altra finestra". In alternativa potete salvare le immagini a 300 dpi, sul vostro hard disk o altra memoria di massa con l'opzione contestuale "Salva OGGETTO con nome" e stamparle in un secondo tempo con il browser o altri programmi. Con il browser si potrebbero avere problemi di dimensioni, mentre ad esempio Imaging (TM) di Windows (TM) dovrebbe stampare automaticamente con le dimensioni reali. Se avete dei dubbi sulle dimensioni della stampa ottenuta, e temete che non sia a grandezza reale, provate a misurare le distanze fra i fori per i connettori SIL, che deve risultare di 2.54 mm fra piedini contigui. Ovviamente, per non incorrere in grossolani errori di misura, nel caso della distanza fra pin contigui utilizzate ad esempio quella fra il primo e il sesto piedino, assicurandovi che sia di 2.54 mm * (6-1) = 12.70 mm. Non riuscirete naturalmente ad apprezzare i centesimi di millimetro, e forse neppure i decimi (non avrebbe neppure molto senso viste le dimensioni finite delle piazzole e dei loro fori), ma se la vostra misura è appena superiore ai 12.5 mm dovreste essere a posto. Per il controllo della scala verticale, provate a misurare la distanza fra i due fori di una resistenza; essa deve risultare di 400 mils, ovvero di 2.54 mm*4 = 10.16 mm. Se una delle due distanze non fosse quella attesa, detta x la relativa misura, dovreste applicare un fattore di zoom orizzontale pari a 12.70/x e un fattore di zoom verticale pari a 10.16/x.

In figura 1 si nota la disposizione dei componenti con la basetta vista dall'alto e in trasparenza. Si può notare come il layout della parte inferiore (lato saldature) vada disposto, in fase di esposizione, con il lato di stampa appoggiato al rame.

Alcune delle figure sottostanti sono in bassa risoluzione, per ovvi problemi di tempo di caricamento delle pagina, ma, come detto, i relativi link rimandano a immagini a risoluzione migliore, e in ogni caso ingrandite.

 

componenti 300 dpi layout bottom 300 dpi

Fig. 1 - Disposizione dei componenti e disegno delle piste inferiori (lato rame, rosso)

Qui il disegno stampabile a 300 dpi


Fig. 2 - Layout lato rame a 300 dpi


Qui il layout stampabile a 300 dpi

   

 

silkscreen 300 dpi  

Fig. 3 - Disposizione dei componenti sulla basetta


Qui il disegno stampabile a 300 dpi

 

 

schema elettrico
Fig. 4 - Schema elettrico del circuito a 100 dpi

Qui lo schema a 300 dpi ingrandito



Per finire, qualche dettaglio sulla realizzazione da me utilizzata. Il tastierino è nella configurazione completa a 20 tasti, con i piedini RB0-RB3 collegati alle righe e i piedini RC0-RC4 collegati alle colonne. Per quanto riguarda il cavo di collegamento fra tastierino e microcontrollore, utilizzo un cavo piatto da 10 fili; il passo è di 1.27 mm, ma l'ho adattato ai connettori da 2.54 mm. Un cavo molto lungo, e non schermato, potrebbe dare origine a letture disturbate; personalmente utilizzo un cavo di una cinquantina di centimetri, non schermato, e, in un ambiente "normale", ovvero senza particolare inquinamento e.m., l'oscilloscopio non mostra alcun problema nella forma d'onda sui piedini di ingresso del PIC per la lettura dello stato delle righe.


Sperando di esservi stato utile non mi resta che augurarvi buon lavoro!

 

Se volete contattarmi potete farlo al seguente indirizzo:

f_iacopetti@libero.it

 
Ultimo aggiornamento: 20 Mar 2003, 19.30 HyperCounterHyperCounter