Table of Contents

Introducere

Matricea de leduri este un element care ofera posibilitatea afișării unor jocuri interesante de lumini. Ideea de la care am pornit a fost aceea a redării unor mesaje (ca cele de la metrou care arată următoarea stație), după care am găsit pe internet numeroase filmulețe interesante ce au la bază un asemenea dispozitiv.

Deoarece reprezinta un lucru inedit, matricea de leduri poate deveni elementul care aduce zâmbetul pe buze la sfârșitul unei zile obositoare :-)

Descriere generală

Proiectul este alcătuit din:

Schema bloc

Hardware Design

Piesele achiziționate sunt urmatoarele:

Schema electrică a întregului proiect este următoarea:

Schema electrică

Shifterul are următoarele caracteristici:

pinisn74hc164.jpg

74hc164functiontable.jpg

Ledurile matricei pot fi controlate conform următoarei scheme:

Semnificația culorilor firelor de legătură de pe spate este următoarea:

Software Design

Mediul de dezvoltare folosit a fost WinAVR. Am lucrat pe Windows XP x86 într-un mediu virtual (pentru Windows 7 x64 nu am găsit drivere, nu mi-a fost recunoscută plăcuța nici cu bootloaderul modificat).

Am pornit realizarea programului de la Laborator 2 - Intreruperi, Timere, PWM, unde este explicat modul de folosire a întreruperilor pentru aprinderea LEDurilor. Apoi, folosind schema matricei, am început să aprind treptat linii/coloane, ajungând să creez jocuri de lumini.

În primul rând, am setat timerul:

void initTimer() {
      OCR1A = 500;						
      TCCR1B |= (_BV(CS12) | _BV(CS10)); 											
      TCCR1B &= ~_BV(CS11) ;			 	
      TCCR1A &= ~(_BV(WGM11) | _BV(WGM10));											
      TCCR1B |= _BV(WGM12);					
      TIMSK |= _BV(OCIE1A);				
}

Apoi, am încercat diverse variante de aprindere/stringere leduri. Semnificația porturilor și felul în care acestea sunt activate:

Înainte de a începe animația, trebuie setată direcția și stinsă matricea:

DDRD = 0xFF;
PORTD = 0;	    

Spre exemplu, aprinderea a 3 coloane, dintre care primele 5 linii sunt roșii, iar ultimele 3 sunt verzi se realizează astfel:

for(i=0;i<5;i++) {
       PORTD |= (1<<PD7); // dezactivare linia rosie
       _delay_ms(900);
       PORTD |= (1<<PD6); // activare coloana
       _delay_ms(200);
       PORTD = 0;
       _delay_ms(300);
}

Pentru compilare, am folosit următorul Makefile:

build: jocLumini.hex
jocLumini.elf: jocLumini.c	
      avr-gcc -mmcu=atmega16 -Os -Wall  -o jocLumini.elf jocLumini.c
jocLumini.hex: jocLumini.elf
      avr-objcopy  -j .text -j .data -O ihex  jocLumini.elf jocLumini.hex
      avr-size jocLumini.elf
clean:
      rm -rf jocLumini.elf jocLumini.hex        

Pentru rularea și încărcarea programului:

Schema electrică

Rezultate Obţinute

În final, am reușit să realizez un mic joc de lumini :-)

filmulet youtube

Concluzii

Download

Sursele proiectului pot fi downloadate de aici.

Jurnal

1 mai

În mai puțin de 1 lună trebuie să predăm proiectul… și încă nu am cumpărat nicio componentă.

13 mai

Plimbare lungă pe str. Maica Domnului:

17 mai

Oră de laborator:

22 mai

Weekendul cu Rusaliile: ploaie torențială afară, vreme de dormit… sau de lipit proiectul.

componenteml.jpg

30 mai

Scris partea software + documentațe… poate și puțin somn înainte de colocviu.

Bibliografie/Resurse

Resurse Hardware

Resurse Software

Am găsit numeroase modele de animații și chiar de joculețe pentru o matrice cu leduri, dar nici una nu se potrivea designului meu (fie era alt tip de microcontroler, fie alte elemente de control, etc.). Am utilizat ca model Laboratorul 1 și Laborator 2 - Intreruperi, Timere, PWM.