Lekce 22
Řízení LED zobrazovače pomocí 74HC595

Úvod

Opět se vrátíme k sedmisegmentovému LED zobrazovači, se kterým jsme pracovali jedné z minulých lekcí, kde jsme si ukázali, jak tento zobrazovač řídit pomocí modulu Arduino – zatím „holým“ způsobem bez jakýchkoliv speciálních obvodů. Viděli jsme, že modulem Arduino musíme řídit osm zobrazovacích LED (sedm pro zobrazení znaku, jednu pro zobrazení desetinné tečky), což obnášelo obsazení osmi výstupních digitálních výstupů. Množství vstupních/výstupních pinů je ale modulu Arduino jen omezené množství. Nebylo by možné ovládat sedmisegmentový LED zobrazovač s využitím výrazně nižšího počtu propojovacích vodičů? Ano!

Další možností, jak řídit LED zobrazovače, je použití tzv. posuvných registrů, které pracují pomocí sériového přenosu dat. V tomto experimentu si právě takové použití ukážeme. Pro řízení LED zobrazovače použijeme integrovaný obvod 74HC595 s osmibitovým posuvným registrem. Obvod 74HC595 se skládá ze tří částí: posuvný registr, paměťový registr a třístavové výstupy. Obvod je určen pro převod dat ze sériového vstupu (v nejjednodušší variantě jeden datový a jeden hodinový signál) na osm paralelních výstupů. Takže právě tím ušetříme vstupně-výstupní piny modulu Arduino. Z tohoto důvodu je obvod 74HC595 velmi často a široce používán k řízení segmentových displejů. Jeho výhodou je i možnost zapojování několika těchto obvodů do kaskády, takže lze po sériovém rozhraní „nasypat“ poměrně velké množství dat pro paralelní výstupy.

Použité komponenty

  • modul Arduino
  • USB kabel
  • posuvný registr 74HC595
  • sedmisegmentový LED zobrazovač
  • 8× rezistor (220 Ω)
  • nepájivé pole
  • vodiče pro nepájivé pole

Princip

Pojďme se podrobněji podívat, co tedy posuvný registr dělá? V zásadě je to soustava klopných obvodů, kterými se logická informace přicházející sériově posouvá pomocí hodinového impulsu dále po paralelních výstupech (Q0Q7). Informace jednoho bitu (vysoká nebo nízká úroveň) na sériovém vstupu je při prvním tiku hodinového signálu „vtažena“ do registru a zapsána na výstup Q0. Při dalším tiku hodinového signálu se bit z výstupu Q0 posune na výstup Q1 a na uvolněné místo výstupu Q0 je načten bit ze sériového výstupu. Po uplynutí osmi hodinových pulzů tak máme v registru načteno osm bitů, které mohou být prezentovány na osmi paralelních výstupech. Jelikož paralelní výstupy posuvného registru nabývají nízké a vysoké úrovně, stejně jako by nabývaly výstupy modulu Arduino, připojený segmentový LED zobrazovač se chová stejně, jako kdyby byl připojen přímo k modulu Arduino.

Posuvný registr 74HC595, se kterým budeme dále pracovat, bude pro své ovládání potřebovat tři signály, kterými jej budeme ovládat. Prvním bude datový signál se sériovými vstupními daty, druhým pak musí pochopitelně být synchronizační hodinový signál. Třetí signál bude přesouvat načtená sériová data do paměťového registru paralelních výstupů. Jestliže při plnění posuvného registru se data postupně posouvají přes jednotlivé bity, bylo by nevhodné, aby se jejich stav okamžitě projevoval na výstupu. Z tohoto důvodu neobsahuje obvod 74HC595 jen posuvný registr, ale i paměťový registr. Až teprve zapsáním dat do paměťového registru se tyto data mohou začít projevovat na výstupech. Výhodou je i to, že zatímco paměťový registr drží platná data na výstupu, může se posuvný registr sériově plnit novou osmicí dat, která je pak okamžitě a najednou zapsána na výstup.

