Tato lekce, je stejně jako předešlá nepovinná. Je takovou výzvou pro ty, kteří si chtějí pořádně zabastlit a poznat jak funguje pole diod (dále jen matrix) doopravdy a co se skrývá ve vnitřku. Lekce je nepovinná z toho důvodu, že je hodně náročná na přesnost zapojení a program, kterým ovládáme náš matrix je poměrně dlouhý a robustní. V praxi se na ovládání pole používá patice s pomocným obvodem, která zjednodušuje zapojení a ovládání desky a knihovny, které zase významně zjednodušují programování arduina pro ovládání desky. Nicméně pro pochopení toho jak matrix vlastně funguje je tato kapitolka velmi dobrá a proto vám doporučuji ji alespoň přečíst.
Na začátku je třeba si říci, co se vlastně skrývá ve vnitřku pole LED diod – matrixu. Nejedená se o nic jiného, než o „baterii“ LED diod spojených v plastovém pouzdře do čtverce LED diod 8×8. Různou kombinací rozsvěcení LED diod můžeme signalizovat různé symboly, nebo znaky a tím vlastně používat tuto součástku jako jednoduchý displej. V praxi se také tohoto displeje používá – jistě jste si všimli na nádražích, v autobusech, nebo v krámcích (a nebo nad hlavním vchodem našeho Domečku) podobných velkoplošných displejů. Jejich výhodou je totiž poměr ceny k výkonu a ploše displeje.
Popis LED matrixu
Jak jsem již říkal, matrix není nic jiného než čtverec/pole LED diod o stranách 8×8 prvků. Z jednoho z prvních dílů mého seriálu již víme, že LED dioda, z nichž je matrix složen, je součástka u které je důležité pólování (je důležité na který výstup připojit kladný pól a na který připojit pól záporný). V našem poli jsou výstupy pro řádky napojeny na anody diod (výstupy, kde je třeba připojit kladný pól pro průchod el. proudu) a výstupy zase připojeny na katody, kde je potřebné, aby pro správnou funkci byl připojen záporný pól. Chceme-li rozsvítit určitou LED v bloku je třeba na správný řádek přivést kladné napětí a na správný sloupec zase připojit ke GND.
Konstruktéři, kteří vymýšleli tuto součástku, ji příliš nepřizpůsobovali uživateli. proto nejsou řádky ani sloupce reálně na součástce seřazeny na jedné straně sloupce a na druhé straně řádky, jak by se zdálo optimální, ale jsou poskládány chaoticky tak, jak to bylo pro výrobu i konstrukci optimální a ty koncový uživatel ber, nebo nech ležet. Výsledkem je, že jsou vývody pro řádky i sloupce na součástce namixovány, jak to prostě vyšlo. Orientaci by vám v tom mohla poskytnout pravá polovina grafiky, kde je fyzické rozložení pinů popsáno metodou S – sloupec, Ř – řádek a číslo v pořadí. Věřím, že je to pro pochopení systému, jakým je pole matrixu „organizováno“ celkem jasné. Na desce je na jednom z boku napsaný kód produktu. Tato strana je brána jako ta od které je nutné počítat vývody. Na předchozí grafice máte tuto stranu označenou červenou tečkou.
Zapojení součástky
Z důvodu přístupu k výstupům desky jsem použil pro zapojení dvě kontaktní pole typu MINI. Není to ovšem podmínkou, klidně si zapojení proveďte na desky, jaké potřebujete.
Tip: Výstupy z desky matrixu jsou tenké a mají špatný kontakt ve zdířkách pole. Lze to vyřešit mezičlánkem – piny typu samice (viz video).
Schéma zapojení je poněkud zmatené pro první pohled, proto ho trošku popíši, abych bylo vše jasnější. Na schématu jsou vodiče dvou barev. Červené jsou vstupy pro řádky matrixu (tudíž je nutné pro aktivaci poslat do tohoto vodiče kladný potenciál – HIGH) a černé jsou vodiče určené pro sloupce matrixu (tudíž pro aktivaci posíláme záporný potenciál – LOW). Na červených vodičích jsou vždy ochranné odpory o hodnotě 220 ohmů.
Pro správné fungování matrixu je zapotřebí ovládat 16 pinů. Arduino vám však poskytuje pouze 13 digitálních výstupů. Navíc jsou digitální piny 0 a 1 určeny pro sériovou komunikaci a jejich využívání znemožňuje zavádění programu z pc, proto je lepší je nevyužívat. Z těchto důvodů jsem navíc využil čtyři analogové výstupy A2 až A5. Tyto výstupy se programují drobátko odlišněji než digitální výstupy, které jsme programovali doposud a proto si v odstavci určenému programování celé konstrukce řekneme, jak je programovat.
Programování LED matrixu
Práce s analogovým I/O
V předchozích odstavcích jsem upozorňoval, že budeme zvyšovat počet ovládaných výstupů na šestnáct. Jako primární výstupy budeme používat hlavně digitální výstupy. Bohužel digitální výstupy Arduina UNO, v případě pinů 0 a 1, mají tu hloupou vlastnost, že jsou určeny zároveň jako výstupy pro sériovou komunikaci. Sériovou komunikaci ale používáme i pro nahrávání programu z počítače do desky arduina. Pokud bychom pro naše zapojení využili tyto výstupy nepřenášel by se program z pc do desky, pokud bychom piny přechodně při přenosu neodpojili. Abychom nemuseli při našich pokusech pořád připojovat a odpojovat piny zpravidla piny 0 a 1 nevyužíváme. Zbývají nám k dispozici tudíž pouze k dispozici piny 2-13 = 12 pinů. Matrix potřebuje pinů 16. Půjčíme si tedy analogové piny (analogové piny – piny A0 – A5). Tyto piny se programují trošku jinak, ale využít se dají.
Deklarace pinů v setupu:
Digitální piny – pinMode(2,OUTPUT); – pin č. 2 bude fungovat jako výstup
Analogové piny – pinMode(A2,OUTPUT); – pin č. A2 bude fungovat jako výstup
Rozdíl tkví v označovaní pinů, kterých se příkaz pinMode týká. Digitální piny se označují pouze číslem, u analogových pinů se před číslo přidává písmeno A.
Příkaz pro výstup a vstup
Digitální piny – digitalWrite(2,1); – pin č.2 posílá na výstup aktivní signál. V závorce je jako první parametr číslo pinu a jako druhý parametr úroveň signálu
1, nebo slovo HIGH znamená, že je signál aktivní, 0, nebo slovo LOW znamená že není.
Pro ovládání analogových pinů používáme příkaz analogWrite. Je to obdoba příkazu digitalWrite přizpůsobená fungování analogových vstupů/výstupů (analogové vstupy/výstupy místo úrovní logické 0, nebo 1 rozeznávají úrovně 0 – 255)
Analogové piny – analogWrite(A2,255); – analogový pin A2 posílá na výstup aktivní signál na úrovni logické 1. Prvým parametrem v závorce je číslo analogového pinu, kterého se příkaz týká (Arduino Uno A0 – A5). V druhém parametru volíme pro logickou 1 nejvyšší možnou úroveň signálu výstupu 255. Pro logickou 0 volíme podobně jako u příkazu digitalWrite úroveň 0.
Princip programování LED Matrixu
Chceme-li rozsvítit LED v poli matrixu je třeba poslat na řádek bodu, který chceme rozsvítit kladný potenciál napětí a sloupec odpovídající danému připojit poslat potenciál záporný. Elektrický obvod se tak uzavře a bod v matrixu se rozsvítí.
Kód pro rozsvícení jednoduchých obrazců pak může vypadat třeba takto:
/* Program pro zapojení pouhé desky LED Matrix Zapojení: strana LED Matrix 1 (s potiskem) port 1 / y4 / arduino pin 11 port 2 / y2 / arduino pin 09 port 3 / x7 / arduino pin 06 port 4 / x6 / arduino pin 05 port 5 / y1 / arduino pin 08 port 6 / x4 / arduino pin 03 port 7 / y3 / arduino pin 10 port 8 / y6 / arduino pin 13 strana LED Matrix 1 (bez potisku) port 1 / x1 / arduino pin 00 port 2 / x2 / arduino pin 01 port 3 / y7 / arduino pin A04 port 4 / x8 / arduino pin 07 port 5 / y5 / arduino pin 12 port 6 / x3 / arduino pin 02 port 7 / x5 / arduino pin 04 port 8 / y8 / arduino pin A05 */ void setup() { pinMode(A2,OUTPUT); //x1 pinMode(A3,OUTPUT); //x2 pinMode(2,OUTPUT); //x3 pinMode(3,OUTPUT); //x4 pinMode(4,OUTPUT); //x5 pinMode(5,OUTPUT); //x6 pinMode(6,OUTPUT); //x7 pinMode(7,OUTPUT); //x8 pinMode(8,OUTPUT); //y1 pinMode(9,OUTPUT); //y2 pinMode(10,OUTPUT); //y3 pinMode(11,OUTPUT); //y4 pinMode(12,OUTPUT); //y5 pinMode(13,OUTPUT); //y6 pinMode(A4,OUTPUT); //y7 pinMode(A5,OUTPUT); //y8 } void loop() { //pole svítí celé analogWrite(A2,255); analogWrite(A3,255); digitalWrite(2,1); digitalWrite(3,1); digitalWrite(4,1); digitalWrite(5,1); digitalWrite(6,1); digitalWrite(7,1); digitalWrite(8,0); digitalWrite(9,0); digitalWrite(10,0); digitalWrite(11,0); digitalWrite(12,0); digitalWrite(13,0); analogWrite(A4,0); analogWrite(A5,0); delay (2000); //pole nesvítí analogWrite(A2,0); analogWrite(A3,0); digitalWrite(2,0); digitalWrite(3,0); digitalWrite(4,0); digitalWrite(5,0); digitalWrite(6,0); digitalWrite(7,0); digitalWrite(8,1); digitalWrite(9,1); digitalWrite(10,1); digitalWrite(11,1); digitalWrite(12,1); digitalWrite(13,1); analogWrite(A4,255); analogWrite(A5,255); delay (2000); //jeden bod analogWrite(A2,255); analogWrite(A3,0); digitalWrite(2,0); digitalWrite(3,0); digitalWrite(4,0); digitalWrite(5,0); digitalWrite(6,0); digitalWrite(7,0); digitalWrite(8,0); digitalWrite(9,1); digitalWrite(10,1); digitalWrite(11,1); digitalWrite(12,1); digitalWrite(13,1); analogWrite(A4,255); analogWrite(A5,255); delay (2000); //řádka analogWrite(A2,255); analogWrite(A3,255); digitalWrite(2,1); digitalWrite(3,1); digitalWrite(4,1); digitalWrite(5,1); digitalWrite(6,1); digitalWrite(7,1); digitalWrite(8,0); digitalWrite(9,1); digitalWrite(10,1); digitalWrite(11,1); digitalWrite(12,1); digitalWrite(13,1); analogWrite(A4,255); analogWrite(A5,255); delay (2000); //sloupec analogWrite(A2,255); analogWrite(A3,0); digitalWrite(2,0); digitalWrite(3,0); digitalWrite(4,0); digitalWrite(5,0); digitalWrite(6,0); digitalWrite(7,0); digitalWrite(8,0); digitalWrite(9,0); digitalWrite(10,0); digitalWrite(11,0); digitalWrite(12,0); digitalWrite(13,0); analogWrite(A4,0); analogWrite(A5,0); delay (2000); } |
Tento program vám postupně rozsvítí celou plochu matrixu, poté ji zhasne, pak rozsvítí pouze jeden bod, pak řádek a nakonec sloupec. S takto jednoduchým programem jsou to veškeré kombinace, které můžete realizovat. V případě, že potřebujete rozsvítit určitý obrazec, který nezapadá do předchozího schématu je třeba jít na věc jinak.
Abych vše osvětlil půjčím si analogii ze světa filmu. Princip pohyblivých obrázků nám říká, že když sestavíme řadu statických obrázků za sebou, ve kterých jsou drobné změny, oko si nevšimne přechodů mezi obrázky a vyloží si to co vidí jako pohyb.
Na příkladu na obrázku vidíme právě takový jednoduchý „film“ z mnoha obrázků. Je zpomalený, aby se nám dobře vnímaly jednotlivé snímky. Stejného principu použijeme na promítnutí symbolu na náš LED matrix. Symbol budeme promítat po jednotlivých řádkách (podobný princip, jako má analogová televize) a budeme jednotlivé řádky zobrazovat tak rychle, že navenek bude výsledný obrázek vypadat zcela nehybný. Princip bude ještě pochopitelnější na následujícím obrázku.
Pokud to ani nyní není jasné, koukněte se na video a já pokračuji dál a přikládám druhý kód programu, kterým si všechno tohle můžete vyzkoušet.
/* Program pro zapojení pouhé desky LED Matrix Zapojení: strana LED Matrix 1 (s potiskem) port 1 / y4 / arduino pin 11 port 2 / y2 / arduino pin 09 port 3 / x7 / arduino pin 06 port 4 / x6 / arduino pin 05 port 5 / y1 / arduino pin 08 port 6 / x4 / arduino pin 03 port 7 / y3 / arduino pin 10 port 8 / y6 / arduino pin 13 strana LED Matrix 1 (bez potisku) port 1 / x1 / arduino pin 00 port 2 / x2 / arduino pin 01 port 3 / y7 / arduino pin A04 port 4 / x8 / arduino pin 07 port 5 / y5 / arduino pin 12 port 6 / x3 / arduino pin 02 port 7 / x5 / arduino pin 04 port 8 / y8 / arduino pin A05 */ int radek=1; //překreslovaný řádek int interval=2; //čas k překreslování fází void setup() { pinMode(A2,OUTPUT); //x1 pinMode(A3,OUTPUT); //x2 pinMode(2,OUTPUT); //x3 pinMode(3,OUTPUT); //x4 pinMode(4,OUTPUT); //x5 pinMode(5,OUTPUT); //x6 pinMode(6,OUTPUT); //x7 pinMode(7,OUTPUT); //x8 pinMode(8,OUTPUT); //y1 pinMode(9,OUTPUT); //y2 pinMode(10,OUTPUT); //y3 pinMode(11,OUTPUT); //y4 pinMode(12,OUTPUT); //y5 pinMode(13,OUTPUT); //y6 pinMode(A4,OUTPUT); //y7 pinMode(A5,OUTPUT); //y8 } void loop() { if (radek==1) //řádek 1 { //řádky analogWrite(A2,255); analogWrite(A3,0); digitalWrite(2,0); digitalWrite(3,0); digitalWrite(4,0); digitalWrite(5,0); digitalWrite(6,0); digitalWrite(7,0); //sloupce digitalWrite(8,0); digitalWrite(9,1); digitalWrite(10,1); digitalWrite(11,1); digitalWrite(12,1); digitalWrite(13,1); analogWrite(A4,255); analogWrite(A5,0); delay(interval); radek++; } if (radek==2) //řádek 2 { //řádky analogWrite(A2,0); analogWrite(A3,255); digitalWrite(2,0); digitalWrite(3,0); digitalWrite(4,0); digitalWrite(5,0); digitalWrite(6,0); digitalWrite(7,0); //sloupce digitalWrite(8,1); digitalWrite(9,0); digitalWrite(10,1); digitalWrite(11,1); digitalWrite(12,1); digitalWrite(13,1); analogWrite(A4,0); analogWrite(A5,255); delay(interval); radek++; } if (radek==3) //řádek 3 { //řádky analogWrite(A2,0); analogWrite(A3,0); digitalWrite(2,1); digitalWrite(3,0); digitalWrite(4,0); digitalWrite(5,0); digitalWrite(6,0); digitalWrite(7,0); //sloupce digitalWrite(8,1); digitalWrite(9,1); digitalWrite(10,0); digitalWrite(11,1); digitalWrite(12,1); digitalWrite(13,0); analogWrite(A4,255); analogWrite(A5,255); delay(interval); radek++; } if (radek==4) //řádek 4 { //řádky analogWrite(A2,0); analogWrite(A3,0); digitalWrite(2,0); digitalWrite(3,1); digitalWrite(4,0); digitalWrite(5,0); digitalWrite(6,0); digitalWrite(7,0); //sloupce digitalWrite(8,1); digitalWrite(9,1); digitalWrite(10,1); digitalWrite(11,0); digitalWrite(12,0); digitalWrite(13,1); analogWrite(A4,255); analogWrite(A5,255); delay(interval); radek++; } if (radek==5) //řádek 5 { //řádky analogWrite(A2,0); analogWrite(A3,0); digitalWrite(2,0); digitalWrite(3,0); digitalWrite(4,1); digitalWrite(5,0); digitalWrite(6,0); digitalWrite(7,0); //sloupce digitalWrite(8,1); digitalWrite(9,1); digitalWrite(10,1); digitalWrite(11,0); digitalWrite(12,0); digitalWrite(13,1); analogWrite(A4,255); analogWrite(A5,255); delay(interval); radek++; } if (radek==6) //řádek 6 { //řádky analogWrite(A2,0); analogWrite(A3,0); digitalWrite(2,0); digitalWrite(3,0); digitalWrite(4,0); digitalWrite(5,1); digitalWrite(6,0); digitalWrite(7,0); //sloupce digitalWrite(8,1); digitalWrite(9,1); digitalWrite(10,0); digitalWrite(11,1); digitalWrite(12,1); digitalWrite(13,0); analogWrite(A4,255); analogWrite(A5,255); delay(interval); radek++; } if (radek==7) //řádek 7 { //řádky analogWrite(A2,0); analogWrite(A3,0); digitalWrite(2,0); digitalWrite(3,0); digitalWrite(4,0); digitalWrite(5,0); digitalWrite(6,1); digitalWrite(7,0); //sloupce digitalWrite(8,1); digitalWrite(9,0); digitalWrite(10,1); digitalWrite(11,1); digitalWrite(12,1); digitalWrite(13,1); analogWrite(A4,0); analogWrite(A5,255); delay(interval); radek++; } if (radek==8) //řádek 8 { //řádky analogWrite(A2,0); analogWrite(A3,0); digitalWrite(2,0); digitalWrite(3,0); digitalWrite(4,0); digitalWrite(5,0); digitalWrite(6,0); digitalWrite(7,1); //sloupce digitalWrite(8,0); digitalWrite(9,1); digitalWrite(10,1); digitalWrite(11,1); digitalWrite(12,1); digitalWrite(13,1); analogWrite(A4,255); analogWrite(A5,0); delay(interval); radek=1; } } |
Popis programu: Program v první fázi ve void setup() uloží do desky požadované nastavení. void loop pak používáme jako smyčku, která donekonečna opakuje osm kombinací matrixu za sebou. Z kombinace na kombinaci přechází pomocí podmínkového příkazu, kdy po zobrazení jedné kombinace, přičte do proměnné radek +1 a v dalším průběhu cyklu se tak dostane na následující kombinaci matrixu. Při zobrazení kombinace odpovídající osmému řádku přechází celý cyklus zpátky na první kombinaci a vše se opakuje. Rychlost přechodů mezi kombinacemi určuje proměnná interval, kterou si v úvodu kódu můžete zkusit měnit. Pro nehybný obrázek je ideální hodnota 2 milisekundy mezi přechody. Interval je mezi přechody potřebný jednak, kvůli vybuzení LED diody.
Doufám, že se vám tato lekce líbila, kromě toho, jak programovat destičku LED matrixu jste se dozvěděli i něco málo o tom, jak funguje film, nebo jak stará televize promítala obraz po řádcích.
Úkol:
Naprogramujte na LED matrixu jiný obrazec.