Lekce 21
LED matice 8×8

Úvod

V předešlých lekcích jsme se seznámili se segmentovými LED zobrazovači. Viděli jsme, že jeho nabídka zobrazovaných symbolů byla však poměrně omezená. Nyní se podíváme na další typ zobrazovače, který by nám mohl umožnit zobrazit trochu více – například písmena celé abecedy nebo jednoduché obrázky. Součástkou, kterou budeme používat, je LED matnice o rozměrech 8×8. Maticové LED zobrazovače mohou uspokojit potřeby různých aplikací. Je to především díky jejich dlouhé životnosti, relativně nízkým nákladům na nákup i provoz, vysokému jasu, ale třeba i určité „nepromokavosti“. Zkrátka tyto zobrazovače mají širokou perspektivu rozvoje.

Použité komponenty

  • modul Arduino
  • USB kabel
  • LED matice 8×8
  • 8× rezistor (220 Ω)
  • nepájivé pole
  • vodiče pro nepájivé pole + vodiče typy „samec-samice“

Princip

LED matice 8×8 se skládá z 64 LED, kde každá LED je umístěna na průsečíku řádku a sloupce. Když je elektrická úroveň určité řady vysoká a elektrická úroveň určitého sloupce nízká, pak se LED, která je jejich průsečíkem, rozsvítí. Chceme-li rozsvítit LED na první pozici, měli bychom nastavit řádek 1 na vysokou úroveň (HIGH) a sloupec 1 na nízkou úroveň (LOW). Chceme-li rozsvítit LED na prvním řádku, měli bychom nastavit řádek 1 na vysokou úroveň (HIGH) a sloupce (1, 2, 3, 4, 5, 6, 7, 8) na nízkou úroveň (LOW). Jedině tak se všechny LED diody na prvním řádku rozsvítí.

8x8 LED matice - princip

Základním principem při použití LED zobrazovačů je jejich postupné rozsvěcení po řádcích řádků. Již víme, že vývody LED matice tvoří anodovou a katodovou skupinu. Data tvořící budoucí obrázek (snímek) jsou postupně přiváděna na jednotlivé anody, kdy vždy jedna z katod je na nízké úrovni. Tím se rozsvítí první řádek. Následuje obdobné rozsvícení druhého řádku, pak třetího… Postupným vysvícením všech dat na všech katodách dojde k vytvoření tzv. snímku. Princip je obdobný s funkcí obrazovky televize nebo monitoru. Snímková frekvence, tedy počet zobrazených snímků za sekundu, musí být tak vysoká, aby nepůsobila rušivě na lidské oko. V praxi se používají frekvence od stovek hertzů do jednotek nebo desítek kilohertzů. Neustálé rozsvěcení snímků je poměrně náročná záležitost, jejíž složitost stoupá s počtem prvků matice. Pro matici 8×8 LED (bodů) je zapotřebí 8 bitů pro řízení anodové a dalších 8 bitů pro řízení katodové skupiny. Tímto je zařízeno ovládání pouhých 64 bodů. Přirozeným řešením tohoto problému je využití jednočipového mikropočítače (například Arduino) s dostatečnou kapacitou vstupních a výstupních pinů a výpočetním výkonem.

Než se pustíme do zapojování obvodu, je třeba se podívat na rozložení pinů s ohledem na číslování řádků (R) a sloupců (C) Rozložení pinů na maticovém displeji versus významy jednotlivých pinů (sloupec/řádek) ukazuje následující tabulka.

sloupec (C_) č. pinu
1 13
2 3
3 4
4 10
5 6
6 11
7 15
8 16

řádek (R_) č. pinu
1 9
2 14
3 8
4 12
5 1
6 7
7 2
8 5

8x8 LED matice - pinout

POZOR, uvedený popis platí pouze pro maticový LED displej, jehož číslo modelu končí BS!


Postup experimentu

Krok 1: Sestavíme si obvod podle následujícího obrázku nebo schématu.

