Lekce 7 - Arduino - Membránová klávesnice a její programování
V minulé lekci, Arduino - Pokročilá práce s tlačítky, jsme se naučili dále pracovat s tlačítkem a ukázali si, mimo jiné, jak ošetřit tzv. zákmity.
Vítejte v další lekci tutoriálu o hardwaru Arduina. Dnes si ukážeme zapojení a programování membránové klávesnice. Zkusíme si také vytvořit jednoduché projekty, ve kterých procvičíme naše získané znalosti.
Membránová klávesnice
Co je to klávesnice asi nejspíš víme, jedná se o vestavěná tlačítka, která jsou uspořádaná do řádků a sloupců. Někdy jsou tlačítka předem naprogramovaná a mají předem definované funkce a někdy zase klávesnice umožňují vlastní definici funkcí tlačítek. S takovou klávesnicí se setkáváme právě dnes. Začneme ale pěkně popořádku, jako první se zaměříme na správné zapojení klávesnice:

Příklad pro výpis stisknutých znaků
Dnes budeme opět pracovat v softwaru Tinkercad. Pokud však máte součástky společně s Arduinem i v reálné podobě, není problém podle tutoriálu zapojení společně s následujícími projekty také zrealizovat.
Zapojení membránové klávesnice
Co budeme potřebovat? Arduino a klávesnici s redukcí na osm pinů, nic jiného pro začátek potřeba nebude. Zapojení klávesnice je velice jednoduché, musíme zapojit všechny řádky a všechny sloupce, to je vše. K tomu používáme libovolné digitální piny v Arduinu. My jsme použili piny 2-9 na Arduinu Uno, ale výběr digitálních pinů je opět libovolný, jen je třeba nezapomenout je poté správně definovat v kódu:

