Czech English

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í
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
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)
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ínkapří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)
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)
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
} 
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)
  }
}

Zapojení tlačítka s pull-up rezistorem
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 vnitřním pull-up rezistorem
Zapojení tlačítka s 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)
  }
}

Ú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á.