5. díl - Arduino - Klávesnice

Hardware PC Arduino 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:

Schéma klávesnice pro Arduino

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:

Výroba klávesnice pro Arduino

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 :) .

Arduino s klávesnicí

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í.

Schéma zapojení relé pro Arduino

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ů :)


 

Stáhnout

Staženo 121x (2.7 kB)
Aplikace je včetně zdrojových kódů

 

  Aktivity (1)

Článek pro vás napsal Adam Ježek
Avatar
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.

Jak se ti líbí článek?
Celkem (11 hlasů) :
4.818184.818184.818184.818184.81818


 


Miniatura
Všechny články v sekci
Arduino
Miniatura
Následující článek
Arduino - LCD Display

 

 

Komentáře

Avatar
hugo.008
Člen
Avatar
hugo.008:

K tomu relé. Pokud má ovládací vstup (tímpádem je ovladatelné proudy pod 1 mA), bývá zapojeno tak, že přivedením napájecího napětí (VCC a GND)relé sepne (to je považováno za "klidový" stav) a přivedením patřičné úrovně (připojením na GND nebo VCC) na vstup IN relé odpadne (to je "aktivní" stav). Tím se vlastně obrací smysl kontaktů NO a NC. Má to smysl u aplikací kde relé hlásí nějaký poruchový nebo alarmový stav mezi které se počítá i přerušená cívka relé, prokopnutá ochranná dioda případně porucha napájení relé. Nevýhodou může být, že v "klidovém" stavu spotřebovává energii. Zdar Hugo.

 
Odpovědět 12.3.2015 9:14
Avatar
solta
Člen
Avatar
solta:

Jenom drobnost to pole není 3D ale 2D

 
Odpovědět  +2 11.4.2015 12:01
Avatar
tomekmichalhu:

To relé máš blbě, GND je - VCC je + a IN1 je ovládácí signál z arduina. A NC znamená že v klidové stavu je obvod uzavřen, NO je pravý opak, takže relé je v pořádku. Prosím oprav si to.

 
Odpovědět 4.9.2015 19:06
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.