Externí klávesnice k PDA
Z jednoho starého rozebraného notebooku mi zbyla klávesnice. Bez užitku se mi krčila doma ve skříni a tak když mi kamarád používající PDA řekl o možnosti připojit k němu externí klávesnici, rozhodla jsem se, že mu ji věnuji a udělám mu k ní potřebné rozhraní. Na internetu se vyskytuje několik programů na PDA pro obsluhu externí klávesnice spolu s návodem na stavbu rozhraní na bázi mcu 89C2051 mezi PC/AT klávesnici a sériový port PDA. Prozkoumáním zdrojového kódu pro mcu jsem zjistila, jaký je formát komunikace mezi PDA a klávesnicí. Šlo mi hlavně o mapování scan kódů kláves. Klávesnice z notebooku je maticová se 16 sloupci a 8 řádky. Při vymýšlení schéma obvodu pro obsluhu klávesnice jsem se nechala inspirovat původním zapojením v notebooku, ze kterého klávesnice pochází. Rozhodla jsem se použít mikrokontrolér AVR ATtiny2313 rozšířený o dvojici dekodérů 1 z 8 74HC138. Dekodéry slouží k výběru jednoho sloupce kláves, řádky vedou přímo do mikrokontroléru. Použitím dekodérů se ušetří 12 nožiček na mcu. Sw v mikrokontroléru cyklicky prohledává matici klávesnice a zjišťuje nově stisklé nebo puštěné klávesy. V závislosti na zjištěných změnách odesílá patřičné scan kódy kláves do PDA a také zajišťuje autorepeat déle stisknutých kláves. Komunikace s PDA je obousměrná a PDA má mimo jiné možnost zjistit přítomnost klávesnice a nastavovat parametry autorepeatu.
Schéma rozhraní je na Obr. 1. Kromě zmíněného mcu a dekodérů obsahuje zapojení ještě 16 diod vzájemně oddělujících jednotlivé sloupce a část pro konverzi úrovní rozhraní RS-232. Mcu je taktován z interního RC oscilátoru 4MHz. Napájení se může pohybovat v rozmezí 3 až 5V. Díky použití úsporného režimu mcu mezi jednotlivými cykly testování klávesnice, se odběr při napájení 3V pohybuje mezi 350uA (v klidu) a 500uA (při úporném psaní). LED pro indikaci stavu zámků klávesnice jsem z důvodu minimalizace spotřeby vynechala. Případní zájemci si je můžou doplnit, 3 nožičky na mcu na ně zbyly.
Na Obr. 2 je plošný spoj rozhraní. Deska je z důvodu rozměrů (minimální výšky) osazena výhradně SMD součástkami. Plošný spoj je pouze jednostranný, se 6 drátovými propojkami. Konektory pro připojení plochých "kablíků" z klávesnice jsou původní z notebooku. Napájení zajišťuje PDA a je připojeno 4 vodiči (RxD, TxD, GND, Vcc). Způsob připojení a mechanické úpravy klávesnice jsem nechala na kamarádovi.
Podklady ve formátu pro Eagle 4.1 jsou zde: | Schéma | |
Plošný spoj |
Na následujících fotografiích je zachycena konečná podoba rozhraní.
Detailní pohled na desku rozhraní |
Pohled na rozhraní připojené ke klávesnici |
Program pro mcu jsem jako obvykle napsala v assembleru a je v souboru
klavpda.avr
v sekci
Ke stažení.
Na začátku programu je provedena inicializace potřebných periferií (porty,
čítač 0, USART). Následuje uspání procesoru. Aktivování sleep módu je v nekonečné
smyčce. Pokud se tedy procesor probudí z důvodu obsluhy některé asynchronní
události, je po jejím obsloužení opět uspán. Funkci celého rozhraní zajišťují
tři obsluhy přerušení:
- Každých 10ms se vyvolává přerušení od časovače 0. Obsluha přerušení
T0Ovf
volá proceduruKeyPr
, která zajišťuje vlastní obsluhu klávesnice. - Pokud PDA pošle příkaz, vyvolá se přerušení od příjmu znaku. Obsluha
přerušení
UART_R
zjistí, o jaký příkaz se jedná a provede požadovanou operaci. - Třetí přerušení od prázdného vysílacího registru USARTu se stará o posílání
scankódů do PDA. Je použita kruhová fronta, do které obsluha klávesnice vkládá
prostřednictvím procedury
SSend
odesílané scankódy a obsluha přerušeníUART_E
je postupně odesílá po sérové lince.
Kromě obsluh přerušení obsahuje program dvě již zmíněné procedury:
- Procedura
SSend
vkládá znaky do kruhové fontySBuf
, přičemž ošetřuje možné stavy, jako je přetočení nebo přetečení fronty. - Procedura
KeyPr
zajišťuje vlastní obsluhu klávesnice. Postupně prohledává jednotlivé sloupce klávesnice a zjišťuje, zda se změnil stav od minulého volání procedury (předchozí stav je v poliKBStav
). Pokud je zjištěna nová stisknutá klávesa, je provedeno její překódování podle tabulkyScanTbl
a odeslání výsledného scankódu do PDA prostřednictvím procedurySSend
. Pokud je zjištěno puštění klávesy, je provedeno stejné překódování a odeslání jako při stisku, s tím rozdílem, že je nastaven nejvyšší bit scankódu jako příznak puštění klávesy. Procedura dále uchovává v proměnnéLastKey
scankód naposledy stisknuté klávesy. Pokud je tato klávesa držena stisknutá déle než je nastavená doba zpoždění autorepeatuKBDelay
a zároveň nedojde ke stisku jiné klávesy, je tato opakována s nastavenou rychlostí autorepeatuKBRate
. Parametry autorepeatu je možno měnit pomocí příkazů z PDA ve stejném rozsahu, jako je tomu u PC klávesnice. V převodní tabulce scankódůScanTbl
je kromě scankódů uložen i příznak, zda má daná klávesa autorepeat či nikoliv, řídicí klávesy (Shift, Alt, Ctrl...) totiž autorepeat nemají.
Případné dotazy k hw nebo sw části rozhraní ráda zodpovím E-mailem.