Ukážeme si, jak pomocí 8 LED řízených jednočipem AT89C2051a motoru vytvoříme nápis, případně jiné grafické prvky v prostoru.
Před několika měsíci jsem si všiml na Internetu efektu s LED, který se mi velmi zalíbil. Minulý týden jsem se rozhodl, že si ho také zrealizuji a poté se s vámi podělím o výsledek mé práce. Předem bych chtěl poprosit, abyste tento článek nebrali jako přesný návod.
Návrh zařízení
Základem je dobře navržené mechanické uspořádání. Moje požadavky byly:
- jednoduché elektrické zapojení
- použití součástek ze „šuplíkových zásob“
- dostatečně výkonný motor bez nutnosti převodovky
- vhodná hřídel motoru pro snadné připevnění ramena
- otáčky motoru kolem 1 500 ot./min
- nízké napájecí napětí motoru (ideálně do 12 V)
Elektronická část
Rozhodl jsem se použít osm LED jako nejjednodušší řešení, ale hlavním důvodem byl malý cuprextit, jenž jsem měl zrovna doma. Navrhl jsem jednoduché schéma zapojení (viz obrázek). Srdcem obvodu je známý mikrořadič firmy Atmel AT89C2051(můžete jej nahradit novější řadou AT89S2051). Oscilátor je tvořen kondenzátory C3 a C4, rezistorem R9 a krystalem Q1. RC člen složený z C5 a R11 slouží pro automatický reset při připojení napájení. Kdybychom jej jej neprovedli, mohl by se mikrořadič dostat do nedefinovaného stavu. Resetem zaručíme, že se program začne provádět od adresy 0. Pro manuální reset je k dispozici tlačítko. Piny P1.0 a P1.1 nejsou opatřeny pull-up rezistory, které definují logickou úroveň 1, proto musíme opatřit piny rezistory R12 a R13 z vnějšku. Nesmíme překročit součet proudů pro všechny výstupy mikrořadiče 80 mA (zkratový proud pinu je 20 mA), tudíž jsem použil obvod 74LS245 jako budič LED, kterými pak může téct proud větší než 10 mA a nemusíme se bát zatížit port P3 při rozšíření zapojení. Pro omezení proudů ledkami slouží rezistory R1 až R8. Uvědomte si, že ledky rozsvěcujeme logickou nulou, je třeba si na toto při programování dát pozor. Na vyhotovenou desku osazujeme nejdříve rezistory, kondenzátory a LED. Pro mikrořadič použijte precizní patice. Délku napájecího kabelu volte tak, aby vám dosáhla na druhý konec ramena, kde bude umístěna baterie. Desku a její osazení si můžete stáhnout.
Mechanická část
Použil jsem stejnosměrný motor 12 V/60 W, který má osu opatřenou závitem, což mi usnadnilo připevnění ramena. Motor jsem přišrouboval k dřevěné desce podložené polystyrenem pro odrušení vibrací. Rameno jsme vyrobil z hliníkového profilu o délce 33 cm. K motoru jsem ho přišrouboval 13 cm od jeho okraje. Na delší konec se přišroubuje osazená deska s LED. Baterii pro napájení elektroniky dobře poslouží plochá 4,5V baterka. Baterii využijeme také jako protizávaží. Umístěte baterku (případně můžete přidat další závaží) na rameni tak, aby bylo rameno vyvážené. Tento krok je velmi důležitý, protože jinak by se vám mohlo stát, že místo několika stovek až tisíc otáček bude mít motor pouhých několik desítek otáček, taktéž se zkracuje jeho životnost. Dále dbejte na velmi pevné připevnění baterie a závaží k rameni, aby se nemohly uvolnit a případně způsobit poranění. Připájejte napájecí kabel od elektroniky k baterii a páskou stáhněte kabel po celé jeho délce k rameni. Jak jste jistě z obrázků poznali, motor napájím z PC zdroje o výkonu 200 W z pětivoltové větve. Motor má při 5 V kolem 635 ot./min. Motor je napájen pouze pěti volty, protože uchycení baterie a závaží není uděláno příliš precizně.
Programová část
Úkolem bude vytvořit program, který zobrazí můj nick XP dokola a jednou za cca 2 sekundy tento text zinvertuje, tedy jestliže svítil text a zbytek nesvítil, pak text bude svítit a zbytek svítit nebude. Nejdůležitější podmínkou, co musíte splnit, je, aby se text vykresloval pokaždé na stejné místo, toho můžete docílit dvěma způsoby – lehčím a těžším. Lehčí způsob spočívá v tom, že budete nastavovat ručně časovou konstantu tak, aby vám text stál na místě nebo mírně popojížděl. Nevýhodou tohoto řešení je, že jakákoliv změna otáček motoru povede k pojíždění textu, tedy jeho nečitelnosti. Těžší způsob spočívá ve snímání otáček motoru; nejjednodušší způsob, který mě napadá, je zespodu ramena namontovat optozávoru, kde bude paprsek světla přerušovat napevno přidělaný plíšek k podložně s motorem. Pak můžete programově podle otáček upravovat časovou konstantu. Já jsem si vybral manuální korekci časové konstanty, ale jakmile budu mít více času, dodělám snímání otáček a o výsledek se s vámi podělím.
Přejděme k vlastnímu popisu programu. Nejdříve, abychom mohli něco vidět, musíme aktivovat 74LS245 logickou nulou na pinu P3.7. Registrem R2 si nastavíme dobu zobrazení efektu. Vypočítáme ji jako součet časů potřebných pro zobrazení jednoho slova vynásobených hodnotou registru R2: zobrazení písmene P + mezera mezi písmeny + zobrazení písmene X + mezera mezi slovy = 3,5 ms + 1 ms + 3,5 ms + 2,5 ms = 10,5 ms. Doba zobrazení efektu: 10,5 ms * R2 = 10,5 ms * 200 = 2,1 s. Jestliže se motor točí po směru hodinových ručiček, pak musíte text vypisovat pozpátku. Jednotlivá písmena vykreslujeme podprogramem drawCH , který má dva parametry. První parametr char určuje vykreslovaný znak, pro znak 'X' je char roven nule a pro 'P' se rovná jedné. Druhý parametr effect určuje, zda se má text invertovat. Písmena 'X' a 'P' jsou uložena v tabulkách charP a charX. Ve funkci drawCH určuje registr R7 aktuální řádek tabulky. Do DPTR se nejdříve uloží adresa tabulky právě vykreslovaného znaku. Obsah registru R7 je přesunut do akumulátoru. Do akumulátoru se pak uloží řádek tabulky daný adresou v DPTR a posunutím v tabulce uloženým v akumulátoru. Ve smyčce pak takto postupně vybíráme jednotlivé řádky tabulky a posíláme je na port P1. Jestliže je nastaven efekt, pak se obsah akumulátoru neguje a odešle se na port P1. Takto vykreslíme znak 'X' a 'P', mezi ně vložíme mezeru o délce 1 ms. Po vypsání písmen 'XP' vložíme mezeru mezi slovy délky 2,5 ms. Tato časová prodleva má druhý a důležitější účel jako časová konstanta, kterou stabilizujeme text na jednom místě. Čas 500 µs je vytvořen časovačem 0 v 16b módu. Jelikož pravděpodobně použijete jiný motor s jinými otáčkami, budete si muset podprogram času upravit podle svého.
;********************************************************************** ;************************* LIGHT 3D EFFECT **************************** ;********************************************************************** ORG 0 char equ R0 ;vykreslovaný znak, 0/1 - X/P effect equ R1 ;volba efektu inverze: 0/0ffh - ano/ne CLR P3.7 ;aktivace 74LS245 jj: MOV effect,#0 ;s efektem main: MOV R2,#200 ;nastavení doby trvání jednoho efektu t = 200 * 10,5 ms = 2,1 s opak: MOV char,#1 ;nastav vykreslovaný znak na P CALL drawCH ;vykresli znak MOV P1,effect ;mezera mezi písmeny délky 1 ms CALL t0m5 CALL t0m5 MOV char,#0 ;nastav vykreslovaný znak na X CALL drawCH ;vykresli znak MOV P1,effect ;mezera mezi slovy délky 2,5 ms CALL t0m5 CALL t0m5 CALL t0m5 CALL t0m5 CALL t0m5 DJNZ R2,opak CJNE effect,#0,jj ;jestliže nebyl nastaven efekt, pak ho nastav a naopak MOV effect,#0ffh JMP main ;funkce drawCH ma dva parametry: char - vykreslovaný znak, effect - efekt inverze drawCH: MOV R7,#0 CJNE char,#1,chp MOV DPTR,#charP ;adresa tabulky znaku p JMP nextCH chp: MOV DPTR,#charX ;adresa tabulky znaku x nextCH: MOV A, R7 MOVC A,@A+dptr ;do akumulátoru ulož aktuální řádek tabulky CJNE effect,#0,cont ;efekt - inverze textu CPL A cont: MOV P1,A ;zobraz jeden sloupec znaku CALL t0m5 ;doba zobrazení jednoho sloupce INC R7 ;zvyš posunutí v tabulky CJNE R7,#7,nextCH RET charP: db 10011111b ;tabulka znaku P db 00001111b db 00100111b db 00100111b db 00000000b db 00000000b db 11111111b charX: db 00111100b ;tabulka znaku x db 00011000b db 11000011b db 11100111b db 11000011b db 00011000b db 00111100b t0m5: MOV tmod,#1b ;nastav časovač 0 v módu 16bit MOV TH0,#0FCh MOV TL0,#25h CLR TF0 ;vynuluj příznak přetečení SETB TR0 ;aktivuj časovač JNB TF0,$ ;čekej dokud se časovač nenaplní - neuběhne 500 us RET END
A výsledek naší práce
Nakonec jsem vytvořil krátké video, kde můžete shlédnout celý efekt. Kvalita videa není příliš vysoká, video bylo natočeno digitálním fotoaparátem.
Rady na závěr
Uspořádání, které jsem zvolil já, není jediným řešením. Doporučuji oddělit ledky s předřadnými rezistory mimo desku řídící elektroniky, pak budete mít volnost při uspořádání LED. Můžete je například uspořádat do oblouku a vytvořit tak iluzi koule. Je možné, že vám nebude stačit 8 LED, pak můžete využít oba porty 89C2051 nebo použít 89C51 se čtyřmi porty. Další možností, jak ovládat více LED, je rozšířit porty pomocí vhodných obvodů (já používám 74LS573). Jak už jsem zmínil v článku, bylo by vhodné dodělat měření otáček a korekci časové konstanty. Jestliže vás tento článek zaujal a podle něj jste si udělali tento efekt, tak nezapomeňte natočit video, nebo alespoň udělat fotky, a dát odkazy do komentáře pod článkem. Neručím za úraz způsobený elektrickým proudem nebo pohybující se mechanickou částí.