LedCube consta in construirea unei piese de decor si anume a unui cub 3D format din 4 x 4 x 4 (64 leduri) prin intermediul caruia se vor afisa imagini 3D sau modele diferite de aprindere a acestora. Astfel avand ocazia sa fac un proiect folosind microcontrolerul Atmega16 si vazand niste fimulete pe youtube, am decis ca vreau si eu un astfel de cub.
Coordonator: Popescu George
Proiectul consta intr-un 3D Led Cube de latura 4.
Cubul va fi controlat de micro-controller-ul Atmel Atmega16.
Acesta va aprinde led-urile dupa modele prestabilite.
Scopul si utilitatea proiectului consta in demonstrarea multiplexarii realizata de micro-controller-ul Atmel Atmega16.
Cu ajutorul interfatei seriale voi programa microcontrolerul Atmega16. In functie de program acesta va afisa anumite animatii, predefinite in program, pe cubul 3D. Cubul este legat direct la pinii microcontrolerului astfel: 16 coloane a cate 4 leduri (anodul +), si 4 nivele a cate 16 leduri (cadodul -), in total avand nevoie de 20 de pini disponibili din partea lui Atmega16.
Componente | Bucati |
---|---|
LED | 64 |
rezistente 100Ω | 16 |
Atmel AVR Atmega16 | |
ULN2003AN |
Programarea microcontrelerului am realizat-o cu ajutorul programului WinAvr, care include compilatorul GNU GCC pentru limbajele C si C++.
Memorarea cubului se face într-o matrice 2D de tipul volatile unsigned char cube[4][4]. Matricea va avea două dimensiuni şi anume axa Z şi axa Y. Fiecare byte va reprezenta o linie de leduri de-a lungul axei X, asfel voi folosi doar cei 4 biţi inferiori. Matricea e de tipul volatile pentru a putea fi referită din funcţia de întreruperi.
Codul contine 4 fisiere C: main.c, effect.c, draw.c si frames.c. In fisierul main avem 4 functii importante: ioinit ( initializeaza porturile I/O), bootmsg (clipirea becurilor pentru a indica boot sau reboot), delay_ms si launch_effect (incarcarea efectelor). In fisierul effect.c sunt definite toate animatiile care vor aparea cand cubul este pus in functiune, iar in fisierul draw.c sunt definite functii geometrice.
// Viteza CPU-ului si Baud rate: #define FOSC 14745600 #define BAUD 9600 //Calculul timpilor USART #define MYUBRR (((((FOSC * 10) / (16L * BAUD)) + 5) / 10) - 1) // Masti petru statusul ledurilor #define LED_GREEN 0x01 #define LED_RED 0x02 #define BUTTON 0x08 //Folosim portul B pentru status si intrari #define LED_PORT PORTB #define BUTTON_PORT PORTB // Masti pt selectarea nivelului #define LAYER1 0x80 #define LAYER2 0x40 #define LAYER3 0x20 #define LAYER4 0x10 #define LAYERS 0xf0 // Toate nivelele #define LAYERS_R 0x0f // Inversul nivelelor #define LAYER_PORT PORTD // Folosim Portul D pentru nivele // Folosim Port A si Port C pt coloanele cubului. #define GRID1 PORTC #define GRID2 PORTA void ioinit (void); // Initializarea I/O void bootmsg (void); // Clipirea becurilor pentru a indica boot sau reboot void delay_ms (uint16_t x); // functia delay folosita de la un capat la altul al programului void led_red(unsigned char state); // led on or off void led_green(unsigned char state); void launch_effect (int effect); // incarcarea efectului.
Day 4
Dear diary,
Am inceput. Ureaza-mi noroc.
Day 8
Dear diary,
Am facut scheletul la cub.
Day 15
Dear diary,
Conectat fire, nu am gasit nici un scurt. Codul e WIP
Day 16
Dear diary,
Codul e gata. Pare sa mearga acceptabil.
Day 23
Astazi trebuie sa prezint.