3. Tlačítko
aneb jak reagovat na okolní svět
Jak ovládat LED z arduina už víme. Dalším důležítým krokem bude reakce našeho počítačového mozku na podněty z okolí. "Nejjednodušším" snímačem, který bude zprostředkovávat signály z vnějšího světa, je tlačítko. Jak ho připojit a jak zajistit reakci v programu se naučíme v dnešní lekci.
|
Jak tlačítko vlastně funguje?
Tlačítko je elektromechanický prvek tvořený tzv. kontaktem (což je nejdůležitější část),
obalu, pohyblicé části a popř. pružinou. Nejjednoduší tlačítko má obvykle jeden
spínací kontakt. V klidovém stavu je rozpojený - nevede elektrický proud (má téměř
nekonečný odpor). V aktivním stavu je kontakt sepnutý - vede elektrický proud
(má téměř nulový odpor).
Aby počítač reagoval na stisk tlačítka, musíme jej připojit na pin, který
nastavíme jako digitální vstup. Tlačítko musíme zapojit tak, aby v klidu
bylo na daném vstupu napětí 0V (logická 0) a když je stisknuté, aby tam bylo
5V (logická 1). Asi první, co nás napadne, je zapojit tlačítko dle následujícího schématu.
Na první pohled po vypadá funkčně. Při stisknutí tlačítka je na vstup připojeno
přímo napájení (5V) a v klidu tam není připojeno nic.
Zapojení tlačítka - nefunkční |
A to je ten problém!!! Nic není 0V. Pokud není na vstup mikrokontroleru připojeno nic,
tak je na vstupu náhodná hodnota. Musíme zajistit, aby v klidovém stavu bylo
na vstup připojeno 0V (zem). To by šlo zajistit použitím tlačítka s přepínacím
kontaktem (viz. schéma), ale i tak během pohybu kontaktu tlačítka není vstup
nikam připojen a mohou tak, nastávat nepředvídatelné stavy. Další problém je v tom,
že obvykle tlačítko s přepínacím kontaktem nemáme.
Celý problém se dá snadno vyřešit použitím tzv. pull-down rezistoru. To je rezistor,
který zapojíme mezi vstupní pin a zem. Tlačítko je připojeno mezi kladnou svorku
zdroje (5V) a vstup (viz. schéma). Pokud je tlačítko v klidovém stavu (rozpojeno), je
vstup mikrokontroleru přes rezistor spojen se zemí (je na něm 0V). Pokud je tlačítko
stiknuté (kontakt sepnutý) tak je na vstup připojeno 5V zdroje. To je ovšem připojeno
i na pull-down rezistor, přes který tak prochází proud do země. Proto musíme vhodně
zvolit velikost tohoto rezistoru.
Zapojení tlačítka s pull-down rezistorem |
Zapojení tlačítka s pull-down rezistorem |
Pokud bychom zvolili např. hodnotu R = 100 ohmů, tak v případě stisknutí tlačítka,
bude rezistorem protékat proud I = U / R = 5 / 100 = 0,05 A = 50 mA. To je více než
je spotřeba celeého mikrokontroleru. Proto volím hodnotu pull-down rezistoru podstatně
větší (10 - 100 kohmu, tomu odpovídá proud 0,5 - 0,05mA).
Program
Jak už víme, piny mikrokontroleru mohou fungovat jaké výstupní nebo vstupní. Pokud
připojíme na pin tlačítko, musíme ho přepnout do režimu vstupu.
pinMode(pin, INPUT)
Pro čtení hodnoty vstupu slouží funkce:
bool digitalRead(pin)
pin ... určuje, který číslo pinu, jehož hodnotu chceme zjistit (0-13)
... výsledkem je hodnota na vstupu 0/1 (LOW/HIGH)
pin ... určuje, který číslo pinu, jehož hodnotu chceme zjistit (0-13)
... výsledkem je hodnota na vstupu 0/1 (LOW/HIGH)
Abychom za základě zjištěné hodnoty mohli něco smysluplného provést, musíme se
naučit důležitou programovou konstrukci - větvení, tzv. podmíněný příkaz.
if (podmínka) příkaz
podmínka ... logický výraz (znak == testuje rovnost, != neovnost)
příkaz ... příkaz se provede pokud je podmínka splněná (tj. má hodnotu logická 1)
podmínka ... logický výraz (znak == testuje rovnost, != neovnost)
příkaz ... příkaz se provede pokud je podmínka splněná (tj. má hodnotu logická 1)
nebo úplná varianta:
if (podmínka)
příkaz1
else
příkaz2
podmínka ... logický výraz
příkaz1 ... příkaz se provede pokud je podmínka splněná (tj. má hodnotu logická 1)
příkaz2 ... příkaz se provede pokud není podmínka splněná (tj. má hodnotu logická 0)
příkaz1
else
příkaz2
podmínka ... logický výraz
příkaz1 ... příkaz se provede pokud je podmínka splněná (tj. má hodnotu logická 1)
příkaz2 ... příkaz se provede pokud není podmínka splněná (tj. má hodnotu logická 0)
Součástí větvení je příkaz, který se má provést v případě splnění podmínky. Pokud potřebujeme
provést příkazů více je nutné z nich udělat "jeden", tzv. složený příkaz (toho dosáhneme
uzavřením příkazů do složených závorek).
{
příkaz 1
příkaz 2
.
.
příkaz n
}
příkaz 1
příkaz 2
.
.
příkaz n
}
A nyní již ukázka jednoduchého programu. Na pinu 2 máme připojenu LED a na pinu 5
tlačítko s pull-down rezistorem.
#define LED 2
#define TLACITKO 5
void setup()
{
pinMode(LED, OUTPUT); // nastaveni pinu 2 jako vystup
pinMode(TLACITKO, INPUT); // nastaveni pinu 5 jako vstup
}
void loop()
{
if (digitalRead(TLACITKO) == 1) // když je stisknuté tlačítko (vstup 5V), tak
{
digitalWrite(LED, HIGH); // zapnout led, na vystup 2 nastavit 1 (5V)
}
else // jinak
{
digitalWrite(LED, LOW); // vypnout led, na vystup 2 nastavit 0 (0V)
}
}
#define TLACITKO 5
void setup()
{
pinMode(LED, OUTPUT); // nastaveni pinu 2 jako vystup
pinMode(TLACITKO, INPUT); // nastaveni pinu 5 jako vstup
}
void loop()
{
if (digitalRead(TLACITKO) == 1) // když je stisknuté tlačítko (vstup 5V), tak
{
digitalWrite(LED, HIGH); // zapnout led, na vystup 2 nastavit 1 (5V)
}
else // jinak
{
digitalWrite(LED, LOW); // vypnout led, na vystup 2 nastavit 0 (0V)
}
}
Zapojení tlačítka s pull-up rezistorem |
Jde to i opačně
Podobně jako jsme si ukázali inverzní zapojení led, tak můžeme opačně zapojit i tlačítko.
Tlačítko zapojíme mezi zem a vstup mikrokontroleru a použijeme tzv. pull-up rezistor,
zapojený mezi vstup a 5V. Vše bude fungovat stejně, jen budou opačně logické úrovně
(tlačítko nestisknuté - 5V = logická 1, tlačítko stisknuté - 0V = logická 0).
Výhoda tohoto zapojení je v tom, že můžeme pull-up rezistor ušetřit. Většina mikrokontrolerů
obsahuje vnitřní pull-up rezistory, které můžeme programově zapínat. V programu tak,
musíme provést dvě drobné změny: nastavit pin, ke kterému je připojeno tlačítko jako vstup
se zapnutým pull-up rezistorem a v podmínce, kde zjišťujeme, zda je tlačítko stisknuté,
změnit hodnotu 1 za 0.
Zapojení tlačítka s vnitřním pull-up rezistorem |
Zapojení tlačítka s pull-up rezistorem |
#define LED 2
#define TLACITKO 5
void setup()
{
pinMode(LED, OUTPUT); // nastaveni pinu 2 jako vystup
pinMode(TLACITKO, INPUT_PULLUP); // nastaveni pinu 5 jako vstup se zapnutym pull-upem
}
void loop()
{
if (digitalRead(TLACITKO) == 0) // když je stisknuté tlačítko (vstup 0V), tak
{
digitalWrite(LED, HIGH); // zapnout led, na vystup 2 nastavit 1 (5V)
}
else // jinak
{
digitalWrite(LED, LOW); // vypnout led, na vystup 2 nastavit 0 (0V)
}
}
#define TLACITKO 5
void setup()
{
pinMode(LED, OUTPUT); // nastaveni pinu 2 jako vystup
pinMode(TLACITKO, INPUT_PULLUP); // nastaveni pinu 5 jako vstup se zapnutym pull-upem
}
void loop()
{
if (digitalRead(TLACITKO) == 0) // když je stisknuté tlačítko (vstup 0V), tak
{
digitalWrite(LED, HIGH); // zapnout led, na vystup 2 nastavit 1 (5V)
}
else // jinak
{
digitalWrite(LED, LOW); // vypnout led, na vystup 2 nastavit 0 (0V)
}
}
Úkoly na samostatnou práci
1. Upravte program tak, aby LED blikala s periodou 1s pokud je tlačitko stisknuté.
Pokud tlačítko není stisknuté, tak je LED zhasnutá.