5. diel - Arduino - Klávesnica
Minule sme s Arduino testovali snímač teploty a vlhkosti DHT11. V tomto diele si k Arduino pripojíme klávesnicu a necháme zadané znaky posielať po sériovej linke. Potom si vytvoríme kódový zámok.
Matrix keyboard
Ja mám 12-tich tlačidlovú klávesnicu, ktorú použijem. K Arduino jej pripojíme pomocou 7 drôtikov a ... Niečo tu nesedí, že? 12 tlačidiel a len 7 drôtikov? (Ospravedlňujeme sa tým, čo to už poznajú, vás budem chvíľu nudiť). Je to vďaka tomu, že klávesnica má 4 riadky a 3 stĺpce, každý má jeden drôt, to je tých 7. A jakto, že to funguje? Je to tým, že stlačením tlačidla sa drôt prekríži. Trebárs v prvom riadku máme klávesy 1, 2 a 3. Do prvého riadku je privedený vodič R1, do druhého R2, ... Stĺpce majú vodiče S1, S2, S3. Keďže tlačidlo 1 je v prvom stĺpci a riadku, tak jeho stlačením sa vodič R1 pripojí na S1. Klávesa 2 je tiež v prvom riadku, tiež na vodiči R1, ale už v druhom stĺpci, takže stlačením sa R1 pripojí na S2, nie S1. Takže vodiče R1 až R4 sa pripájajú každý na S1 - S3, takže
4 dráty * 3 dráty = 12 kláves
s iba 7 drôtikmi. Všetko je znázornené na nákrese nižšie:
Hoci klávesnicu môžete tiež zohnať na eBay i kdekoľvek inde, ja som si ju rozhodol vyrobiť sám. Nie je to rozhodne nijako zložitá vec. Stačilo k tomu pár drôtov, 12 tlačidiel, spájka a spol., (Vŕtačka), tavné lepidlo na spevnenie, (pravítko a liehová fixa) a nejaká tá základňa. Ma za obeť padlo viečko od akejsi nátierky. Hoci je z plastu, pájel sa na ňom pomerne dobre. Najskôr som nameral rozloženie tlačidiel, ktoré som vypitval z videa, také tie malé so 4 vývody. Potom som na každý vývod navŕtal dierku, takže tlačidlo išlo jednoducho "nacvaknúť" az druhej strany mi hneď vyliezli vývody. Potom už len trocha spájkovanie, lepidlo pre lepšiu pevnosť, popísať klávesy a hotovo. Výsledok nie je nijako svetoborná, ale slúži a to je hlavné. Medzi výhody DIY patrí, že si môžete urobiť vlastné klávesy, sami si rozvrhnúť kde aké tlačidlo bude. Môžete si určiť aj svoju veľkosť, ak treba budete chcieť 2 * 14, tak sa už zháňa horšie. Výsledok vyzerá asi nejako takto:
Aby nám ale klávesnica s Arduino fungovala, budeme potrebovať nejakú tú knižnicu. Vloženie sme si už popísali v minulom diele.
Tentoraz sa to zaobíde bez schémy, tu len každý drôtik pripojte na nejaký pin, je jedno aký (len sa skúste vyhnúť pinom 1 a 0, po tých beží komunikácie). V kóde potom napíšete, aký pin ide kam.
Uvedieme si kód spolu s vysvetlením pomocou komentárov:
#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 nahráme do Arduino a spustíme. Ak máte všetko dobre, tak sa po stlačení tlačidla ozve pekné pípnutie a tlačidlo sa vám vypíše na počítači (ak otvoríte serial monitor - Ctrl + Shift + M). Ak tomu nie je, skontrolujte zapojenie. Ak sa vypisuje iná klávesa, skontrolujte poradie zapísaných pinov a zapojenie drôtikov. Ak sa vám ho nechce prepájať, tak si prepíšte 3D poľa .
Takto nejako to vyzerá. Kontaktné pole nie je nutné, možno to pripojiť priamo do Arduino.
Kódový zámok
Je síce pekné, že sa nám posielajú znaky, ale čo keby sme mohli niečo zamknú či odomknúť? Ja som žiadny 5V zámok nenašiel, tak som pripojil relé a naň 12 V ventilátor z dielne, ktorý mám s obrátenou polaritou na odsávanie dymu pri spájkovaní. Pre názornosť som ho polepil zdrapy vreckoviek.
A výsledok
Pre tých, čo nepoznajú relé - jedná sa o akýsi "vypínač", ktorý sa ovláda prúdom. Je v ňom elektromagnet, ktorý prepína COM (vstup) z NO (Normal Open) na NC (Normal Close) keď sa do neho privedie prúd. Pokiaľ ho budete hľadať na eBay, tak "Arduino 5V relay", a mali by ste mať také, ktoré neprekročí limit pre pin a môžete ho veselo používať.
Program nám teraz bude čítať znaky a ukladať ich za seba do STRING. Pokiaľ sa ale stlačí A (zapnúť) alebo B (vypnúť), tak sa zistí, či je na konci sekvencie heslo. Ak áno, tak dôjde k vypnutiu alebo k zapnutiu.
Kód bude skoro rovnaký, len pridáme pár menších úprav, všetko zas vysvetlím v kóde. Teraz aj priložím schému. V ňom má relé iba 1 zem, Fritzing (program pre schémy) mnou použitej relé nepozná. Navyše tam nie je ani ventilátor a 12V zdroj, tak sú nahradené motorom a batérií.
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 len príklad. Môžete treba po odomknutí kód na 15 sekúnd pozastaviť a potom opäť zamknúť, ako tomu je u ozajstného zámku. Alebo doplniť o indikačné diódy, všetko už vieme. U ventilátora by to praktické nebolo, takže som urobil zapnutia natrvalo. Spôsobov zámku je tiež veľa, napr. Posúvanie znakov v poli znakov, ale to je len pre záujemcov tu
Funkciu si môžete overiť na videu:
To by bolo asi tak všetko. Ak niečo nefunguje, skontrolujte kód a zapojenie. Nabudúce sa naučíme merať s Arduino vzdialenosť. Inak sa práve chystám na ďalší väčší projekt s Arduino, v ktorom bude použitý len samostatný čip z Arduino, veľký display a napájať sa bude 12V (namiesto štandardných 5V). Zaplníte všetky piny a stále to nebude stačiť, takže zhruba od septembra začnem tutoriály smerovať týmto smerom a potom, až budete všetkému čo tam použijem rozumieť, by som urobil nejaký špeciál, kde by bola praktická ukážka z veľkých projektov