Tastiera a matrice 4×4 USB HID con PIC18
In un articolo precedente vi ho esposto il mio sistema di gestione di un tastierino a matrice 4×4. Abbiamo visto come leggere i tasti e come riportarli su un display LCD.
Questa volta vedremo invece come realizzare qualcosa di più professionale: la nostra tastierina a matrice verrà utilizzata in abbinamento al PC sfruttando la connessione USB, ma non in modalità CDC, che sappiamo si tratta di una “semplice” emulazione della porta RS232, ma come periferica HID! Si, la nostra tastierina verrà riconosciuta dal PC come se fosse una tastiera “vera”!
L’applicazione in se per se potrebbe avere numerosi utilizzi: mettete il caso che in un’installazione pubblica c’è bisogno di mettere un PC che mostri agli utenti determinate informazioni o che comunque debba interagire in qualche modo con le persone. Ovviamente mettere una tastiera “reale” non è la scelta più adatta: è facile da rubare e da vandalizzare, e cosa più importante: c’è l’accesso a numerosi tasti che permetterebbero di prendere possesso del pc e fare qualche guaio. In questo modo, invece, potete mettere all’esterno una tastiera più robusta collegata a matrice (nel mio esempio uso un tastierino 4×4 ma è ovvio che per un’installazione pubblica ci vuole qualcosa di piu solido e con pulsanti magari più grandi) con l’evidente vantaggio di presentare solo i tasti necessari alla fruizione dei contenuti.
Per questo esempio utilizzerò la grandiosa scheda EasyUSB realizzata da Mauro Laurenti che ho già avuto modo di presentarvi in un articolo precedente. Sappiamo che questa scheda è 100% compatibile con la FSUSB della Microchip e quindi utilizzare le MAL è un gioco da ragazzi.
Prima di continuare, quindi, se non l’avete ancora fatto, vi consiglio di leggere l’articolo precedente in cui è illustrata la struttura della MAL, i possibili errori e un semplice programma di esempio per capire come utilizzarla. Penso non ci sia bisogno di dirvi che l’esempio è realizzato con MPLAB C18.
L’esempio della MAL che ho modificato per sfruttare la tastiera a matrice è quello che si trova nella cartella
USB Device - HID - Keyboard |
Il codice sorgente è scaricabile in fondo all’articolo, il file principale è quello denominato keyboard.c, vedrete che rispetto all’originale è molto più corto perchè ho eliminato tutte le parti relative alle altre schede di sviluppo che, anche se non danno alcun fastidio, secondo me rendono il codice meno semplice da leggere. Ricordo difatti che la MAL è più propriamente un framework: una volta scelto il file di progetto relativo alla scheda di sviluppo utilizzata, tutti i sorgenti vengono compilati esclusivamente per quella scheda e quindi per quel picmicro grazie ad una interminabile serie di macro che attivano o disattivano varie parti di codice.
Non mi dilungherò sulla spiegazione di come funziona una tastiera a matrice, di come la scansiono, di come memorizzo il pulsante premuto e tutto il resto: penso di averlo descritto in maniera più che esauriente: i collegamenti sono gli stessi, identici. E’ vero in quell’esempio utilizzavo la FreedomII, ma il connettore della EasyUSB è uguale, quindi non troverete differenze e anzi… qualcuno dei più bravi con poche modifiche può far funzionare questo esempio anche sulla FreedomII con su montato un PIC18F4550.
Ricordo solo questo: righe del tastierino a matrice su RB1,RB3,RB5,RB7 e colonne su RB0,RB2,RB4,RB6
Non mi dilungherò nemmeno sulla spiegazione del funzionamento dell’USB, io stesso me lo sto ancora studiando per benino e non posso che consigliarvi lo stesso libro che sto leggendo io (occhio che è in inglese, se siete in cerca di fidanzata non lo leggete in spiaggia!).
Spendo solo una parola su questo:
85 | unsigned char keys[]={89,92,95,85,90,93,96,98,91,94,97,88,4,5,6,7}; |
Questa è la riga 85 del mio keyboard.c, come vedete qui non sto riportando i codici ASCII delle lettere premute come invece facevo per l’esempio del tastierino su LCD. Una tastiera USB funziona in maniera differente, ci sono i cosiddetti KeyCodes che permettono di codificare anche funzioni speciali della tastiera che ovviamente non hanno un corrispondente ASCII (come i tasti funzione, il caps lock o altro). Per cui per poter recuperare i codici associati ad ogni lettera è necessario avere sottomano una tabella.
Tale tabella è distribuita ovviamente dal consorzio USB e si trova nel documento HID Usage Tables (HUT), precisamente a pagina 53. Vedete che le lettere maiuscole e minuscole hanno lo stesso codice: sono difatti lo stesso tasto (i keycodes codificano difatti il TASTO non il carattere/simbolo), sappiamo che per fare la maiuscola bisogna premere caps lock? Benissimo quindi sapete come fare. Nel mio esempio ho codificato i pulsanti del tastierino a matrice con i pulsanti aventi lo stesso simbolo sulla tastiera tranne il cancelletto che non su tutte le tastiere si trova allo stesso posto e che comunque richiede lo shift per poter essere rappresentato: dato che non mi andava di perder tempo quando premerete il cancelletto otterrete un ritorno a capo.
Per poter compilare il mio esempio dovete scompattare l’archivio e quindi copiare la cartella
__USB Device - HID - Keyboard - EasyUSB+Tastierino a matrice (www.settorezero.com) |
nella cartella principale della MAL (C:\Microchip Solutions vxxxx-xx-xx\)
L’esempio è realizzato per NON fare uso del bootloader per cui ho eliminato il linker che sfrutta il bootloader e ho disattivato la relativa macro in HardwareProfile – PICDEM FSUSB.h
Download codice sorgente
Ricordo per chi si collegasse solo ora a settorezero.com che questo download è GRATUITO: basta iscriversi gratuitamente cercando di non prendere in giro nessuno. Non c’è nemmeno bisogno di fare una raccolta punti per scaricarlo!
Tastiera a matrice 4x4 USB HID (699 download)