Introducere

Scopul proiectului este realizarea unui dispozitiv de afisare bazat pe fenomenul de inertie a retinei (Persistence of Vision). Prin rotirea cu viteza mare (minim 16 rot/s) a baretei de LED-uri si sincronizand momentele de aprindere/stingere a acestora cu pozitia baretei dispozitivul va crea iluzia existentei unui afisaj de forma circulara .

Descriere generala

Dispozitivul este alcatuit din doua parti:

  • placa de baza cu: microcontrolerul si celelalte componente, o baterie, LED-urile lipite pe o placuta suplimentara
  • motorul de curent continuu care antreneaza placa in miscare circulara

Schema Electrica

Componente hardware

  1. ATmega 324
  2. 16 LED-uri
  3. 16 rezistente 2,2kΩ
  4. baterie pentru alimentare
  5. motor 4W
  6. senzor hall (m-am hotarat mai tarziu sa pun pentru a sti exact cand sa incep afisarea)
  7. suport pentru placuta

Am folosit 16 LED-uri SMD pe care le-am lipit pe o bucatica taiata dintr-o placuta de cablaj textolit. Nu am folosit clorura ferica pentru ca nu am putut imprima circuitul, asa ca am scrijelit circuitul astfel incat fiecare LED sa aibe contact la masa intr-un capat si legatura la rezistenta in celalalt. Am folosit sine a nu lipi direct pe pinii placutei.


Pentru a invarti placuta, am folosit un motor de la un cititor de disc foarte vechi, iar pentru a-l alimenta am desfacut un stecher si am legat faza si pamantul la firele motorului. Am gasit o carcasa de la o jucarie stricata in care a incaput cu putin efort acest motor. Carcasa avea doua butoane, asa ca am folosit unul dintre acestea ca switch pentru motor. M-am hotarat sa nu inlocuiesc condensatorul vechi(cel galben) al motorului, intrucat putea fi utilizat ca suport pentru magnetul de reper de care urma sa am nevoie pentru senzorul hall. Am gaurit cu o pila carcasa pentru cablurile care trebuiau sa iasa din ea.


Placa de baza este montata intre doua CD-uri vopsite in negru, folosind suruburi si niste segmente de tub de carioca pentru distantare. Pe CD-ul de deasupra am lipit soclul de 3 baterii AAA necesare alimentarii placutei.


Motorul avea deja un mic disc de metal care se fixeaza foarte bine prin doua suruburi in varful axului. Acesta putea fi folosit ca suport pe care sa lipesc CD-rile intre care era fixata placa cu led-urile, senzorul hall si bateriile. Am incercat sa fac un sistem de echilibrare a dispozitivului folosind piulite si 3 suruburi, cate doua piulite mai mari sau mai mici care se fixeaza una pe alta pe fiecare surub. Pentru aceasta am folosit un dop pe care l-am gaurit (de 3 ori pentru suruburi, de inca 2 ori pentru suruburile suportului initial al motorului, pe care le-am protejat cu niste segmente dintr-un furtun de cauciuc). Ulterior am adaugat si senzorul hall, fixandu-l cu unul din suruburile cu care era fixata placa pe CD-uri.

Software

int8_t RUN_PB[3][12] = { 
									{ 0, 0, 8, 24, 32, 78, 95, 255, 95, 78, 80, 48},
									{ 0, 8, 8, 16, 46, 95, 255, 95, 46, 48, 8, 8},
									{0, 128, 64, 78, 95, 255, 95, 78, 72, 48, 0, 0}
								};
uint8_t RUN_PD[3][12] = { 
									{0, 0, 0, 0, 0, 0, 224, 159, 4, 8, 240, 128},
									{0, 0, 0, 0, 0, 156, 231, 2, 6, 8, 48, 32},
									{8, 16, 33, 18, 8, 7, 4, 104, 80, 0, 0, 0}
								};

uint8_t MERGI_PB[68] = {
						0, 16, 16, 240, 16, 16, 0, 224, 16, 16, 16, 224, 0, 240, 0, 0, 0, 240,
						0, 0, 0, 0, 0, 
						224, 16, 16, 16, 224, 0, 0, 0, 0, 0, 240,
						0, 0, 0, 0, 0,
						16, 240, 16, 0, 32, 16, 16, 16, 224, 0, 224, 16, 16, 16, 240, 0, 16, 144, 144, 144, 240, 0, 240, 32, 64, 128, 64, 32, 240};

uint8_t MERGI_PD[68] = { 
						0, 0, 0, 15, 0, 0, 0, 7, 8, 8, 8, 7, 0, 3, 4, 8, 4, 3,
 						0, 0, 0, 0, 0, 
 						15, 1, 1, 1, 15, 0, 8, 8, 8, 8, 15, 
 						0, 0, 0, 0, 0, 
 						8, 15, 8, 0, 7, 9, 9, 8, 7, 0, 8, 5, 3, 1, 15, 0, 8, 8, 8, 8, 15, 0, 15, 0, 0, 0, 0, 0, 15};			

