18. díl o Arduinu – maticové zapojení LED diod

V minulých dílech jsme začali displeje, které byly složeny z LED diod. Zobrazovali jsme na nich čísla a v jednom případě jsme i simulovali načítání. A i přes to, že jsem kdysi řekl, že z diod co se zapojení týče, je to snad vše, budeme se v tomto díle k nim vracet, protože existuje ještě jedno zapojení, které jsme si sice představili již dříve, ale tentokrát jej ještě trochu vylepšíme. Důvodem proč jsme si o tomto zapojení neřekli dříve je to, že se používá hlavně u velikých displejů. A protože již za sebou máme jednobitový i dvoubitový displej, který měl sedm segmentů, budeme potřebovat rozšířit počet bitů, který má displej. Právě z tohoto důvodu se nyní podíváme na maticové zapojení LED diod, protože ty větší a hlavně LCD a jim podobné displeje toto zapojení používají a vysvětlovat toto zapojení přímo na displeji by nebylo asi to nejlepší. Pro jednoduchost si tedy řekneme to, jak budeme diody ovládat a až se v příštím díle vrhneme na čtyřbitový, sedmisegmentový displej, budeme dělat to, co již budeme znát a tak pro nás zapojení bude o hodně jednodušší.

IMG_4559

Maticové zapojení LED diod má jednu velikou výhodu. Umožňuje připojení velkého množství LED diod a jejich obsluhu, i přes to, že nebude využito moc pinů Arduina. Dříve, když pominu, jestli jsou diody zapojeny sériově či paralelně. Vždy jsme je zapojili tak, že anoda diody šla do digitálního pinu Arduina a katoda přes odpor do Arduino na místo, které je označeno jako zem (GND). Pokud jsme tedy tímto způsobem chtěli ovládat čtyři diody, zabrali jsme čtyři digitální piny Arduina a zem. Pokud ale sáhneme po maticovém zapojení, pro ovládání čtyř diod bude zapotřebí pouze čtyř digitálních pinů Arduina. Ano, čtete správně! Diody nebude potřeba připojovat k místu, kde má Arduino zem, ale pouze se čtyři diody připojí na čtyři digitální piny.

Stejně by se to dalo popsat na větším příkladu. V případě zapojení devíti LED diod, s klasickým zapojením tak, jak jsme jej dělali doteď, by bylo zapotřebí devět digitálních pinů Arduina a zem. S novým maticovým zapojením však devět diod zvládneme ovládat pouze za pomoci šesti digitálních pinů! Ano, jen šest digitálních pinů bez země! Pojďme ale dále, pokud se rozhodneme používat 16 LED diod a každou z nich budeme chtít ovládat, pro jejich ovládání bude zapotřebí pouze 8 digitálních pinů Arduina, což by dříve prostě nebylo možné. Pokud bychom měli desku UNO, která má pouze velmi malý počet digitálních pinů a rozhodli bychom se, že chceme ovládat třeba 25 LED diod, pak pro připojení tak, jak jsme jej využívali doteď bychom potřebovali 25 digitálních pinů a zem. Když těch 25 diod ale zapojíme maticově a budeme je tak ovládat, bude nám stačit pro pohodlné ovládání každé z diody pouze 10 digitálních pinů! Což je opravdu velmi málo vzhledem k tomu, kolik diod budeme ovládat. Z tohoto důvodu se nyní pro jednoduchost podíváme na zapojení osmi diod, které budou zapojeny maticově.

Pro připojení osmi LED diod do matice budeme potřebovat:

  • Desku Arduino
  • 8 LED diod
  • Propojovací kabely
  • Bastldesku
  • Odpory k vaší diodě

Od tohoto dílu se již nebudu rozepisovat s tím, jak vypočítat odpor k diodě. Dělal jsem to ve všech předchozích a tak pokud to někoho zajímá, nechť se podívá na předchozí díly, kde jsme s LED diodami začínali. Tam je rovněž detailně vysvětleno, jak se odpor počítá.

