Czech English

2. Blikáme LEDkou

aneb jak to funguje

V minulém díle jsme si rozchodili vývojové prostředí. Přeložili a rozběhli první program. Dnes se na blikátko podíváme trochu podrobněji, vysvětlíme si jak připojit LED k mikrokontroleru a co ten program vlastně dělá.


Bližší záběr na LED diodu, jsou zde vidět vnitřní struktury.
Bližší záběr na LED diodu, jsou zde vidět vnitřní struktury.

Co to ta LEDka vlastně je?

LED je polovodičová dioda, tzn. elektronický prvek, který zjednodušeně v jednom směru proud vede a v druhém ne (tedy stejně jako zpětný ventil v pneumatických systémech) a navíc od ostatních diod svítí. Ve skutečnosti to je trošku složitější, a proto se podíváme na základní parametry LED.
Vetšinu lidí hlavně zajímá jakou barvou svítí a jak hodně (to je sice zajímavé, ale nás to v tuto chvíli moc zajímat nebude). Tři nejdůležitější parametry jsou úbytek napětí v propustném směru, maximální proud v propustném směru a maximální napětí v závěrném směru.
Na rozdíl od žárovek, u kterých nezáleží na polaritě napájecího napětí a jsou schopny tedy pracovat na střídavé napětí, LED zapojené nesprávným způsobem nepracují. Když je napětí na P-N přechodu diody zapojené správně, říkáme že je zapojena v propustném směru a v tomto stavu skrz ni prochází proud.
Pro určení správné polarity diody je nejjistější podívat se do jejího katalogového listu (tzn. datasheetu), který je jakýmsi rodným listem každé součástky. Ale nejrychlejším způsobem je to vyzkoušet, nejlépe multimetrem. Další způsoby určení uvádí tabulka:
znaménko: +
polarita: kladná záporná
výstup: anoda (A) katoda (K)
vývod: dlouhý krátký
pouzdro z vnějšku: zakulacené ploché
uvnitř pouzdra: menší větší
Anoda a katoda na LED
Anoda a katoda na LED
Dalším zásadním rozdílem oproti žárovce je, že to, jak hodně svítí neovlivníme napětím připojeným na diodu, ale velikostí proudu, který jí prochází (u žárovky také záleží na proudu, ale protože se žárovka chová jako odporová zátěž, tak je proud úměrný velikosti napětí na žárovce).
Při průchodu proudu diodou na ní dochází k úbytku napětí (to záleží na typu diody - barvě). Proto zdroj, ze kterého diodu napájíme musí mít větší napětí než je úbytek na diodě. Ale pozor, diodu na zdroj nesmíme připojít přímo, téměř jistě bychom ji zničili, protože by jí protékal větší proud než je přípustný.
BarvaÚbytek napětí
Infračervená1,6 V
Červená1,8 V až 2,1 V
Oranžová2,2 V
Žlutá2,4 V
Zelená2,6 V
Modrá3,0 V až 3,5 V
Bílá3,0 V až 3,5 V
Ultrafialová3,5 V
Proud v propustném směru u nízkopříkonových LED se pohybuje od 1-2 mA, u standardních LED 10~25 mA až po proudy nad 1 A u speciálních LED používaných v osvětlovací technice. Proto musíme pře diodu zařadit rezistor, kterým proud omezíme. Pro určení jeho velikosti využijeme ohmova zákona.

Zapojení LED
Zapojení LED

Příklad:

červená LED:
  • úbytek napětí v propustném směru 2V
  • maximální proud 20mA
zdroj 5V
Aby na diodě bylo napětí 2V při proudu 20mA, musí na rezistoru vzniknout úbytek napětí 3V (5 V - 2V). Z ohmova zákona vychází R = U/I = 3/0,02 = 150 ohmů. To je minimální hodnota předřadného rezistoru, pokud nepožadujeme maximální svit, běžně volíme menší proud a tomu odpovídající hodnotu rezistoru. Obvyklá hodnota je 330 ohmů (tj. proud diodou cca 10mA).

Modrá, zelená a červená LED v 5mm difuzním pouzdru
Modrá, zelená a červená LED v 5mm difuzním pouzdru
Když je zapojená opačně než má být, říkáme že je zapojená v závěrném směru a neprochází skrz ni téměř žádný proud a ani nevyzařuje žádné světlo. Ale maximální hodnota napětí, které můžeme na diodu zapojenou v závěrném směru přivést je dalším důležitým parametrem.
Pokud připojíme napětí vyšší dojde k proražení diody. Běžné LED mají závěrné napětí kolem 5V, proto pokud používáme zdroj o tomto napětí a zapojíme LED opačně, nic se jí nestane (jen nebude svítit).
Nyní už umíme LED zapojit, tak aby svítila.

Připojení LED k mikrokontroleru

LED je elektronický prvek - spotřebič (stejně jako žárovka, rezistor, elektromotor, ...). Odborně jsou tyto prvky nazývány akční členy (aktuátory) a ovládacím obvodem do nich řídíme přívod proudu a tím ovlivňujeme jejich stav. V nejjednoduším případě jen proud pustíme nebo vypneme - akční člen je v aktivním stavu nebo v klidu (svítí/nesvítí, ...).
Mikrokontroler, ke kterému budeme chtít LED připojit má však omezený maximální proud, který je schopen na výstupu dodat. (maximální proud jedním pinem - nožičkou mikrokontroleru AVR je 40mA). Proto LED můžeme přímo připojit na výstup mikrokontroleru (ale např. žárovku nebo elektromotor ne, ty mají obvykle mnohem větší proudovou spotřebu).
Ale pozor, je omezen i maximální proud pro celý obvod (200mA). Můžeme tedy připojit maximálně 10 současně svítících LED s proudem 20mA, nebo použijeme nižší proud a tím zvýšíme počet LED, kterém mohou současně svítit (pro proud 10mA jich můžeme připojit 20).
Zapojení LED ovládané mikrokontrolerem je tedy jednoduché, pouze nahradíme zdroj 5V výstupem mikrokontroleru (např. pin označený D2). Celé zapojení na kontaktním poli je na obrázku. Výstup Arduina D2 je připojem na rezistor, ten na anodu LED a katoda LED na zem (GND).

