3D Led Cube

Introducere

Proiectul consta in construirea unui cub de leduri si crearea de animatii pe acesta. Am considerat ca este un proiect interesant si am dorit sa il fac mai dificil prin marirea laturii cubului.

Cubul va fi animat prin aprinderea succesiva a straturilor orizontale, creand un efect de aprindere permananta daca succesiunea este rapida.

Initial am dorit folosirea de multiplexoare pentru accesarea fiecarui led dintr-un strat, dar am optat pentru un Shift-Register pentru ca era mai usor de folosit. Pentru aprinderea staturilor am folosit o matrice de tranzistori.

Componente

  • 216 leduri x 0.25ron
  • 6 Shift Register x 2ron SN54HC595
  • 1 Darlington Sink Driver x 7ron ULN2003APG
  • 36 rezistente 100ohm ~ 3 ron toate
  • 7 socluri
  • pini mama si tata ~ 30 ron
  • banda de fire ~ 7ron
  • placuta de laborator ~ 50 ron
  • multe alte componente care au aparut pe parcurs

Total: ~ 200 lei

Se putea mai ieftin daca nu intampinam erori, in final cred ca merita.

Hardware

  • Am construit 6 straturi de 36 de leduri cu catodul comun.
  • Am unit aceste straturi pe coloane unind anodurile.
  • Am legat fiecare catod la o intarare a ULN2003APG
  • Fiecare coloana comuna va intra in o intrare a unui SN54HC595, am optat ca fiecare registru sa corespunda unei linii
  • SN54HC595 au VCC, GND, (RCLK si SRCLK comune) si OE comune
  • Din microcontroller merge cate un fir separat in fiecare SER de pe fiecare registru
  • ULN2003APG are iesirea GND legata la ground
  • Pe iesirile registrilor am legat cate o rezistenta de 100ohm

Software

Conexiuni hardware-microcontroller:

  • CLK shiftere - PA7
  • OE, enable iesiri - PA6, se activeaza pe 0
  • SER - PA0:5
  • I0:5 ULN - PC0:5
  • VCC, GND - echivalentele de pe placuta

Un cod simplu:

led6.c
int main()
{
        //Setez Porturile A si C pe iesire
	DDRA = 0xFF;
	DDRC = 0xFF;
 
	PORTA = 0;
	PORTC = 0;
 
	int y = PA0;
	int z = PC0;
 
        //Dezactivez iesirile shiterelor
	PORTA |= (1<<PA6);
 
        //Aprind prima linie din primul strat
	PORTA |= (1<<PA0);
	PORTC |= (1<<PC0);
 
	int t = 0, u=0;
	while(1)
	{
                //Dau o bataie de ceas
		PORTA |= (1<<PA7);
 
		//delay_ms(1);
 
		PORTA &= ~(1<<PA7);
 
                //Pentru a aprinde fiecare led de pe o linie diferit, aici ar trebui modificata valoarea pinului corespunzator liniei
 
		if (t==8)
		{
			t = 0;
 
			//Activez iesirea
			PORTA &= ~(1<<PA6);
 
			delay_ms(4);
 
			PORTA |= (1<<PA6);
 
                        //Modific startul
			PORTC &= ~(1<<z);
			z++;			
			if (z - PC0 == 6)
			{
				z = PC0;
 
				if (u==8)
				{
                                        //Modific linia
					u=0;
					PORTA &= ~(1<<y);
					y++;		
					if (y-PA0 == 6)
					{
						y = PA0;
					}
					PORTA |= (1<<y);
				}
				u++;
			}
			PORTC |= (1<<z);
		}
		t++;
	}
 
	return 0;
}

Implementare

  • Primul pas a fost crearea unei matrite gaurind o matrice de 6×6 in o placa de lemn
    • Sfat: departati cat mai mult gaurile pentru a fi cubul cat mai mare
    • Nu sperati sa va iasa din prima, e destul de greu, eu am reusit sa termin un patrat perfect din a 3-a incercare
  • Am indoit piciorusele ledurilor astfel incat dupa ce voi finaliza lipiturile unui strat sa il pot lega de cele vecine
  • Am lipit catodurile ledurilor de pe un start si am adaugat o sarma la unul din capete pentru a ii oferi mai multa rezistenta
  • Primul strat a luat cateva zeci de minute, restul au mers ceva mai repede, nu este cea mai amuzanta parte a proiectului
  • Dupa ce am obtinut 6 straturi de care 36 de leudri a trebuit sa le leg intre ele, mi-am format un suport din sarma care sa sustina unul din straturi deasupra celuilalt in timp de lipsec, dupa care am cerut ajutorul colegilor sa ma ajute
  • Nu incercati sa sustineti cu mana, frige!
  • Dupa conectarea cubului l-am prins pe placa si am lipit si restul de piese si legaturile dintre ele: destul de multe fire, multe fire comune pe care m-asm straduit sa le leg cat am putut eu de bine sa nu incomodeze
  • Ar fi ajutat mai mult daca anticipam toate firele si pozitionam mai bine soclurile pentru uln si siftere, dar nu e mult de munca pentru dezlipirea unuia lipit gresit

Rezultat

Inainte de a avea rezultatul final a trebuit sa repar o serie de probleme aparute, cele mai multe provenind din necitirea cu atentie a documentatiei.

Atentie la notatii si la valoarea semnalelor pentru care ar trebui sa se intample anumite salvari, de exemplu, eu am nu am vazut ca pinul de resetare al shiterelor este activat atunci cand nu este tensiune aplicata si il lasasem in aer, mi-a dat destul dem ult de cap lucrul acesta. Alta eroare intampinata a fost la microcontroller unde nu am fost atent si foloseam ultimii 6 pini ai portului C in loc de primii si nu mi se aprindeau corect straturile.

Scurt-circuiturile au fost ceva clasic, mai ales cand ma gandesc la cate fire se suprapuneau si, chiar daca aveau camasa, s-a topit si s-au unit.

Concluzii

  • Usor de construit
  • Greu de depanat, putina organizare in fire ar fi fost de ajutor
  • Urmeaza 8x8x8 cu leduri mai bune
  • Ar fi iesit mai bine daca foloseam leduri transparente care se aprind rosu, ultra bright stuff, care sunt destul de scumpe
  • Voi mai lucra la animatii
  • Il consider un trofeu personal, mai ales dupa cat timp am investit
pm/prj2011/pgp/3dledcube.txt · Last modified: 2021/04/14 17:07 (external edit)
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0