Tak je možné pomocí tří pinů modulu Arduino zaslat do obvodu 74HC595 osm bitů data určující osm stavů pro jednotlivé segmenty zobrazovače. Obvod 74HC595 tedy zapojíme mezi modul Arduino a LED zobrazovač.

Následující obrázek a tabulka ukazuje rozmístění a popis jednotlivých vývodů obvodu 74HC595:

piny 74HC595 Popis funkce vývodu
Q0–Q7 bitové výstupy, které jsou schopné řídit jednotlivé segmenty LED zobrazovače
Q7’
(Serial data output)
pin, který slouží k propojení s dalším obvodem 74HCT595
MR
(Master Reclear)
pin vynulování výstupů – aktivní při nízké úrovni (log. 0); zapojíme ho na vysokou úroveň (+5 V)
SHcp
(Shift register clock input)
vstup určený pro řídicí hodinový signál
STcp
(Storage register clock input)
při na náběžné hraně na tomto vstupu se údaje v posuvném registru přesunou do paměťového registru
OE
(Output enable)
pin „zapnutí“ výstupů čipu – aktivní při nízké úrovni (log. 0); obvod chceme aktivovat, zapojíme ho tedy na GND
DS
(Serial data input pin)
vstup dat, kam se zapisují vstupní data, která budou s pomocí hodinového signálu „vtažena“ do posuvného registru
VCC napájecí napětí (+5 V); připojíme na pin 5V modulu Arduino.
GND vývod zemnění (GND); propojíme s pinem GND modulu Arduino.
74HC595 - oinout

Přestože samotný princip posuvného registru možná vypadá jednoduše, samotné řešení z hlediska signálů na řídicích pinech vyžaduje přesné ovládání. Určitým úskalím je nutnost „rozkrájení“ výstupních dat na jednotlivé bity. Naštěstí tento proces již někdo vyřešil za nás a můžeme využít rozšíření „MAXI Starter kit“, které nám rovnou přidá programové bloky, které jsou speciálně pro tuto lekci připravené.


Postup experimentu

Krok 1: Sestavíme si obvod podle následujícího obrázku nebo schématu. Zde uvedený obvod, stejně jako následný program je určen jen pro LED zobrazovač se společnou katodou. Pokud jsme však pochopili elektronický rozdíl mezi typem zobrazovače CC a CA (stejně tak mezi způsoby jejich ovládání), měli bychom již dokázat schéma a program upravit i pro typ se společnou anodou.

Blokové schéma

Blokove schema

Elektronické schéma

Elektronicke schema

Následující tabulky znázorňují propojení modulu Arduino, obvodu 74HC595 a LED zobrazovače.

obvod 74HC595 (č. pinu) modul Arduino
DS (14) 11
STcp (12) 12
SHcp (11) 8
OE (13) GND
MR (10) 5V
VCC (16) 5V

obvod 74HC595 (č. pinu) LED zobrazovač
Q7 (7) a
Q6 (6) b
Q5 (5) c
Q4 (4) d
Q3 (3) e
Q2 (2) f
Q1 (1) g
Q0 (0) dp
GND (8) 5V

Krok 2: V prostředí mBlock vytvoříme následující program.


ikona vysvetleni Vysvětlení kódu

I v tomto programu využijeme pole proměnných a obdobně do nich zapíšeme hodnoty, které budeme chtít zobrazit na připojeném LED zobrazovači. Tentokráte pole proměnných využijeme tak, jak by se mělo využívat a jaká je vlastně jeho výhoda. A to tak, že budeme jeho jednotlivé položky volat indexem – to uvidíme v hlavní nekonečné smyčce „opakuj stále“. První část kódu, která proběhne jen jednou je deklarace pole proměnných a naplnění jednotlivých jeho položek. Každé číslo uvedené v dané položce odpovídá rozsvícení daných LED segmentů zobrazovače. Ukážeme si to na první hodnotě 63, která by měla zobrazit číslici 0.

      
LED segmenty
 
 segment   stav   váha bitu   hodnota 
