Tento díl navazuje na mé předchozí lekce o tom jak si sestavit ze stavebnice součástku LED matrix (článek Vytvoř si sám LED Matrix) a na článek kdy jsme se naučili, jak vlastně pracuje deska LED matrixu (článek LED Matrix – jak funguje pole LED diod – matrix).
Práce se samotnou deskou LED matrixu je dosti komplikovaná. Velký počet vodičů nutných pro připojení desky k arduinu, velké množství IO pinů arduina, které je tak obsazeno pouhou komunikací s destičkou matrixu, komplikované programování zobrazení kombinací na desce (to abych tak jmenoval to, co se přímo nabízí). Tyto komplikace lze ale poměrně jednoduše vyřídit a na to se zaměříme v této lekci.
Řešení problému s piny a velkým počtem kablíků pro připojení k arduinu
Počet vodičů a pinů potřebných pro to, abychom zprovoznili samotnou desku LED matrixu snížíme tím, že použijeme desku v kombinaci s řadičem MAX7219 (to je ta černá součástka v patici na desce). Řadič dokáže s arduinem komunikovat v protokolu SPI po třech vodičích, což je významné snížení oproti předchozím 16 kablíkům. Protokol SPI také umožňuje po těchto třech kablících komunikovat s větším počtem modulů matrixu, což nám zase umožňuje sestavovat větší pole a pracovat tak s rozsáhlejší sestavou LED matrixu, než jen s polem 8×8 LED diod. Z tohoto důvodu jsou na destičce modulu piny z obou stran – modul je jakýmsi „průchoďákem“ a jaká kombinace bude na té, které destičce rozsvícena určíme až programem v desce arduina.
Zapojení LED matrix
Modul LED matrix připojujeme k desce arduina pěti kablíky. Dva z nich obstarávají napájení modulu (VCC a GND) a tři obstarávají komunikaci mezi deskou arduina a modulem (DIN, CS, CLK). Jednotlivé výstupy bývají popsány potiskem na destičce s plošným spojem.
Kablíky pro napájení se připojují napevno na arduino – 5V (propojení na modul VCC) a arduino GND – (propojení na modul GND). Trochu jiná situace je s kablíky určenými pro komunikaci. Na obrázku jsou připojeny na piny 10 – 12 a skutečně to odpovídá následujícímu kódu pro demonstraci. Připojit je ale lze na kterýkoliv z pinů (s výjimkou pinů určených pro sériovou komunikaci 0 – 1), jen je potřeba připojení poté nastavit v kódu podle reality při inicializaci programu.
Knihovny v arduinu
Pro ovládání programů, kterými se pracuje s různými moduly, které lze připojit k arduinu, bychom v praxi potřebovali strašně moc hodně složitého kódu. Naše prográmky by se staly velmi rozsáhlými a dosti náročnými na naprogramování pro nás začínající programátory. Proto pro práci s různými moduly používáme knihovny.
Pokud si program, který naprogramujeme, představíme jako turistu, který se chystá na výlet, knihovnu bychom si mohli při této analogii představit jako batoh, který tento turista nese sebou na zádech. V batohu si sebou nese všechno co bude na výpravě potřebovat. Bez batohu se pohybuje lehce, protože není tak těžký, ale zase nemá na své cestě všechno, co by potřeboval. Do batohu si také nenacpe všechno co má doma k dispozici, protože batoh není nafukovací (a to by také rovnou mohl na zádech nést celý dům že..). Někdy, když jde daleko si vezme náš turista na záda kromě batohu ještě chlebník a několik dalších tašek (knihoven).
A přesně tak, jak jsem napsal knihovny fungují. Je to zkrátka další program, který propojíme s naším programem (většinou na začátku kódu) a který přidává k našemu kódu řadu dalších funkcí, které pak z hlavního programu můžeme zavolat a využít (když víme jak).
Knihovny jsou statické – ty které jsou k dispozici za všech okolností přímo v hlavním programu bez nutnosti přidávat je nějak speciálně v kódu k našemu programu (například knihovna Serial obhospodařující sériovou komunikaci arduina). Představme si tyto knihovny třeba jako obsah kapes, které máme vždy po ruce.
A nebo můžeme také využít knihovny dynamické – ty které musíme v kódu přidat příkazem include, aby je výsledný program zahrnul do souboru, který zkompilujeme a odešleme na desku arduina. To je přesně ta obdoba batohu, který si můžeme, ale také nemusíme, vzít na výlet.
Některé knihovny jsou přímo součásti programu arduina IDE a můžete se k nim třeba dostat přes příklady/examples, které jsou dobré i v tom, že vám přímo ukáží v kódu, jak tuto knihovnu využívat. Některé knihovny jsou umístěné externě na webu a lze je stáhnout (Projekt > Přidat knihovnu) a doplnit ve formě jakéhosi „pluginu“ do programu arduino a pak je můžete přímo odkazovat v kódu a zpravidla je pak i naleznete v příkladech. Pokud byste hledali knihovnu přímo v programu a prolézali kvůli tomu složky programu arduino, tak je můžete nalézt přímo ve složce libraries. A samozřejmě můžete knihovny nalézt i přímo ve složkách kam je stáhnete.
Programování LED matrix
Pro programování spolupráce desky arduina a LED matrix budeme využívat knihovnu LEDControl.h, příklad použití si můžete vytáhnout z příkladů v arduino IDE – Příklady > LEDControl > LCDDemoMatrix. Celý kód je velmi dlouhý na náš webík a proto se jej pokusím shrnout a zkrátit.
Příkazy v knihovně LedControl.h
#include „LedControl.h“ – příkaz naleznete na začátku kódu. Říkáte v něm programu, že se budou používat i příkazy z této knihovny a proto by jí měl připojit k programu, který bude odesílat na desku Arduina.
LedControl lc=LedControl(12,11,10,1); – Inicializace desky pro program knihovny. Funkce lc bude provozována na na pinech 12,11,10 a bude provozována na jednom matrixu. Parametry v závorce se mohou měnit.
lc.shutdown(0,false); – Zapnutí pole matrixu o indexu 0 (polí můžeme připojit více a každé má svůj index)
lc.setIntensity(0,8); – Nastavení intenzity jasu matrixu. První hodnota je index matrixu, kterého se nastavení týká, druhá hodnota je intenzita. Může nabýt hodnot 0 – 9.
lc.clearDisplay(0); – Vymazání displeje indexu 0.
lc.setLed(0,0,0,true); – Rozsvítí bod na matrixu o indexu 0 na pozicích řádek 0 a sloupec 0. Příkaz true bod zhasne, přkaz false rozsvítí.
lc.setRow(0,0,B11111111); – Rozsvítí body na řádku matrixu o indexu 0 na řádku 0. Body je možné ovládat každý zvlášť v sekvenci B00000000 (nula je zhasnutý bod, jednička bod rozsvícený.
lc.setColumn(0,0,B11111111); – Obdobná funkce jako lc.setRow, ale pro sloupec.
Popis programu matrix
V programu matrix, který je na konci lekce celý ke stažení je demonstrace základních příkazů pro ovládání matrixu, které se nabízí v knihovně LedControl.h, Kód je sice komentovaný, ale pro pořádek jej zde ještě postupně popíši.
include „LedControl.h“ //vložení knihovny – pokud cheme používat příkazy z této knihovny nesmí chybět /* Připojení matrixu a arduina pin 12 připojen k DataIn pin 11 připojen k CLK pin 10 připojen k LOAD */ LedControl lc=LedControl(12,11,10,1); //inicializace desky /* přepínání mezi jednotlivými kombinacemi */ unsigned long delaytime=1000; // proměnná pro stanovéní délky přepnutí mezi sekvencemi. void setup() { lc.shutdown(0,false); //zapnutí matrixu o indexu 0 lc.setIntensity(0,1); //nastavení intenzity matrixu o indexu 0, intenzita 0-9 lc.clearDisplay(0); //vymazání displeje matrixu o indexu 0 } |
V úvodní sekvenci programu připravujeme arduino pro práci s matrixem. Jako první propojíme program s knihovnou (include). Následuje inicializace desky – určíme, na kterých pinech je deska připojena a kolik matrixů budeme kódem obsluhovat. V jednom objektu lc může být maximálně 8 matrixů.
Deklarujeme proměnnou delaytime a vložíme do ní hodnotu 1000. Tato proměnná nám určuje interval mezi zobrazeními v následujícím kódu.
Ve voidu setup demonstruji zapnutí matrixu (lc.shutdown), nastavení intenzity světla (lc.setIntensity) a vymazání obsahu displeje (lc.clearDisplay)
void pointsOnMatrix() { /void který zobrazuje bod na různých pozicích setLed – zobraz bod první číslo – index matrixu druhé číslo – řádek bodu (0-7) třetí číslo – sloupec bodu (0-7) false/true – zhasnutí, nebo rozsvícení kombinace/ lc.setLed(0,0,0,true); lc.setLed(0,7,0,false); lc.setLed(0,7,7,false); lc.setLed(0,0,7,false); delay(delaytime); lc.setLed(0,0,0,false); lc.setLed(0,7,0,true); lc.setLed(0,7,7,false); lc.setLed(0,0,7,false); delay(delaytime); lc.setLed(0,0,0,false); lc.setLed(0,7,0,false); lc.setLed(0,7,7,true); lc.setLed(0,0,7,false); delay(delaytime); lc.setLed(0,0,0,false); lc.setLed(0,7,0,false); lc.setLed(0,7,7,false); lc.setLed(0,0,7,true); delay(delaytime); } |
Void pointsOnMatrix předvádí práci s jednotlivými body. Postupně rozsvěcí rohové LED na matrixu (viz střídání false/true).
void rowsOnMatrix() { /*void zobrazující kombinaci bodů na řádku setRow – zobraz body na řádku první číslo – index matrixu druhé číslo – číslo řádku (0-7) třetí parametr – sekvence B + osm číslic 0/1 – 1 rozsvícení bodu v řádku, 0 zhasnutí bodu v řádku */ lc.setRow(0,0,B11111111); delay(delaytime); lc.setRow(0,0,B00000000); delay(delaytime); lc.setRow(0,2,B11111111); delay(delaytime); lc.setRow(0,2,B00000000); delay(delaytime); } void columnsOnMatrix() { /*void zobrazující kombinaci bodů ve sloupci setColumn – zobraz body ve sloupci první číslo – index matrixu druhé číslo – číslo sloupce (0-7) třetí parametr – sekvence B + osm číslic 0/1 – 1 rozsvícení bodu ve sloupci, 0 zhasnutí bodu ve sloupci */ lc.setColumn(0,0,B11111111); delay(delaytime); lc.setColumn(0,0,B00000000); delay(delaytime); lc.setColumn(0,2,B11111111); delay(delaytime); lc.setColumn(0,2,B00000000); delay(delaytime); } |
Voidy rowsOnMatrix a columnsOnMatrix demonstrují práci s rozsvěcením LED diod na celém řádku, nebo sloupci. Práce s těmito příkazy je dost podobná a proto je ukazuji společně. Oba příkazy jsem popsal v příkazech z knihovny výše.
void symbolOnMatrix() { /*void zobrazující kombinaci bodů ve více řádcích příklad použití při zobrazování symbolů rozsvícení symbolu hvězdičky */ lc.setRow(0,0,B00010000); lc.setRow(0,1,B01010100); lc.setRow(0,2,B00111000); lc.setRow(0,3,B11111110); lc.setRow(0,4,B00111000); lc.setRow(0,5,B01010100); lc.setRow(0,6,B00010000); lc.setRow(0,7,B00000000); delay(delaytime); lc.clearDisplay(0); delay(delaytime); } |
void symbolOnMatrix je příkladem použití příkazu setRow() při zobrazení symbolu. Na každém řádku je postupně od 0 – 7 je zobrazována sekvence rozsvícených LED, které dohromady vytvoří na matrixu požadovaný symbol (v tomto případě hvězdičku). Po zobrazení hvězdičky v intervalu daném proměnnou delaytime symbol zhasneme a opět rozsvítíme.
void loop() { //pointsOnMatrix(); //rowsOnMatrix(); //columnsOnMatrix(); symbolOnMatrix(); } |
V závěrečném voidu loop postupně projíždíme cyklicky celý program ve kterém postupně spouštíme všechny ostatní voidy. V publikované verzi je aktivní pouze void zobrazující symbol. V případě, že jste zvědaví na další voidy zrušte prosím zakomentování řádku a pošlete opravený kód do desky arduina.
Úkol:
Naprogramujte na LED matrixu jiný obrazec pomocí příkazů z knihovny LedControl.h.
Pingback: LED Matrix pro arduino pokročileji – ondranauci.cz
Если у вашей LED-матрицы нет маркировки, то определить выводы 1 и 16 можно с помощью мультиметра. Включите его в режим прозвонки диодов и приставьте щупы к крайним выводам в разных комбинациях. Одна из комбинаций включит светодиод (5 ряд, 8 столбец). Красный щуп укажет на первый вывод, чёрный – на 16.
Спасибо за совет. Мой сайт в основном предназначен для детей из кружков робототехники. Поэтому я стараюсь быть простым.