LED Matrix – jak funguje pole LED diod – matrix

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.

Základní rozložení pinů matrixu

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

Schéma zapojení obvodu arduina s polem LED matrix

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í.

Princip rozsvícení jednotlivé LED diody v matrixu

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.

animovaný obrázek jezdce a koně. Zkuste odlišit jednotlivé snímky

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.

Programy z článku ke stažení

První program z článku

Druhý program z článku

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.