Cristian Ungureanu 334CA
Proiectul ilustreaza capabilitatile microcontroller-ului Atmel Atmega16 si consta intr-un cub alcatuit din 64 de LED-uri care se aprind si sting in functie de programul scris pe microcontroller, rezultand diverse imagini 3D. LED Cube-ul are scop decorativ.
Programul a fost scris pe microcontroller prin interfata seriala. LED-urile sunt impartite in 4 niveluri a cate 16 LED-uri. Anozii LED-urilor au fost conectati impreuna pe coloane, utilizand 16 pini (cate unul pentru fiecare coloana) iar catozii LED-urilor au fost conectati impreuna pe niveluri, rezulta 4 pini folositi (cate unul pentru fiecare nivel).
Lista de piese LED Cube:
- 64 led-uri
- 16 rezistoare de 220 Ω
- 4 rezistoare de 2.2 kΩ
- 4 tranzistoare NPN BC338
Schema de mai jos ilustreaza circuitul care controleaza LED Cube-ul.
Pentru a controla cele 64 de LED-uri utilizand un numar minim de fire, am folosit urmatoarea multiplexare: cubul este impartit in 4 niveluri a cate 16 de LED-uri; totodata, cubul contine 16 coloane a cate 4 LED-uri; toate LED-urile de pe o coloana au acelasi anod (+) si toate LED-urile de pe un nivel au acelasi catod (-). In acest fel, am folosit doar 20 de fire (16 pentru anozi/coloane si 4 pentru catozi/niveluri). Anozii sunt conectati la pinii microcontroller-ului, iar catozii la masa, prin 4 tranzistori (cate unul pentru fiecare plan), conectati tot la pinii microcontroller-ului. Astfel, pentru accesarea unui LED de pe un nivel, folosim anodul asociat coloanei pe care se afla si catodul corespunzator nivelului respectiv. Apare insa o problema: un anod aprinde toate ledurile de pe coloana pe care o controleaza, pentru care catodul este legat la masa. Solutia la aceasta problema este sa aprindem un singur nivel la un moment dat, dar foarte rapid, asa incat ochiul uman sa creada ca intreg cubul este aprins simultan, datorita efectului de persistenta a viziunii.
Pentru redarea animatiilor, am folosti un program open source disponibil aici. Programul ruleaza o serie prestabilita de imagini/configuratii pentru LED-uri.
Cubul este memorat intr-o matrice 2D: volatile unsigned char cube[4][4]. Cele doua dimensiuni ale matricei reprezinta respectiv axele Z si Y. Fiecare element (octet) al matricei reprezinta linia de pe axa X care trece prin punctele z si y indexate. Fiecare LED de pe linie este reprezentat de unul dintre cei 4 biti inferiori ai octetului.
Arhiva contie 4 fisiere C. Main.c este fisierul principal si contine functiile ioinit (care initializeaza porturile), bootmsg (care clipeste cateva leduri pentru a indica reboot), delay_ms (folosita pentru efectele grafice) si launch_effect (functia apelata din main care incarca efectele grafice dorite). Frames.c contine o structura folosita pentru efecte, in draw.c sunt definite functii geometrice de baza, iar cu ajutorul acestora, in effect.c sunt definite animatiile.
Pentru a scrie programul pe microcontroller am folosit Avrdude din suita Winavr.
Am obtinut un LED Cube functional, cum se poate vedea mai jos.
A fost un proiect interesant, care mi-a dat mari satisfactii odata ce a functionat, din care am invatat mai multe despre microcontroller-ul ATMega16.
26 aprilie
Am inceput sa lucrez la cub.
28 aprilie
Am construit primul nivel de LED-uri.
4 mai
Am construit tot cubul.
10 mai
Am adaugat toate conexiunile.
14 mai
Dupa o perioada de troubleshooting, proiectul functioneaza.