A nyní program

Jak už víme z minula, celý program pro Arduino se sestává ze dvou částí - funkcí. Ve funkci setup jsou příkazy, které se provedou pouze jednou po zapnutí (resetu). Poté Arduino začne stále dokola provádět příkazy uvedené ve funkci loop.
První příkazy, které se tedy naučíme budou pro ovládání jednotlivých pinů (nožiček) mikrokontroleru. Pro začátek nám budou stačit jen dva stavy (vypnuto x zapnuto), tedy digitální ovládání.
První co musíme udělat, je nastavit jestli daný pin (nožička) bude vstupní (signál bude do mikrokontroleru přiváděn zvenší) nebo výstupní (mikrokontroler bude něco řídit). K tomu slouží funkce
pinMode(pin, mode)

  pin   ... určuje, který nožička se má nastavit (0-13)
  mode  ... určuje, zda bude vstup nebo výstup (INPUT, INPUT_PULLUP, OUTPUT)
druhou funkcí, kterou budeme potřebovat je nastavení hodnoty na výstupní pin
digitalWrite(pin, value)

  pin   ... určuje, který nožička se má nastavit (0-13)
  value ... určuje hodnotu výstupu 0/1 (LOW/HIGH)
A teď celý program:
void setup()
{   
  pinMode(2, OUTPUT);   // nastaveni pinu 2 jako vystup
}

void loop()
{
  digitalWrite(2, 1);   // na vystup 2 nastavit 1 (5V)
  digitalWrite(2, 0);   // na vystup 2 nastavit 0 (0V)
}
Tento program funguje, ale po spuštění máme pocit, že LED svítí stále, je to tím, že přepínání zapnuto/vypnuto probíhá velice rychle (cca 100 000x za sekundu). Proto mezi zapnutí a vypnutí LED zařadíme časovou prodlevu. Tu realizuje funkce
delay(time)

  time ... čas čekání v ms
Upravený program:
void setup()
{   
  pinMode(2, OUTPUT);   // nastaveni pinu 2 jako vystup
}

void loop()
{
  digitalWrite(2, 1);   // zapnout led, na vystup 2 nastavit 1 (5V)
  delay(500);
  digitalWrite(2, 0);   // vypnout led, na vystup 2 nastavit 0 (0V)
  delay(500);
}
Nyní LED bliká s periodou 1s (0,5s svítí, 0,5s nesvítí).
Ještě uděláme jednu úpravu. Pokud bychom teď chtěli LEd zapojit na jiný pin než 2, tak musíme na 3 místech v programu toto upravit. Zde nastává potenciální nebezpečí, že to někde zapomeneme. Proto je vhodnější zavést symbolické pojmenování místo konkrétního čísla pinu a pak jej používat. To realizujeme tzv. direktivou preprocesoru:
#define LED 2

  LED ... symbolické jméno
  2   ... hodnota (kterou se symbolické jméno v programu nahradí)
Stejně tak, můžeme nahradit konkrétní hodnotu čekání a pro nastavení výstupu použijeme předefinované konstanty HIGH a LOW. Finální podoba programu pro blikání LED:
#define LED   2
#define TIME  500

void setup()
{   
  pinMode(LED, OUTPUT);   // nastaveni pinu 2 jako vystup
}

void loop()
{
  digitalWrite(LED, HIGH);  // zapnout led, na vystup 2 nastavit 1 (5V)
  delay(TIME);
  digitalWrite(LED, LOW);   // vypnout led, na vystup 2 nastavit 0 (0V)
  delay(TIME);
}

Jde to i jinak

LED lze k výstupu Arduina zapojit i jinak. V původním zapojení necháme připojení na kladný pól zdroje a místo připojení na zem zapojíme výstup mikrokontroleru. V případě, že výstup bude v 0 (0V), tak bude led svítit, pokud bude výstup v 1 (5V), nebude led svítit.
Zapojení funguje tedy přesně opačně než to původní, v programu tedy stačí zaměnit nastavení výstupu.
#define LED   2
#define TIME  500

void setup()
{   
  pinMode(LED, OUTPUT);   // nastaveni pinu 2 jako vystup
}

void loop()
{
  digitalWrite(LED, LOW);    // zapnout led, na vystup 2 nastavit 0 (0V)
  delay(TIME);
  digitalWrite(LED, HIGH);   // vypnout led, na vystup 2 nastavit 1 (5V)
  delay(TIME);
}

Úkoly na samostatnou práci

1. Připojit ještě druhou LED, např. na výstup 3
2. Sestavte program pro střídavé blikání obou led (jako na železničním přejezdu) s periodou 1s
3. Upravit program tak, aby diody blikaly postupně: rozsvítí se první, po 0,25s se rozsvítí druhá, v čase 0,5s zhasne první a v čase 0,75s zhasne druhá. V čase 1s se opět rozsvítí první a stále dokola.
4. Napište program, tak aby jedna led blikala s periodou 1s (0,5s svítí, 0,5s nesvítí) a druhá led blikala s periodou 0,5s (0,25s svítí, 0,25s nesvítí).

Zdroje