uint8_t PISICA_PB[3][12] ={
						{0, 0, 0, 128, 128, 0, 0, 128, 0, 0, 0, 128},
						{224, 0, 0, 0, 128, 0, 0, 0, 128},
						{128, 128, 0, 0, 0, 0, 128, 0, 0, 0, 192}
					};

uint8_t PISICA_PD[3][12] ={
						{0, 0, 0, 7, 188, 112, 240, 55, 127, 58, 255, 7},
						{135, 124, 240, 112, 55, 255, 58, 63, 103},
						{0, 7, 4, 252, 112, 176, 55, 255, 58, 255, 7}
					};

uint8_t BALON_PB[3][12] = {
						{0, 0, 0, 0, 56, 68, 154, 10, 130, 68, 56, 0},
						{0, 0, 0, 0, 0, 28, 34, 77, 133, 65, 34, 28},
						{0, 0, 0, 0, 0, 56, 68, 154, 10, 130, 68, 56}
						};

uint8_t BALON_PD[3][12] = {
						{0, 0, 128, 64, 48, 8, 3, 1, 0, 0, 0, 0},
						{0, 0, 0, 0, 0, 82, 52, 3, 0, 0, 0, 0},
						{0, 0, 0, 0, 0, 0, 140, 82, 33, 0, 0, 0}
					};

volatile uint8_t contor;
volatile uint8_t img;
volatile uint8_t flag;

ISR(TIMER1_COMPA_vect)
{
	
    contor = 0;
    img = 0;
    if(flag == 1)
    	flag = 0;
    else
    	flag = 1;
    _delay_us(800);
    	
}

ISR(PCINT2_vect)
{
    if (PINC & (1 << PC0))
    { 
    	if(contor == 5){
    		img = img + 1;
    		contor = 0;
    	}

    	if(img == 3){
    		img = 0;
    	}

    	if(flag == 0){
	    	
	    	for(int j = 0; j < 12; j++ ){
			PORTB |= 255;
	    		PORTD |= 255;
	    		PORTB &= BALON_PB[img][j];
	    		PORTD &= BALON_PD[img][j];
	    		_delay_us(300);
	    		PORTB = 0;
	    		PORTD = 0;
			}

			_delay_us(800);

	    	for(int j = 0; j < 12; j++ ){
			PORTB |= 255;
	    		PORTD |= 255;
	    		PORTB &= PISICA_PB[img][j];
	    		PORTD &= PISICA_PD[img][j];
	    		_delay_us(300);
	    		PORTB = 0;
	    		PORTD = 0;
			}

			_delay_us(1000);
		    	
			for(int j = 0; j < 12; j++ ){
				PORTB |= 255;
	    		PORTD |= 255;
	    		PORTB &= RUN_PB[img][j];
	    		PORTD &= RUN_PD[img][j];
	    		_delay_us(300);
	    		PORTB = 0;
	    		PORTD = 0;
			}

			_delay_us(1000);

			for(int j = 0; j < 68; j++ ){
				PORTB |= 255;
	    		PORTD |= 255;
	    		PORTB &= MERGI_PB[j];
	    		PORTD &= MERGI_PD[j];
	    		_delay_us(300);
	    		PORTB = 0;
	    		PORTD = 0;
			}

			//_delay_us(300);
    	}
    	else {
    		
    		for(int k = 0; k < 11; k++){
    			for(int j = 0; j < 12; j++ ){
				PORTB |= 255;
		    		PORTD |= 255;
		    		PORTB &= RUN_PB[img][j];
		    		PORTD &= RUN_PD[img][j];
		    		_delay_us(300);
		    		PORTB = 0;
		    		PORTD = 0;
				}
				//_delay_us(300);
    		}
    		
    	}
    	contor = contor + 1;
    	
   }
}

int main() {

	sei();
	
	//seteaza registrii pinilor microcontrolerului pentru iesire

	DDRB |= 255;
	DDRD |= 255;

	contor = 0;
	img = 0;
	flag = 1;
	
	// intrerupere senzor 

	PCICR |= (1 << PCIE2); //Activez PIN CHANGE INTERRUPT ENABLE pentru portul C
	PCMSK2 |= (1 << PCINT16); //Activez intreruperea pe PC0

	// setare timer

	TCNT1 = 0;
	TCCR1B = (1 << CS12) | (1 << CS10) | (1 << WGM12); // prescaler 1, CTC OCRA1 TOP
	TIMSK1 = (1 << OCIE1A); // intreruperea pt
	OCR1A = 50000;


	while(1){
	
	}
	return 0;
}

Rezultat

Link catre YouTube la videoclipul cu dispozitivul in functionare c_wynlh0Y38

pm/prj2019/abirlica/brodoceanu_diana_pov.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