Fyzikální kabinet FyzKAB
Články Prostředí mBlock + modul Arduino MFS Funduino a mBlock FUNDUINO: Řízení LED segmentovek v mBlock

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:

  1. 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.
  2. 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žimu MSBFIRST, což znamená, že bit s nejvyšší hodnotou v binárním vyjádření čísla (Most Significant Bit) je odesílán jako první.
  3. K zápisu sériového data na vstupu dochází až po sestupné hraně (HIGHLOW) hodinového signálu (pin 7).
  4. Následuje nastavení dalšího bitu odesílané hodnoty a další hodinový signál.
  5. První osmice bitů volí rozsvícení LED segmentovky (POZOR: LOW znamená rozsvítit, HIGH zhasnout).
  6. Po odeslání první osmice bitů představující konfiguraci rozsvícení následuje odeslání adresy segmentovky, pro kterou byla data odeslána.
  7. 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é hodnoty LOW.
  8. 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).
  9. Zápis vstupů se ukončí a potvrdí nastavením výstupního pinu 4 do stavu HIGH. 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.

Následující obrázek zachycuje, jak odpovídají jednotlivé LED v zobrazovači bitům v bytu registru:

segmentovka -  bity

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 HIGH, pak LOW. Tím se vytvoří tolik potřebná sestupná hrana.

podprogram KLIK

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.

podprogram LED

V těle podprogramu vidíme podmínku, která podle hodnoty vstupního parametru bit nastavuje na pin 8 buď hodnotu HIGH nebo 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 SEGMENTOVKA

Podprogram na svém úvodu nastaví piny 4 (HIGH), 7 (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 HIGH, jinak je zapisována hodnota 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 HIGH na pin 4, čímž se právě zapsaná data prokopírují na výstup posuvných registrů 74HC595.

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

hlavní program

Konfigurace odpovídající LED segmentovce adresy 1 (první zleva) odpovídá následujícím způsobem:

LED-Display

hlavicka podprogramu

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.

pohled na Funduino

Celý program:

UPOZORNĚNÍ:
Nesouhlasíme s vyřazením Newtonových zákonů, Ohmova zákona a zákona zachování energie z učiva fyziky základních škol v České republice!