Lekce 5 - Arduino - Klávesnice
Minule jsme s Arduinem testovali čidlo teploty a vlhkosti DHT11. V tomto díle si k Arduinu připojíme klávesnici a necháme zadané znaky posílat po sériové lince. Poté si vytvoříme kódový zámek.
Matrix keyboard
Já mám 12-ti tlačítkovou klávesnici, kterou použiji. K Arduinu jí připojíme pomocí 7 drátků a… Něco tu nesedí, že? 12 tlačítek a jen 7 drátků? (omlouváme se těm, co to již znají, vás budu chvíli nudit). Je to díky tomu, že klávesnice má 4 řádky a 3 sloupce, každý má jeden drát, to je těch 7. A jakto, že to funguje? Je to tím, že stisknutím tlačítka se drát překříží. Třeba v prvním řádku máme klávesy 1, 2 a 3. Do prvního řádku je přiveden vodič Ř1, do druhého Ř2,… Sloupce mají vodiče S1, S2, S3. Jelikož tlačítko 1 je v prvním sloupci a řádku, tak jeho stisknutím se vodič Ř1 připojí na S1. Klávesa 2 je také v prvním řádku, také na vodiči Ř1, ale již v druhém sloupci, takže stisknutím se Ř1 připojí na S2, nikoli S1. Takže vodiče Ř1 až Ř4 se připojují každý na S1 - S3, takže
4 dráty * 3 dráty = 12 kláves
s pouhými 7 drátky. Vše je znázorněno na nákresu níže:

Ačkoliv klávesnici můžete také sehnat na eBayi i kdekoliv jinde, já jsem si jí rozhodl vyrobit sám. Není to rozhodně nijak složitá věc. Stačilo k tomu pár drátů, 12 tlačítek, pájka a spol.,(vrtačka), tavné lepidlo na zpevnění, (pravítko a lihová fixa) a nějaká ta základna. Mě za oběť padlo víčko od jakési pomazánky. Ačkoliv je z plastu, pájelo se na něm poměrně dobře. Nejdříve jsem naměřil rozložení tlačítek, která jsem vypitval z videa, takové ty malé se 4 vývody. Pak jsem na každý vývod navrtal dírku, takže tlačítko šlo jednoduše “nacvaknout“ a z druhé strany mi hned vylezly vývody. Pak už jen trocha pájení, lepidlo pro lepší pevnost, popsat klávesy a hotovo. Výsledek není nijak světoborný, ale slouží a to je hlavní. Mezi výhody DIY patří, že si můžete udělat vlastní klávesy, sami si rozvrhnout kde jaké tlačítko bude. Můžete si určit i svou velikost, pokud třeba budete chtít 2*14, tak se už shání hůře. Výsledek vypadá asi nějak takto:

