Led cube je v podstatě skutečný 3D display. Jeho rozlišení je dáno počtem LED.
Větší rozlišení nabídne věrnější efekty, ale náročnost na počet LED a řízení
stoupá s třetí mocninou. Takže je vhodné zvolit správný kompromis, mezi
náročností a rozlišením. Zde je rozměr krychle 5, ale LED jsou RGB, což umožní
udělat efekty zajímavější.
Jako řídící MCU byla vybrána ATmega64 a to především kvůli její velikosti flash
paměti (64kB). Dále disponuje velkým počtem pinů, hardwarovou PWM, UART, SPI
a I2C rozhraním. Protože jsou použity RGB LED, dostáváme 3 barevné kanály. PWM
je použita pro řízení svitu jednotlivých kanálů: R, G a B. Pokud budou všechny
kanály na LED "aktivní", lze pomocí PWM nastavit prakticky libovolnou barvu.
Omezení je zde převážně z hlediska softwaru a to že pro jeden celý 3D obrázek
lze nastavit vždy jednu kombinaci PWM.
Protože celé zařízení bylo konstruováno tak, aby jej bylo možné napájet přímo
z USB bez potřeby externího zdroje, byl do návrhu přidán i DC/DC měnič. To
přináší hned několik výhod:
Menší spotřeba
Větší bezpečnost
Možnost externího napájení
Díky tomu, že napájecí napětí pro AVR a LED je nižší, tak je možné použít
i menší sériové odpory pro LED. Tím pádem budou menší ztráty na těchto odporech
a zmenší se i ztrátový výkon. Napětí DC/DC měniče bylo voleno na 3.9V. Toto
napětí je dostatečně velké na to, aby už rozsvítilo modrou LED a zároveň zde
bude dostatečná rezerva pro úbytky na tranzistorech a vodičích. Díky nižšímu
napětí navíc nebude hrozit poškození LED při přepólování (například zkrat).
Další výhoda spočívá v tom, že díky DC/DC měniči dodávaný proud do LED může
být větší než proud odebíraný na vstupu celého zařízení. To je výhodné hlavně
pro napájení z USB. Díky ochranným diodám je možné napájet LED cube
i z externího zdroje. A to v rozmezí +5V~36V DC.
Při návrhu se myslelo i na možnost připojení externí maticové klávesnice, I2C,
nebo SPI zařízení.
Zařízení obsahuje převodník USB na UART. To umožňuje propojit zařízení
s počítačem a přehrávat animace například přímo z počítače, kde není takové
omezené množství paměti.
Reprogramování je možné standardním 10. pinovým ISP konektorem pro AVR jak 5V,
tak i 3.3V logikou (díky ochranným odporům).
Protože obvládat každou LED přímo MCU by nebylo prakticky možné (bylo by
zapotřebí 375 pinů), je řízení uskutečněno multiplexováním. Schéma projekce
a popisek je na následujících obrázcích.
Nejprve se "aktivuje" zeď - WALL0 (sepne T2). Pak se vybere sloupec COLUMN0
(T18). Tranzistory T3~T17 pak sepnou katody jednotlivých LED. Proces nějakou
dobu čeká (v tuto dobu je vhodné provést data processing). Pak se "deaktivuje"
COLUMN0 a "aktivuje" se COLUMN1, atd. atd. Schéma zapojení je níže.
Hlavní program je prostý: inicializuje se MCU a pak se v nekonečné smyčce volá
funkce, která vykresluje 3D obraz.
Největší problém je řešení zpracování dat. Vzhledem k tomu, že se celý 3D obraz
musí neustále obnovovat, nelze zpracovávat data libovolnou dobu. Problém se
zpracováním dat je rozdělen do dvou "vláken". První se stará o to, aby se
do framebufferu nahrávaly nové 3D obrazy.
Druhé vlákno obsahuje několik dalších podprogramů, které jsou ale volány podle
"pořadníku". Je to proto, že zpracování dat by nemělo trvat víc, jak několik
stovek mikrosekund. Proto je tato výpočetní zátěž rozložena v čase. Tato
část ještě není hotová a může se měnit. Zatím jde o návrh.
Protože vytvoření animace je časově velice náročné a navíc i pro člověka špatně
představitelné, byla pro tento účel napsaná konzolová aplikace. Na následujícím
obrázku je ukázka progrmu.
Program zobrazuje pořadí aktuálního obrazu (Frame), "zďi" (Wall), sloupci
(Column) a vypočtený čas (Time). Níže je zobrazený 2D obraz na dané "zďi".
Jednotlivé barevné složky jsou značeny písmeny "R", "G" a "B". Při zadání
příkazu "exit" se vygeneruje animace a uloží se do souborů .c a .h, které
uživatel
přidá do projektu pro AVR a ukáže pointerem na animaci. Ve funkci
main stačí změnit pointer. Viz následující příklad:
/* Nastaví pointer na animaci ve flash paměti. Je to v podstatě pointer na
* pole, kde jsou uložená binární data
*/
p_anime = pole_s_binarnimy_daty;
Anime maker sám
detekuje, pokud se některé obrazy opakují, jsou prázdné, nebo jsou všechny
LED zaplé. V takových případech se namísto dat zapíše jeden příkaz, který MCU
vyhodnotí stejným způsobem. Dochází tak k velké úspoře dat. Samozřejmě, že
záleží na obsahu, ale pro animaci "hada" se velikost animace zmenšila na
přibližně 1/2. Samotný proces lze samozřejmě rozšířit, takže lze dosáhnout
i vyšší komprese.
Přestože animace lze přehrát, program ještě není úplňe dokončen. Chybí podpora
pořadníku pro animace,
maticové klávesnice a dalších periferií (UART, I2C...). Na druhou stranu je již
napsaný kód připravený na tyto úpravy. Na videu níže můžete vidět "kostku
v akci".
Binární soubor pro Anime Maker je zkompilován pro Linux 64bit a procesor
Core2Duo.
Na "nižších" procesorech nemusí být program spustitelný! Případně si Anime
maker přeložte.
* pole, kde jsou uložená binární data
*/