Programování membránové klávesnice
Teď, když jsme klávesnici jednoduše zapojili, můžeme se přesunout na kód. V kódu pro nás bude pár novinek, se kterými jsme se ještě nesetkali, ale určitě to nebude nic těžkého.
Knihovna, konstanty a proměnné
Velká část práce nás tentokrát čeká v první části. Zde náš kód vypadá následovně:
#include <Keypad.h> // Knihovna pro používání klávesnice #define POCET_RADKU 4 // Konstanta definující počet řádků #define POCET_SLOUPCU 4 // Konstanta definující počet sloupců char znaky[POCET_RADKU][POCET_SLOUPCU] = // Vytvoření 2D pole pro používání klávesnice { {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; byte radky_piny[POCET_RADKU] = {9, 8, 7, 6}; // Vytvoření pole pro inicializaci pinů pro řádky byte sloupce_piny[POCET_SLOUPCU] = {5, 4, 3, 2}; // Vytvoření pole pro inicializaci pinů pro sloupce Keypad klavesnice = Keypad(makeKeymap(znaky), radky_piny, sloupce_piny, POCET_RADKU, POCET_SLOUPCU);
Jako první si musíme pomocí příkazu
#include <Keypad.h>
přidat do našeho kódu knihovnu
Keypad
, která podporuje práci s klávesnicí. Dále definujeme
dvě konstanty, pro počet řádků klávesnice a pro počet sloupců. Hned pod
tím si vytvoříme obyčejné 2D pole, které bude přesně vystihovat
rozmístění znaků na klávesnici.
Poté přichází na řadu přiřazení Arduino pinů podle řádků a
sloupců. Jedná se tedy o pole typu byte
s předem definovanou
hodnotou velikosti pomocí konstant. Do prvního pole uložíme piny použité
pro připojení řádků klávesnice a do druhého piny
pro sloupce.
Na konci tohoto bloku máme příkaz, se kterým jsme je ještě nesetkali,
protože je specifický pro klávesnici. Jedná se o
Keypad klavesnice = Keypad()
, do jehož argumentu poté přijdou
nějaké proměnné.
Tímto můžeme takzvaně zmapovat klávesnici, tedy zjistit, které znaky se na ní nacházejí, určit počet sloupců a řádků klávesnice a tak dále.
První příkaz, který jde do argumentu příkazu Keypad()
, je
makeKeymap
, jehož parametrem je 2D pole s vytvořenými znaky
klávesnice. Dále v argumentu inicializujeme piny řádků společně s piny
sloupců klávesnice. Jako poslední specifikujeme počet řádků a sloupců
klávesnice. Potom argument uzavřeme a jsme hotovi s inicializací.
Funkce setup()
a
void()
Ve funkcích setup()
a void()
nás již zřejmě
nic nepřekvapí:
void setup() { Serial.begin(9600); // Nastavení sériové komunikace } void loop() { char znak = klavesnice.getKey(); // Načítání znaku z klávesy if (znak)// Když bude zmáčknuta jakákoliv klávesa - vypíšeme daný znak { Serial.println(znak); // Vypsání zmáčknutého znaku } if (znak == 'D') // Když bude zmáčknuta klávesa D - provede se kus kódu { Serial.println("Zmackl si D!"); } }
Pomocí funkce setup()
inicializujeme sériový monitor. Ve
funkci loop()
si založíme proměnnou typu char
, do
které načteme uživatelský vstup z klávesnice. To zajistíme pomocí
příkazu getKey()
volaném na naší klávesnici. Následují dvě
podmínky. První bude pouze vypisovat libovolný znak načtený z proměnné
uživatelského vstupu na sériový monitor. V druhém zkusíme uživatelský
vstup porovnat se znakem D
, přičemž se vypíše, že uživatel
stiskl klávesu D.
Membránová klávesnice a Piezo
Máme za sebou poměrně jednoduchou konfiguraci klávesnice, která sloužila primárně k tomu, abychom pochopili, jak ji správně používat a inicializovat. Teď si do projektu přidáme pár dalších součástek a zkusíme, jak přes klávesnici ovládat komponenty.
Seznam součástek
Na sestavení obvodu budeme potřebovat tyto součástky:
- 1x 150 [Ω] rezistor,
- 1x 100 [Ω] rezistor,
- 1x Arduino,
- 1x Piezo buzzer,
- 1x LED a
- klávesnici.
Sestavení obvodu
V tomto projektu bude hrát navíc roli ještě LED, kterou velice dobře známe a buzzer, který je schopen měnit napětí na zvuk v nejrůznějších frekvencích. My si tedy ukážeme, jak tyto prvky přes klávesnici ovládat:

Pokud máme vše připravené, můžeme se dát do zapojování součástek. Už víme, jak zapojit klávesnici a LED. Novinkou je tedy Piezo, jehož zapojení je velice jednoduché. Záporný pól zapojíme do GND pinu v Arduinu a kladný pól zapojíme přes 100 [Ω] rezistor do libovolného digitálního pinu. My jsme si vybrali pin 13, kterýkoliv jiný bude však fungovat také. Zapojení máme celé, je tedy načase se přesunout k programování.
Programování obsluhy příkladu
Abychom si výrazně ulehčili práci, budeme vycházet z kódu našeho prvního projektu, budeme jen přidávat nové příkazy a projekt si tak rozšíříme.
U definování pinů pouze přidáme dvě nové komponenty, LED na pinu A5 a Piezo na digitálním pinu 13:
#include <Keypad.h> // Knihovna pro používání klávesnice #define POCET_RADKU 4 // Konstanta definující počet řádků #define POCET_SLOUPCU 4 // Konstanta definující počet sloupců #define LED_CERVENA A5 // Konstanta definující pin LED #define PIEZO 13 // Konstanta definující pin buzzeru char znaky[POCET_RADKU][POCET_SLOUPCU] = // Vytvoření 2D pole pro používání klávesnice { {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; byte radky_piny[POCET_RADKU] = {9, 8, 7, 6}; // Vytvoření pole pro inicializaci pinů pro řádky byte sloupce_piny[POCET_SLOUPCU] = {5, 4, 3, 2}; // Vytvoření pole pro inicializaci pinů pro sloupce Keypad klavesnice = Keypad(makeKeymap(znaky), radky_piny, sloupce_piny, POCET_RADKU, POCET_SLOUPCU);
Skočíme rovnou do funkce setup()
, kde si samozřejmě nově
přidané součástky musíme také inicializovat. Jak vidíme, Piezo buzzer se
inicializuje úplně stejně jako LED zadáním pinu a role komponenty:
void setup() { Serial.begin(9600); pinMode(PIEZO, OUTPUT); pinMode(LED_CERVENA, OUTPUT); }
Hlavní smyčka
Největší změny budou ve funkci loop()
, kam doplníme další
podmínky:
void loop() { char znak = klavesnice.getKey(); // Načítání znaku z klávesy if (znak)// Když bude zmáčknuta jakákoliv klávesa, vypíšeme daný znak { Serial.println(znak); } if (znak == 'B') // Když bude zmáčknuta klávesa B, vypíše tuto hlášku a zabzučí { Serial.println("Buzzer zapnut!"); tone(PIEZO, 150, 300); // pin, frekvence, čas } if (znak == '1') { digitalWrite(LED_CERVENA, HIGH); Serial.println("LED zapnuta"); } if (znak == '0') { digitalWrite(LED_CERVENA, LOW); Serial.println("LED vypnuta"); } }
První podmínka bude úplně stejná a vypíše nám znak stisknutý na
klávesnici v sériovém monitoru. Ve druhé podmínce spouštíme bzučák,
pokud je stisknut znak B, informaci také vypíšeme na sériový
monitor. Samotné spuštění Pieza obstará příkaz tone()
, jež
přijímá tři parametry - pin buzzeru, frekvenci
zvuku, který buzzer vydává a čas v milisekundách, tedy
délku trvání zvuku.
Zbylé podmínky se týkají naší nově přidané LED. Pokud znakem stisknutým na klávesnici bude 1, rozsvítíme naši LED a vypíšeme na sériový monitor, že je zapnuta. Pokud stiskneme 0, LED se vypne a opět to vypíšeme na sériovém monitoru. Znaky stisknuté na klávesnici jsou opět proměnlivé, tudíž je kód lehce změnitelný. S trochou kreativity jde přiřadit funkce každému tlačítku na klávesnici!
V příští lekci, Arduino - LCD displej a jeho programování, si představíme další Arduino komponentu, a to LCD displej. Opět si ukážeme další dva příklady praktického použití LCD displeje.