Siete
il visitatore n.
Pagina ottimizzata per risoluzione 1024x768 |
||
![]() |
![]() |
Il tastierino e la Development Board v. 1.1 con un PIC 16F877 per la lettura |
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).
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( ) // routine di 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):
La
pressione dei tasti
k11, k31, k32 produce invece la seguente lettura errata:
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. |
Elenco dei componenti Tutti
i resistori sono
da
1/4 W, 5% di tolleranza. R1, R2,
R3, R4 - 47 KOhm 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. |
![]() |
![]() |
Fig. 1 - Disposizione dei componenti e disegno delle piste inferiori (lato rame, rosso) |
Fig. 2 - Layout lato rame a 300 dpi |
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! |
|