Nyní se tedy pojďme podívat na to, jak se LED diody zapojují, protože to není nic jednoduchého, i když, po několika zapojených diodách to pravděpodobně budete dělat automaticky a bez chyb. V tomto zapojení jde o vzájemné propojení LED diod do matice, toho docílíme tím, že katody a anody připojíme na „bastldesce“ k sobě. Pokusím se to znázornit na tomto obrázku:

maticove_zapojeni_led_diodNa tomto obrázku je vidět zapojení čtyř diod tak, že katody a anody mají vždy připojeny k sobě. To znamená, že když v propustném směru, tedy ve směru, ve kterém LED dioda svítí, přivedete napětí, například na bod 2 a na druhý bod 2 přivedeme zem, rozsvítí se dioda vpravo dole. Pokud to samé provedete s body 1, rozsvítí se ta úplně první. Tímto se dá rozsvítit každá z diod i bez toho, že by každá musela být zvlášť připojená. My těch LED diod budeme ale zapojovat více. Jak jsem již na začátku řekl, půjde o zapojení osmi LED diod do matice, tedy jejich zapojení bude vypadat takto:maticove_zapojeni_led_diod_8

Zapojení je úplně stejné, jako na předchozím obrázku, jen s tím rozdílem, že je zde dvakrát tolik diod. Pro ovládání těchto osmi diod nám tedy bude stačit jen 6 digitálních pinů Arduina. Nyní se ale pojďme podívat na to, jak to bude vypadat přímo na bastldesce, na které budou připojeny diody.

IMG_4564

Z fotek je docela dobře vidět, jak jsou LED diody zapojeny a také to, že stejně jako v případě, kdy připojujeme jednu, je zapotřebí aby diody měly odpor. Zde nemusíme ale počítat kolik jich kde a jak je zapojených, odpor se týká vždy jen jedné jediné diody. Lze tedy buď ke každé z nich připojit i odpor anebo vzhledem k tomu, že stejně budeme rozsvěcet v jeden moment pouze jednu jedinou je dát tak, jak je to na fotkách, výsledek je stejný. Pokud by však někdo namítal, že bude chtít mít najednou zapojené třeba dvě diody tak, aby svítily. Rovnou zdůrazním, že ve stejný moment nikdy nebudou svítit dvě diody! Vždy bude svítit pouze jedna, nicméně jich tímto způsobem budeme rozsvěcet víc. Lidské oko má totiž určitou setrvačnost, což znamená, že pokud LED diody rozsvítíme v určité rychlosti, pro oko vypadají, jako by svítily, i když blikají. Tohoto nedostatku lidského oka budeme využívat v mnoha dílech. Nyní tedy pokud budeme chtít rozsvítit dvě diody, uděláme to tak, že jednu rozsvítíme třeba na 1ms, poté ji vypneme a rozsvítíme druhou, opět taky na dobu jedné milisekundy. Pak tu druhou zhasneme a opět pustíme na stejně dlouhý čas, tedy jednu milisekundu… Tímto opakováním docílíme toho, že nám svítí dvě diody, nebo alespoň pro lidské oko, nicméně ve skutečnosti s nimi blikáme na střídačku tak rychle, že to nezaznamenáme. Maticové zapojení je tedy vždy o tom, že svítí jen jedna dioda.

Nyní se ale, pokud vše máme zapojeno do matice, pustíme do programování. To v tomto místě bude možná trochu nezvyklé. Na začátek programu, ještě před tím, než začne funkce setup() nebo loop() si deklaruje proměnou, ve které budeme mít piny, na kterých se nacházejí diody. Pokud se podíváte zpět na fotografie, tak zjistíte, že anody mám připojené k Arduinu červenými drátky k digitálním pinům 40,43,44,47 a katody přes odpor a černé drátky k zpět k Arduinu k digitálním pinům 50 a 53. Záměrně jsem použil barvu červenou a černou, která simuluje plus a mínus. Dále je na fotkách vidět zeleně propojení katod mezi LED diodama a žlutě propojení anod. Tentokrát jsem si dal opravdu záležet, abych dodržoval pro stejné připojení stejné barvy, aby to bylo přehledné a mohli jste to podle toho zapojit.