Blokové schéma

Blokove schema

Elektronické schéma

Elektronicke schema
LED matice
8×8
modul
Arduino
způsob
propojení
1 9 přímo
2 8 přímo
3 7 přes rezistor
4 6 přes rezistor
5 5 přímo
6 4 přes rezistor
7 3 přímo
8 2 přímo
9 10 přímo
10 11 přes rezistor
11 12 přes rezistor
12 13 přímo
13 A0 přes rezistor
14 A1 přímo
15 A2 přes rezistor
16 A3 přes rezistor

Krok 2: V prostředí mBlock vytvoříme následující program. I v tomto programu je několik podprogramů a proto začneme nejdříve s nimi, hlavní program vznikne až na závěr.

podprogram v prostredi mBlock

podprogram v prostredi mBlock
program v prostredi mBlock

Celý program včetně podprogramu lze stáhnout z:
http://mBlock.fyzika.net/zdrojove-kody/lekce-21/21-8x8-LED-matice.mblock.


ikona vysvetleni Vysvětlení kódu

Nejdříve si vysvětlíme funkci hlavního programu, kde se odkážeme na pomocné podprogramy, u kterých si řekneme, co dělají, ale jejich kód si podrobněji rozebereme později. Určitou „novinkou“ tohoto programu jsou hnědé programové bloky, které nám poskytlo rozšíření Maxi Starter kit. Jedná se o proměnné typu pole. Pod jedním názvem se vlastně skrývá několik proměnných, které se vzájemně jen odlišují svým indexem. Na samém začátku musíme proměnné typu pole definovat (tzv. deklarovat). Je třeba nastavit typ ukládaných hodnot (lze nastavit číslo nebo text), dále je pak třeba zadat rozsah (počet položek pole). A jelikož v programu takových polí můžeme použít několik, je třeba pro pole zvolit identifikační číslo. V tomto programu bude pole jen jedno, tak bude mít číslo 1. Každá položka našeho takto deklarovaného číselného pole bude odpovídat jedné řádce, která se zobrazí na LED matnici. Ukažme si na následující tabulce, jak tyto hodnoty získáme pomocí dvojkové soustavy.

128 64 32 16 8 4 2 1  výpočet   SOUČET 
0+0+0+0+0+0+0+0 0
0+64+32+0+0+4+2+0 102
 128+64+32+16+8+4+2+1  255
 128+64+32+16+8+4+2+1  255
0+64+32+16+8+4+2+0 126
0+0+32+16+8+4+0+0 60
0+0+0+16+8+0+0+0 24
0+0+0+0+0+0+0+0 0

V části 8×8 jsme si vykreslili znak, který budeme chtít zobrazit – třeba srdíčko. Každé políčko této části tabulky odpovídá jedné LED ze zobrazovací matice. V daném řádku tabulky dané LED odpovídá bit, který bude určovat, zda má být daná LED rozsvícena (bit bude mít hodnotu vysoké úrovně HIGH), nebo zda má být zhasnuta (bit bude nízké úrovně LOW). Osmice těchto řádkových bitů tvoří jeden byte, který může nabývat hodnoty 0–255. Hodnoty pro rozsvícení zadané kombinace získáme tak, že bity nízké úrovně nepočítáme (mají pro nás hodnotu 0) a bity vysoké úrovně budeme sčítat dle jejich „váhy“ je uvedena nahoře v tabulce). Například v druhém řádku mají být rozsvíceny LED určené bity váhy 64, 32, 4 a 2. Celková hodnota součtu je 102. Podle této hodnoty pak budou nastaveny digitální výstupy modulu Arduino ve chvíli, kdy budeme potřebovat rozsvítit druhý řádek (viz princip ovládání LED matice). Jakmile bude osmice proměnných pole nastavena na zadané hodnoty odpovídající znaku určenému k vykreslení, je zavolán podprogram „drawScreen“, který se postará o vykreslení obrázku na LED matici.

