Verze pro tisk

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.

Schéma rozhraní ke klávesnici
Obr.1: Schéma rozhraní ke klávesnici

DPS rozhraní ke klávesnici
Obr.2: Navržená deska plošného spoje rozhraní ke klávesnici

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í
Detailní pohled na desku rozhraní
Pohled na rozhraní připojené ke klávesnici
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í:

  1. Každých 10ms se vyvolává přerušení od časovače 0. Obsluha přerušení T0Ovf volá proceduru KeyPr, která zajišťuje vlastní obsluhu klávesnice.
  2. 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.
  3. 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:

  1. Procedura SSend vkládá znaky do kruhové fonty SBuf, přičemž ošetřuje možné stavy, jako je přetočení nebo přetečení fronty.
  2. 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 poli KBStav). Pokud je zjištěna nová stisknutá klávesa, je provedeno její překódování podle tabulky ScanTbl a odeslání výsledného scankódu do PDA prostřednictvím procedury SSend. 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í autorepeatu KBDelay a zároveň nedojde ke stisku jiné klávesy, je tato opakována s nastavenou rychlostí autorepeatu KBRate. 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.