IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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:

Klavesnice - Arduino - Hardware

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:

Klavesnice-zapojeni - Arduino - Hardware

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:

Klavesnice-v2 - Arduino - Hardware

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.


 

Předchozí článek
Arduino - Pokročilá práce s tlačítky
Všechny články v sekci
Arduino - Hardware
Přeskočit článek
(nedoporučujeme)
Arduino - LCD displej a jeho programování
Článek pro vás napsal Adam Ježek
Avatar
Uživatelské hodnocení:
49 hlasů
Autor se převážně věnuje Arduinu a psaní tutoriálů z této oblasti, občas napíše příležitostně nějakou tu zprávičku. Většinu svého volného času momentálně věnuje Linuxu a/nebo Raspberry Pi. Také umí C#, HTML, CSS, PHP a Python.
Aktivity