a  1 (svítí)  1 1
b  1 (svítí)  2 2
c  1 (svítí)  4 4
d  1 (svítí)  8 8
e  1 (svítí)  16 16
f  1 (svítí)  32 32
g  0 (nesvítí)  64 0
dp  0 (nesvítí)  128 0
SOUČET:  63

Rozsvícení LED segmentů opět udávají jednotlivé bity binární podoby dané hodnoty. V naší tabulce odpovídá segment a bitu s nejnižší váhou (tzv. LSB), naopak desetinná tečka odpovídá bitu s nejvyšší váhou (tzv. MSB). Hodnotu, kterou budeme odesílat na výstup, opět udává součet vah bitů, které odpovídají rozsvícenému segmentům. Zhasnuté segmenty (zde g a dp) se nezapočítávají. Po sečtení všech příspěvků získáme hodnotu 63, což je přesně hodnota uložená v nulté položce proměnné typu pole.

Víme-li, že k položkám pole můžeme přistupovat pomocí jejich indexu – např. k hodnotě, která má zobrazit číslici 0 přistupujeme s indexem 0 – můžeme toho využít. V hlavní části programu máme cyklus, který proběhne šestnáctkrát a proměnnou num, která díky tomu bude postupně nabývat hodnot 0–15. Tuto proměnnou použijeme jako index proměnné pole a tím postupně můžeme získat předem nadefinované hodnoty pro zobrazení jednotlivých 16 znaků. Zde je dobré si všimnou trochu podivné konstrukce v programovém bloku, kde je proměnná num použita jako index pole. Prostředí mBlock standardně používá proměnné jako reálné čísla, zatímco indexy pole musí být celá čísla. I když je hodnota proměnné num třeba rovna 1 (což je celé číslo), stále ji prostředí mBlock považuje za reálné číslo. Takže si budeme pamatovat, že než použijeme v prostředí mBlock některou proměnnou jako index pole, musíme ji pomocí převodního bloku převést na celé číslo. Jinak přeložení a zápis programu skončí chybou. Díky tedy jednomu cyklu můžeme do posuvného registru postupně „nasypat“ všech 16 hodnot. To výrazně zkracuje zápis celého programu.

Na závěr vysvětlení programového kódu je třeba ještě upozornit na jednu věc, která souvisí s obsluhou a vlastně i principem posuvného registru. Když se podíváme na elektronické propojení LED segmentů a digitálních výstupů posuvného registru, vidíme, že segment a je zapojen na bitu nejvyšším váhy (Q7) a desetinná tečka dp na nejnižším (Q0). To je přesně obráceně, než jsme si ukazovali při odvození hodnoty pro zobrazení! Vysvětlení najdeme na zeleném programovém bloku obsluhy posuvného registru. Konkrétně nás zajímá volba „Pořadí bitů“, kde lze nastavit hodnotu MSBFIRST nebo LSBFIRST. Tyto hodnoty určují, jakým způsobem budou jednotlivé bity odesílány na posuvný registr. V našem programu je nastavena hodnota LSBFIRST, což znamená, že jako první má být odeslán bit nejnižší váhy. Při našem vytváření hodnoty pro odeslání to odpovídá bitu odpovídajícímu segmentu a. Jenže, jak jsme si říkali, při zápisu dalšího bitu na posuvný registr se první bit posouvá na druhé místo atd. Tedy první zapsaný bit (bit segmentu a) se posune až na nejvyšší místo. Proto musí v této konfiguraci být segment elektronicky připojen na nejvyšším bitu Q7. Pochopitelně by bylo možné zvolit i pořadí odesílání MSBFIRST, pak by byl nejdříve odesílán bit odpovídající desetinné čárce, a tedy bit segmentu a by řídil výstup Q0 s nejnižší váhou. Tož by pak ale vyžadovalo změnit pořadí připojených LED segmentů. Ale opět se experimentům meze nekladou.


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

Krok 4: Výsledkem našeho zapojení a programu by mělo být postupné zobrazování číslic 0–9 a pak i znaků A–F na připojeném LED zobrazovači.

Pohled na experiment