Nyní tedy deklarujeme na začátku programu, jak jsem zmínil výše proměnou, do které si umístíme hodnoty pinů, které jsou připojeny k Arduinu, zde nemusíte dodržovat piny, co jsem zvolil já, každý má vlastní, nicméně pro mě tento kód vypadá takto:

Code!

byte piny_arduina[] = {40,43,44,47,50,53};

Tímto jsme si tedy vytvořili pole, které nese hodnoty pinů, ke kterým je Arduino připojeno k „bastldesce“. Nyní nás ale čeká vytvořit mapu zapojení. Mapa zapojení je něco, podle čeho budete vědět, kterou diodu ovládáte. Jde v ní o to, aby pro konkrétní diodu byla přivedena hodnota HIGH na anodu diody a hodnota LOW na katodu diody.

Code!

byte piny_diody[8][6] = {

{1,0,0,0,0,1},//1,1 - 0

{0,1,0,0,0,1},//2,1 - 1

{0,0,1,0,0,1},//3,1 - 2

{0,0,0,1,0,1},//4,1 - 3

{1,0,0,0,1,0},//1,2 - 4

{0,1,0,0,1,0},//2,2 - 5

{0,0,1,0,1,0},//3,2 - 6

{0,0,0,1,1,0},//4,2 - 7

};

Možná vám to přijde trochu nepřehledné, ale je to velmi jednoduché. Na začátku jsem psal, že piny 40,43,44,47 jsou připojeny k anodám LED diod a piny 50 a 53 ke katodám před odpor. V tomto scriptu tedy neděláme nic jiného, než že nastavíme obvod tak, aby diodou protékal proud v propustném směru, když to uděláme opačně, tak dioda nesvítí. Znamená to tedy, že nastavíme jen tu diodu, která má svítit, a u všech ostatních nastavíme to, aby nesvítily. Vždy první čtyři hodnoty jsou pro anodu, další dva pro katodu, tedy alespoň pro toto zapojení. Musíme tedy docílit toho, aby diodou protékal proud tak jak má a právě tímto toho docílíme. Za dvěma lomítkami je souřadnice diody, která se rozsvítí, tedy první čtyři diody pro první řádek a další čtyři pro druhý. Když vezmu tedy první řádek pro diodu se souřadnici 1;1. Znamená to tedy, že na pinu 40 nastavím hodnotu HIGH a aby se mohla rozsvítit tak na pinu 50 hodnotu LOW. Dioda svítí totiž jen v případě, že na její anodě je z Arduina posílána hodnota HIGH (popř. 1, což je to samé), protože tím je puštěno na tomto pinu napájení a aby byl obvod kompletní, je na pinu 50 hodnota 0, tedy LOW, čímž se uzavírá okruh. Ostatní diody mají hodnoty opačně anebo tak, že svítit nemohou, tedy když ke katodě i anodě přiřadíme hodnotu LOW, nebude svítit, stejně tak, jako když k oběma koncům přiřadíme hodnotu HIGH.

Pokud by kód výše nebyl jasný, dejte o tom vědět do komentářů, rád vám to zkusím vysvětlit trochu jinak, protože chápu, že to nemusí být úplně všem po prvním přečtení jasné.

Nyní si nastavíme piny ve funkci setup().

Code!

void setup() {

pinMode(40, OUTPUT);

pinMode(43, OUTPUT);

pinMode(44, OUTPUT);

pinMode(47, OUTPUT);

pinMode(50, OUTPUT);

pinMode(53, OUTPUT);

}

Pokud se vám to nechce psát takto postupně, což u větších projektů rozhodně není dobré, lze si tento kód zjednodušit tak, že si místo tohoto napíšete cyklus. Cyklus bude vypadat takto:

Code!

for(int i = 0;i<6;i++){

pinMode(piny_arduina[i], OUTPUT);

}