Aby nám ale klávesnice s Arduinem fungovala, budeme potřebovat nějakou tu knihovnu. Vložení jsme si již popsali v minulém díle.
Tentokrát se to obejde bez schématu, zde jen každý drátek připojte na nějaký pin, je jedno jaký (jen se zkuste vyhnout pinům 1 a 0, po těch běží komunikace). V kódu poté napíšete, jaký pin jde kam.
Uvedeme si kód spolu s vysvětlením pomocí komentářů:
#include <Keypad.h> //vložíme si knihovnu Keypad
const byte ROWS = 4; //řádky
const byte COLS = 3; //sloupce
char hexaKeys[ROWS][COLS] = { //3D pole s klávesami, jak jsou
{'1','2','3'}, //první řádek klávesnice
{'4','5','6'}, //druhý řádek
{'7','8','9'}, //třetí
{'A','0','B'} //a čtvrtý
};
byte rowPins[ROWS] = {30,31,32,33}; /* piny řádků, dodržujte pořadí odshora dolu,
aby 3D pole bylo takové, jaká je klávesnice */
byte colPins[COLS] = {40,41,42}; // piny sloupců, pamatujte na zleva doprava
Keypad klavesnice = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
//vytvoření objektu klávesnice znaky |pin řádky|p.sloupce|řádků|sloupců
//vše před tímto řádkem se zabývá jen deklarací a nastavením klávesnice
//na druhou stranu nás už ale nic zajímat nemusí, jen budeme brát stisknuté klávesy
int piezo = 53; // zas piezo, protože co by to bylo za klávesnici, kdyby nepípala
void setup()
{
Serial.begin(9600);
Serial.println("Odesilani stisknutych klaves na seriovou linku")
// abychom věděli co je v Arduinu nahráno
}
void loop()
{
char stisknutyznak = klavesnice.getKey(); /* Vytvoří novou proměnnou stisknutyznak
typu char(jeden znak), do které uloží znak ze stisknuté klávesy.
Není potřeba jí nulovat, protože po odeslání znaku se do ní hned znovu
načte nový znak, ale pokud nebude na klávesnici nic zmáčknuto,
tak zůstane prázdná. */
if(stisknutyznak) // zjistíme, jestli v proměnné něco je, abychom neposílali prázdné řádky
{
Serial.println(stisknutyznak); //odešleme po sériové lince
tone(piezo, 1200, 80);
//a co by to bylo za klávesnici, kdyby nepípala při stisknutí klávesy
//tón po dobu 80 milisekund s frekvencí 1200 hertzů mi přišel nejlepší
}
}
Kód nahrajeme do Arduina a spustíme. Pokud máte vše dobře, tak se po
stisknutí tlačítka ozve pěkné pípnutí a tlačítko se vám vypíše na
počítači (pokud otevřete serial monitor - Ctrl+Shift+M). Pokud tomu není,
zkontrolujte zapojení. Pokud se vypisuje jiná klávesa, zkontrolujte pořadí
zapsaných pinů a zapojení drátků. Pokud se vám ho nechce přepojovat, tak
si přepište 3D pole .

Takhle nějak to vypadá. Kontaktní pole není nutné, lze to připojit přímo do Arduina.
Kódový zámek
Je sice pěkné, že se nám posílají znaky, ale co kdyby jsme mohli něco zamknou či odemknout? Já jsem žádný 5V zámek nenašel, tak jsem připojil relé a na něj 12 V ventilátor z dílny, který mám s obrácenou polaritou na odsávání kouře při pájení. Pro názornost jsem ho polepil cáry kapesníků.

A výsledek
Pro ty, co neznají relé - jedná se o jakýsi „vypínač“, který se ovládá proudem. Je v něm elektromagnet, který přepíná COM (vstup) z NO(Normaly Open) na NC(Normaly Close) když se do něj přivede proud. Pokud ho budete hledat na eBayi, tak “Arduino 5V relay“, a měli byste mít takové, které nepřekročí limit pro pin a můžete ho zvesela používat.
Program nám nyní bude číst znaky a ukládat je za sebe do Stringu. Pokud se ale stiskne A (zapnout) nebo B (vypnout), tak se zjistí, jestli je na konci sekvence heslo. Pokud ano, tak dojde k vypnutí nebo k zapnutí.
Kód bude skoro stejný, jen přidáme pár menších úprav, vše zas vysvětlím v kódu. Nyní i přiložím schéma. V něm má relé pouze 1 zem, Fritzing (program pro schémata) mnou použité relé nezná. Navíc tam není ani ventilátor a 12V zdroj, tak jsou nahrazeny motorem a baterií.

