FUNDUINO: Řízení LED segmentovek v mBlock
V článku mBlock (ver. 5), Arduino a Multi-Function Shield (Funduino) jsme se mimo jiného zabývali ovládáním čtveřice LED segmentovek. Využívali jsme k tomu rozšíření třetí strany, které doplňovalo prostředí mBlock o nové příkazové bloky speciálně vyvinutí pro MF Shield Funduino. V podstatě máme na výběr dvě rozšíření, která se na první pohled liší pouze v barvě bloků a jazykové lokalizaci. První rozšíření je od vývojáře „angel254“ (anglická lokalizace), druhé od vývojáře „engcarlosmac“ (angličtina s náznaky portugalštiny).
Určitou třetí možností je rozšíření zaměřené pouze na ovládání LED segmentovek MF Shieldu Funduino, a to rozšíření Funduino LED Segment
od vývojářů „64738“. Oproti předchozím dvěma rozšířením toto rozšíření nevyužívá přerušení časovače, a proto je třeba LED segmentovky stále „refrešovat“ v hlavní smyčce. Takže je třeba ovládat LED segmentovky podobně jako jsme si ukazovali v článku Testujeme Arduino Multi-function Shield (Funduino) v prostředí Arduino IDE. Výhodou tohoto, na první pohled trochu nevýhodného řešení, je možnost využívat služeb časovače Timer1 modulu Arduino. Bohužel na časovači Timer1 je v originálních službách modulu Arduino zavěšeno ovládání PWM výstupů pinů 9 a 10 a také rozšiřujících příkazů pro ovládání serva. Takže pokud bychom použili první dvě zmíněná rozšíření, nelze je s PWM na pinech 9 a 10, stejně tak s ovládáním serva, počítat.
Dnes ale zkusíme opustit svět jakýchkoliv rozšíření včetně jejich výhod i případných pastí, a zkusíme si vytvořit program, který bude na MF Shieldu Funduino ovládat LED segmentovky pouze pomocí základních příkazů. Bude to také trošku RAW řešení!
Pro začátek si trochu zopakujeme to, co o LED segmentovkách na MF Shieldu Funduino víme.
Multi-function Shield Funduino je osazen čtveřicí LED segmentovými zobrazovači, které jsou řízeny dvojicí obvodů 74HC595. Jedná se o posuvné registry, kde do jednoho se sériově načte stav rozsvícení/zhasnutí jednotlivých segmentů daného LED zobrazovače, do druhého pak třeba zadat obdobným způsobem adresu zvoleného zobrazovače, který danou konfiguraci má zobrazit.
Zápis do registrů probíhá následujícím způsobem:
- Zahájí se nastavením výstupního pinu 4 do stavu
LOW
. Tím je registrům dáno na vědomí, že bude následovat zápis dat. Na výstupech registrů je stále předchozí hodnota. - Na datový vstup prvního registru (pin 8) je nastaven první bit (
/HIGH
LOW
) přenášené hodnot. Zápis probíhá v tzv. režimuMSBFIRST
, což znamená, že bit s nejvyšší hodnotou v binárním vyjádření čísla (Most Significant Bit) je odesílán jako první. - K zápisu sériového data na vstupu dochází až po sestupné hraně (
→HIGH
LOW
) hodinového signálu (pin 7). - Následuje nastavení dalšího bitu odesílané hodnoty a další hodinový signál.
- První osmice bitů volí rozsvícení LED segmentovky (POZOR:
LOW
znamená rozsvítit,
zhasnout).HIGH
- Po odeslání první osmice bitů představující konfiguraci rozsvícení následuje odeslání adresy segmentovky, pro kterou byla data odeslána.
- V druhé osmici (volba adresy zobrazovače) nás při režimu zápisu
MSBFIRST
zajímají jen poslední 4 bity daného byte. Místo prvních (nejvyšších) čtyř bitů můžeme odeslat cokoliv, například samé hodnotyLOW
. - Zbylé nejnižší čtyři bity jsou pro nás důležité, neboť odpovídají adresám jednotlivých LED segmentovek. Při zápisu v režimu
MSBFIRST
budou celé adresy odpovídat následujícím způsobem: první (bráno zleva):00000001
, druhá00000010
, třetí00000100
a čtvrtá00001000
. Tyto hodnoty je třeba po jednotlivých bitech natavit (pin 8) na vstup posubných registrů a zapsat pomocí „tiků“ hodinového signálu (pin 7). - Zápis vstupů se ukončí a potvrdí nastavením výstupního pinu 4 do stavu
. Tím také dojde ke zrušení hodnoty na výstupech registrů 74HC595 a k její aktualizaci dle dat zadaných na přes sériový vstup.HIGH
Následující obrázek zachycuje, jak odpovídají jednotlivé LED v zobrazovači bitům v bytu registru:
Jelikož základní příkazové bloky prostředí mBlock nedisponují příkazy pro ovládání posuvných registrů, budeme si muset celý proces (dle předchozích 9 bodů) vytvořit ze základních příkazů.
Pochopitelně si celý zápis na LED segmentovky rozdělíme do podprogramů, které budou obsahovat části, které se při procesu zápisu dat do posuvných registrů opakují. Snaha je pochopitelně o co nejuniverzálnější výsledný kód, zby jej bylo možné využívat ve dalších projektech, ať již budeme tvořit cokoliv.
Asi prvním úkolem, který se neustále opakuje, je generování hodinového signálu na pinu 7 (potřebný pro zápis dat do sériového vstupu registru). Tento podprogram nazveme kupříkladu KLIK
a nebude mít žádné vstupní parametru. Jeho jedním úkolem bude nastavit pin 7 na hodnotu
, pak HIGH
LOW
. Tím se vytvoří tolik potřebná sestupná hrana.
Obdobně si můžeme připravit podprogram, který na pin 8 (sériová vstup posuvného registru) nastaví zadaný bit odesílaného čísla. Podprogram se jmenuje LED
a má vstupní číselný parametr bit, který bude odpovídat rozsvícení jednotlivé LED v segmentovce.
V těle podprogramu vidíme podmínku, která podle hodnoty vstupního parametru bit nastavuje na pin 8 buď hodnotu
nebo HIGH
LOW
. Všimněme si, že pokud má být daná LED rozsvícena, tedy je vstupní parametr bit podprogramu je 1, je na pin 8 odeslána hodnota LOW
, která fyzicky rozsvítí zadanou LED. Zároveň si všimněme, že odeslání daného bity je potvrzeno předchozím podprogramem KLIK
.
Následující podprogram nazvaný SEGMENTOVKA
je již jakýmsi uživatelsky použitelným příkazovým blokem. Osmice jeho vstupních parametrů určuje, která LED z dané segmentovky bude rozsvícena (segmenty a–g
a desetinná tečka dp
). Poslední parametr pojmenovaný poradi
(za označením ADR.:) určuje, pořadí (adresu) segmentovky (bráno zleva doprava).
Podprogram na svém úvodu nastaví piny 4 (
), 7 (HIGH
LOW
) a 8 (LOW
) do výchozího postavení. Pak přepnutím pinu 4 do stavu LOW
zahájí sériový zápis do posuvných registrů. Po pauze asi 1 ms následuje nastavování jednotlivých bitů, které určují rozsvícení LED segmentů. Jako první je odesílaná informace o desetinné tečce, neboť její hodnota je uložena v nejvyšším bitu a odesíláme metodou MSB_FIRST. Odeslání daného bitu zařizuje podprogram LED s pomocí podprogramu KLIK
.
Po odeslání dat pro rozsvícení LED segmentů g–a
následuje odeslání adresy LED segmentovky, pro kterou jsou data určená. Říkali jsme si, že čtveřice nejvyšších adresových bitů není důležitá (a budeme je nastavovat na hodnotu LOW
), proto je nastaven na pinu 8 (data) stav LOW
. Následně proběhne cyklus jehož důsledkem je čtveřice hodinových signálů na pinu 7. Tím dojde k zápisu nejvyšší čtveřice adresních bitů. Následující bity již nelze zapsat takto paušálně a je třeba jejich konfiguraci nastavit podle vstupního parametru poradi
.
Pro zápis platného bitu adresy slouží další cyklus. Pro jeho běh je stanovena pomocná proměnná bit, která je nastavena na hodnotu 4. Tato proměnná se postupně při každém průběhu zmenšuje o 1, takže nabývá hodnoty 4, 3, 2 a 1. Přesně jako adresy segmentovek, pro které by předešlá data mohla být určena. Jsou-li data odeslána na čtvrtou LED segmentovku (adresa xxxx1000
) je vstupní proměnná poradi
rovna 4, stejně jako pomocná proměnná bit v okamžiku zápisu 5. bitu. Stejně je tomu v případě 3. segmentovky atd. Takže pokud se pomocná proměnná bit rovná adrese LED segmentovky (proměnná poradi
) je třeba zapsat na výstup hodnotu
, jinak je zapisována hodnota HIGH
LOW
. Přesně toto je účel podmínky v posledním cyklu podprogramu SEGMENTOVKA
.
Na samý závěr podprogramu následuje zápis hodnoty
na pin 4, čímž se právě zapsaná data prokopírují na výstup posuvných registrů 74HC595.HIGH
Použití výše uvedeného podprogramu SEGMENTOVKA
si můžeme ukázat na jednoduchém programu, který vypíše na LED zobrazovače modulu MF Shieldu Funduino nápis „AHOJ“.
Konfigurace odpovídající LED segmentovce adresy 1 (první zleva) odpovídá následujícím způsobem:
Jelikož je rozsvěcení všech čtyř LED segmentovek zprostředkováno jedinou dvojicí postupných registrů, svítí vždy jen ta, která byla právě adresována. Proto je třeba tyto zobrazovače neustále obnovovat a to tak rychle, aby lidské oko nezpozorovalo postupné přeblikávání. Z tohoto důvodu je nastavení zobrazených písmen A, H, O, J vloženo do nekonečné smyčky, která zařídí to, že tyto znaky jsou neustále na LED segmentovky zapisovány.
Celý program: