Raspberry Pi 25) Maticová klávesnice Nedávno se mě ptal jeden začínající "raspíčkář", jak má
připojit maticovou klávesnici jako je třeba tahle: Já jsem stejnou klávesnici použil ve své krabičce pro Raspi. Protože se mi to zdá jako zajímavé téma, vytvořil jsem tento článek ve kterém se pokusím popsat principy snímání takovéto maticové klávesnice. Možná se bude hodit i někomu dalšímu.
V několika minulých článcích jsem popisoval, jak se dá Raspíčkem číst obyčejné tlačítko. (Buď se připojí na GPIO vstup, a nebo k expandéru). V případě, že je tlačítek více, je však výhodnější použít takzvané maticové zapojení. Při tomto způsobu zapojení tlačítek dochází k úspoře potřebných GPIO portů. Pro porovnání: 16 tlačítek zapojených "běžným" způsobem spotřebuje 16 vstupních pinů. Naproti tomu maticové uspořádání 4x4 tlačítka spotřebuje pouze 8 pinů (4 vstupní a 4 výstupní). To je úspora 8 pinů. Při větším počtu tlačítek se tato úspora dále zvětšuje: Při 64 tlačítkách uspořádaných do matice 8x8 se ušetří 48 pinů. Maticové zapojení má ale i své nevýhody: 1) Nelze stisknout větší množství tlačítek zároveň (bez problémů jdou stisknout 2 tlačítka najednou, ale při třech už může v určitých kombinacích docházet k problémům. Níže se tomuto problému budu věnovat detailněji.) 2) Vyhodnocení stisknutých kláves trvá o něco delší dobu.
Pro následující příklady jsem vytvořil maticovou klávesnici 4x3 tlačítka. Její fotka je v úvodu článku a schéma vypadá takto: Vlevo je skutečné schéma, vpravo zjednodušené zobrazení, které budu používat níže.
Připojení k raspíčku je sice možné přímo na GPIO konektor, ale v tom případě vás to bude stát 7 GPIO portů. Já jsem proto volil připojení přes expander MCP23017. Připojení expanderu k RasPi jsem vysvětlil tady, proto už se k tomu tady vracet nebudu. Nakreslím pouze připojení klávesnice k GPB portu tohoto expanderu:
Princip funkce:
Princip spočívá v tom, že se nečte stav celé klávesnice najednou,
ale po řádkách. V našem případě tedy ve třech krocích (3 řádky). Stisknutá tlačítka v takto vybrané řádce přenesou tuto logickou
"0" na některé ze čtyř vstupních pinů (GPB4, GPB5, GPB6, GPB7). Zde jsem připravil několik animací, které by měly princip fungování názorně ukázat. Příklad 1: Bez stisku kláves První příklad ukazuje stav, kdy není stisknuto žádné tlačítko. V prvním kroku vybere počítač horní řádku (nastaví na ní "0"). Protože v ní ale není stisknuto žádné tlačítko, tak se ta "0" nedostane na žádný vstupní pin expanderu. Pokud jsou vstupní piny "ve vzduchu" (tlačítka jsou rozpojená) jsou uměle udržovány pomocí Pull-Up rezistorů ve stavu logické "1". Stejná situace nastává i v druhém a třetím kroku.
Počítač tedy v tomto prvním příkladě získá při čtení klávesnice takovéto údaje:
Příklad 2: Jedna klávesa Ve druhém příkladě byla stisknuta klávesa "S". První krok je stejný, jako v předchozím příkladě - v první řádce není stisknutá klávesa, proto je na všech vstupech uměle udržovaná "1". Ve druhém kroku se ovšem "0", která byla vyslána na drátě "b1" (GPB1), přenese přes stisknutou klávesu "S" do sloupce "b5" (GPB5). Třetí krok je stejný jako první - není stisknuta klávesa, takže se nula nepřenese na vstupní piny.
Počítač ve druhém příkladě získá takovéto údaje:
Příklad 3: Dvě klávesy Třetí příklad ukazuje, že je možné bez problému vyhodnotit i 2 klávesy, které jsou
stisknuté současně. V prvním kroku se logická "0" z horního řádku přes sepnutou klávesu "R" přenese na sloupec "b7". Ve druhém kroku se "0" z prostředního řádku přenese přes sepnutou klávesu "S" na sloupec "b5". V posledním kroku se "0" nikam nepřenese, protože ve spodní řádce není stisknutá žádná klávesa.
V tomto třetím příkladě získá počítač následující údaje:
Příklad 4: Více stisknutých kláves v jednom sloupci Na čtvrtém příkladě se pokusím vysvětlit význam ochranných diod. Tyto diody zabraňují zkratu, ke kterému by došlo v případě, že by bylo stisknuto několik kláves v jednom sloupci. Pro příklad jsem si vymyslel stisknuté klávesy "E", "D" a "C" V prvním kroku se "0" z horní řádky přenese přes stisknuté
tlačítko "E" do sloupce "b6". Jenže ve sloupci
"b6" je stisknuto zároveň tlačítko "D", které tu nulu přenese na prostřední řádku. Pokud by na prostřední řádce
nebyla dioda, došlo by k tomu, že se expander bude snažit nastavit na výstupním
pinu "b1" logickou "1" (+5V), ale zároveň by bylo toto napětí
zkratováno na "0", která přichází z klávesnice. Díky diodě, která je pro tento případ
orientována v závěrném směru, však ke zkratu nedojde. Ve druhém a třetím kroku se situace opakuje. Vzhledem k tomu, že jsou stisknuta všechna tlačítka ve sloupci "b6" dochází k přenášení nuly na zbylé dvě řádky. Diody na těchto řádkách pak brání zkratu.
Získané údaje:
Příklad 5: Chybná vyhodnocení při stisku více tlačítek V posledním příkladu ukážu hlavní nevýhodu maticového uspořádání
klávesnice. Pokud je stisknuto více tlačítek zároveň, může v některých
případech dojít k chybě při vyhodnocení. K tomuto chybnému vyhodnocení dochází tehdy, když některá ze stisknutých tlačítek tvoří pravoúhlý trojúhelník, jehož odvěsny kopírují směr řádek a sloupců. V tom případě počítač vyhodnotí, že je stisknuto ještě další tlačítko, které jakoby doplňuje pravoúhlý trojúhelník na obdélník, nebo čtverec. Tady je několik příkladů:
A tady je rozkreslený příklad chybného vyhodnocení pro současně stisknuté klávesy "R", "S" a "F". V prvním kroku se logická "0" přenese z horní řádky přes
stisknutou klávesu "R" do sloupce "b7". Druhý krok už je vyhodnocen správně. "0" z prostřední řádky
se pomocí sepnutých kláves "S" a "F" přenese na piny
"b5" a "b7". Ve třetím kroku se nastaví na "0" spodní řádka, ale protože na ní není stisknutá žádná klávesa, zůstávají vstupy kvůli Pull-Up odporům ve stavu "1".
Takto vyhodnotí získané údaje počítač:
Klávesu "W" tedy počítač vyhodnotí jako stisknutou, i když ve skutečnosti stisknutá není. Software Zde je program v Pythonu, který čte a vyhodnocuje stav kláves na maticové klávesnici se 4x3 tlačítky, připojené k expanderu:
|
úvodní strana webu AstroMiK.org |
|
poslední úprava stránky 7.11.2012 |