A samotný kód:
#include <Keypad.h> //vložíme si knihovnu Keypad
const byte ROWS = 4; //řádky
const byte COLS = 3; //sloupce
char hexaKeys[ROWS][COLS] = { //3D pole s klávesami, jak jsou
{'1','2','3'}, //první řádek klávesnice
{'4','5','6'} , //druhý řádek
{'7','8','9'}, //třetí
{'A','0','B'} //a čtvrtý
};
byte rowPins[ROWS] = {30,31,32,33};
//piny řádků, dodržujte pořadí odshora dolu, aby 3D pole bylo takové jaká je klávesnice
byte colPins[COLS] = {40,41,42}; //piny sloupců, pamatujte na zleva doprava
Keypad klavesnice = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
//vytvoření objektu klávesnice znaky |pin řádky|p.sloupce|řádků|sloupců
//vše před tímto řádkem se zabývá jen deklarací a nastavením klávesnice
//na druhou stranu nás již ale nic zajímat nemusí, jen budeme brát stisknuté klávesy
int piezo = 53; //zase piezo, protože co by to bylo za klávesnici kdyby nepípala
String vstup; //do toho stringu si budeme ukládat vstup z klávesnice
String heslo = "1379"; //a v tomto stringu je uloženo heslo potřebné v přepnutí pinu
int rele = 13; //relé na pinu 13...
void setup()
{
Serial.begin(9600);
Serial.println("Kodem ovladany pin"); //abychom věděli, co je v Arduinu nahráno
pinMode(rele, OUTPUT); //výstupní pin pro relé...
}
void loop()
{
char stisknutyznak = klavesnice.getKey();
if(stisknutyznak)
{
tone(piezo, 1200, 80); //pípneme si...
if(stisknutyznak == 'A') //když se stiskne A, pro zapnutí.
// Všimněte si, že zde není "A", ale 'A'! Dvojité uvozovky jsou špatně, toto je znak, nikoli text
{
if(vstup.endsWith(heslo)) //pokud vstup končí heslem...
{
digitalWrite(rele, HIGH); //pusť proud do relé
vstup = ""; // vyresetuj vstup
tone(piezo, 2400, 1000); //a úspěšné pípnutí
}
else //a pokud nekončí heslem
{
vstup =""; //zas vyresetuj vstup
tone(piezo, 500, 1000); //a neúspěšné pípání
}
}
else if(stisknutyznak == 'B') //když se zmáčkne B pro vypnutí
{
if(vstup.endsWith(heslo)) //pokud vstup končí heslem...
{
digitalWrite(rele, LOW); //vypni proud do relé
vstup = ""; //vyresetuj vstup
tone(piezo, 2400, 1000); //a úspěšné pípnutí
}
else //a pokud nekončí heslem
{
vstup =""; //zas vyresetuj vstup
tone(piezo, 500, 1000); //a neúspěšné pípání
}
}
else //pokud není ani A ani B
{
vstup += stisknutyznak; //připojíme na konec vstupu stisknutý znak
}
}
}
Toto je jen příklad. Můžete třeba po odemknutí kód na 15 sekund pozastavit a poté opět zamknout, jako tomu je u opravdového zámku. Nebo doplnit o indikační diody, vše již umíme. U ventilátoru by to praktické nebylo, takže jsem udělal zapnutí natrvalo. Způsobů zámku je také mnoho, např. posouvání znaků v poli znaků, ale to je jen pro zájemce zde
Funkci si můžete ověřit na videu:
To by bylo asi tak vše. Pokud něco nefunguje, zkontrolujte kód a
zapojení. Příště se naučíme měřit s Arduinem vzdálenost. Jinak se
právě chystám na další větší projekt s Arduinem, ve kterém bude použit
jen samostatný čip z Arduina, velký display a napájet se bude 12V (místo
standardních 5V). Zaplním všechny piny a stále to nebude stačit, takže
zhruba od září začnu tutoriály směřovat tímto směrem a poté, až
budete všemu co tam použiji rozumět, bych udělal nějaký speciál, kde by
byla praktická ukázka z velkých projektů
Měla jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 190x (2.7 kB)
Aplikace je včetně zdrojových kódů
Komentáře


Zobrazeno 3 zpráv z 3.