Aby se na LED matici postupně zobrazovaly znaky se vteřinovými intervaly a se vteřinovými prodlevami, opět se pracuje s interním časovačem modulu Arduino. Na začátku je hodnota časovače vynulována, pak následuje kaskáda asi dvaceti dvou vzájemně vnořených podmínek. Každá z podmínek testuje hodnotu časovače. Jakmile hodnota časovače odpovídá zadanému času 1, 3, 5, …, 21 je zobrazen zadaný znak. Pokud je hodnota 2, 4, 6, …, 22 je oblast kódu dané podmínky prázdná, to znamená, že se nic zobrazovat nebude – LED matice bude na tuto vteřinu zhasnutá.

Protože je třeba LED matici neustále řádkově rozsvěcovat, je nutné, aby se znaky rozsvěcovaly během celé vteřiny. Z tohoto důvodu nejsou podmínky vytvořeny jako rovnost konkrétního času, ale jako nerovnost, tedy je znak vždy vykreslován, dokud časovač nepřekročí následující hodnotu pro zobrazení dalšího znaku. Při proběhnutí celého nápisu 23 vteřin, dojde k vynulování hodnoty časovače (poslední podmínka) a díky nekonečné smyčce „opakuj stále“ hlavního programu se vše opakuje znova od začátku.

Zobrazení zadaného symbolu na LED matici zajišťuje podprogram „drawScreen“, který se stará o řádkové zobrazení. Vždy vezme výstupní hodnotu pro první, druhý, …, osmý řádek, která je uložená v proměnné pole – první položka pro 1. řádek, druhá pro 2. … atd. Samotné nastavení digitálních výstupů pro daný řádek vykonává podprogram „setColumns“, který je pro každý řádek volán podprogramem „drawScreen“.

Úkolem podprogramu „setColumns“ je rozložení vstupního čísla (předané vstupním parametrem b) na jednotlivé bity a dle jejich hodnoty (HIGH/LOW) nastavení digitálních výstupů modulu daných LED. Pro získávání hodnot jednotlivých bitů čísla se používá jednoduchý trik. Zadané číslo celočíselně děleno dvěma a je testován zbytek po tomto dělení. Pokud je zbytek 1, má být LED rozsvícena, pokud je zbytek 0, bude zhasnuta. Ukážeme si to na dříve uvedené hodnotě 102, která odpovídá horní části srdíčka (viz tabulka dříve).

Číslo 102 celočíselně vydělíme 2, získáme 51. Zbytek po tomto dělení je 0, tedy první LED zprava svítit nebude. Po dalším celočíselném vydělení získáme 25 se zbytkem 1 – druhá LED zprava bude svítit. Po dělení 25 je zbytek 1 – třetí LED svítí. Naopak další dělení mají zbytky 0, 0, a 1. Výsledná binární podoba čísla 102 bude 01100110. Jedničky odpovídají rozsvícení LED. A teď se podívejme do tabulky dříve, jaká konfigurace LED tam odpovídá hodnotě 102.

Když se podíváme na kód podprogramu „setColumns“, tak přesně dělá totéž, co jsme si zde podepsali. Proměnná b je postupně osmkrát celočíselně vydělena dvěma a podmínkami je testován zbytek po tomto dělení. Dle zbytku jsou nastavovány digitální výstupu modulu Arduino. Je třeba jen zdůraznit, že první zbytek po dělení dvěma říká, zda má být rozsvícena první LED bráno zprava doleva.


Při pohledu zejména na část hlavního programu se určitě opět otevírá možnost nějaké optimalizace kódu nebo dokonce celkového algoritmu. Ale to je již prostor pro samostatné zkoumání.


Krok 3: Zkompilujeme kód a nahrajeme do modulu Arduino tlačítkem tlacitko nahrat.

Krok 4: Po spuštění programu bychom měli vidět na LED matici postupné rozsvěcení (po jednotlivých znacích a se vteřinovými prodlevami) nápisu „LASK♥RDUINO“.

Pohled na experiment