Takto jednoduše lze vytvořit to samé s tím, že jsme rovnou použili pole piny_arduina, které jsme vytvořili hned na začátku tohoto dílu. Co budete používat je jen a čistě na vás, nicméně tato metoda je jednodušší a lepší a pokud budete vytvářet složitější projekt, jako třeba připojivat 50 LED diod, ušetří vám to cca 47 řádku kódu.

Teď ale budeme muset vytvořit naší vlastní funkci, kterou jsem pojmenoval zapni_diodu. Tato funkce získává jeden jediný parametr a tím je číslo diody, které se má zapnout. Na začátku v kódu je za poznámkou kromě souřadnice napsáno i její číslo. A ano, je napsáno správně! Pole jsou totiž číslovány od 0, a proto číslo první diody není 1 ale 0 a vše je o jedničku posunuté. Teď se ale vrátíme k funkci zapni_diodu:

Code!

void zapni_diodu(int dioda){

for(int i = 0;i<7;i++){

digitalWrite(piny_arduina[i],piny_diody[dioda][i]);

}

}

Tento kód nedělá nic jiného, než že vezme číslo diody a nastaví všechny piny podle masky, kterou jsme vytvořili výše tak, aby se právě tato dioda rozsvítila. Nyní už jen stačí vše zavolat z hlavní funkce loop(). Tam kód pro zavolání může vypadat třeba takto:

Code!

void loop() {

zapni_diodu(X);

delay(250);

}

Kde X je číslo diody, která se má zapnout. Nicméně pokud jich máte připojeno víc, tak takovéto postupné rozsvěcení vždy po nahrání nového kódu není nic moc a tak je velmi vhodné si vytvořit například cyklus a v tom cyklu je postupně rozsvěcet. Takový cyklus může vypadat třeba takhle:

Code!

void loop() {

zapni_diodu(a);

a++;

if(a>7){

a=0;

}

delay(250);

}

Možná bych ještě podotknul, že je dobré, jak jsme někde na začátku deklarovali masku a piny, si deklarovat proměnou A, která bude integer a bude mít od začátku běhu programu hodnotu 0:

Code!

int a = 0;

Pokud toto všechno máme, výsledný efekt bude vypadat stejně jako na videu. Po tomto díle se tedy budeme moci, pokud vše proběhlo tak jak má, vrhnout na maticové displeje, protože znalosti z tohoto dílu v nich zcela určitě využijeme.

Nyní se ale podíváme ještě na jednu věc. Zmínil jsem se o ní na začátku a to bude rozsvícení více diod najednou. Možné to samozřejmě fyzicky není a tak to budeme dělat tak, jak jsem říkal, jednu diodu rozsvítíme, určitou dobu necháme svítit a pak diodu zhasneme a místo ní si rozsvítíme jinou. Tu opět necháme chvíli svítit, zhasneme a pustíme zase první. Kód, kterým je toto možné vytvořit může vypadat třeba takto:

Code!

zapni_diodu(1);

delay(10);

zapni_diodu(6);

delay(10);

Tento kód rozsvítí diodu 1 a 6 a v podstatě mezi nimi přepíná, ale tak rychle, že lidské oko není schopné díky setrvačnosti zjistit, že se to opravdu děje. Od hodnoty 12 ms už je vidět že dioda rychle bliká, nebo alespoň já to již vidím, možná se ale najdou tací, kteří to uvidí ještě dříve, třeba při 11 či 10ms… Nicméně pořád není problém nastavit hodnotu menší. Toto je jen na vás. Příště se tedy podíváme na maticový, sedmisegmentový displej se čtyřmi čísly, na kterém budeme opět, jako v předchozích dílech zobrazovat čísla.

„Líbil se Vám tento článek? Sdílejte ho prosím na sociálních sítích, ať se o něm dozvědí i Vaši kamarádi. Děkuji!“
Share on FacebookShare on Google+Tweet about this on TwitterShare on TumblrEmail this to someone