Dragoş-Mihai UŞURELU (87551) Battleships pe LED-uri

Autor

Introducere

Acest proiect constă în implementarea pe LED-uri a jocului clasic de BattleShips. Scopul proiectului este de a oferi o variantă electrică și interactivă a jocului clasic din plastic. Cum se joacă: fiecare jucator are câte 2 matrici de leduri in față, pe matricea verticală își va putea vizualiza și dispune navele de luptă, iar pe cea orizontală va putea selecta pozițiile din matrice unde poate lansa bombe spre navele inamice spre a le scufunda. Primul jucător care reușește să scufunde toate navele inamice câstigă.

Am pornit de la ideea unui joc clasic al copilăriei și am vrut să îl transform într-un joc electronic, în același timp făcându-l mai interesant. Utilitatea didactică a acestui joc este aceea de a învăța să lucrez cu led-uri, microcontroller, și tot ce presupune contrucția lui. De asemenea, acest proiect va putea fi utilizat în continuare ca sursă de divertisment și relaxare.

Descriere generală

La începutul jocului, fiecare jucător își va poziționa navele de luptă folosind joystick-ul pentru a le deplasa pe axele XoY. Butonul de pe joystick este pentru a fixa nava in locul ales. Primul jucător care va termina de poziționat toate navele va fi primul care va incepe sa lanseze bombe. LED-urile se vor aprinde pentru a marca poziția tintei curente, când s-a decis dacă aceea e poziția dorită, se va apăsa pe butonul de pe joystick, iar dacă a fost lovită nava inamică va dispărea nava de pe harta adversarului.

Listă de piese:

  • 4 matrici de LED-uri 8 x 8
  • 2 joystick-uri (cu buton)
  • 8 x 4 rezistențe pentru matricea de LED-uri
  • cadru/suport pentru matricile de LED-uri
  • fire
  • 2 plăci de test
  • 2 plăci de cupru pentru cablajul imprimat
  • 6 registre de deplasare

Schema bloc

Hardware Design

Schema electrică

Deoarece numărul pinilor este prea mic pentru a controla toate ledurile, am folosit registre de deplasare IC 74595.

Aceasta este schema pentru 2 din cele 4 matrici de led-uri, pentru celelalte 2 schema este identică.

Software Design

Jocul contine 3 mari functii importante: - “place_ships1()” → primul jucator isi plaseaza navele - “place_ships2()” → al doilea jucator isi plaseaza navele - “start_fight()” → fiecare jucator, cand ii vine randul incearca sa gaseasca pozitia navei adverse si sa o scufunde.

Fiecare jucator are din start cateva nave dispuse pe harta, la care poate adauga el inca 3 nave, cum doresc dispuse.

OBS.: Navele de pornire, precum si numarul navelor care mai pot fi adaugate se poate modifica foarte usor, cele ce sunt deja existente in cod au fost alese pentru un “demo” cat mai usor.

Functii de manipulare si a pinilor si a registrelor de deplasare:

void digitalWrite1(uint8_t pin, uint8_t value)
{
	if (value == LOW) {
		PORTB &= ~(1 << pin);
	} else {
		PORTB |= (1 << pin);
	}
}

void digitalWrite2(uint8_t pin, uint8_t value)
{
	if (value == LOW) {
		PORTD &= ~(1 << pin);
	} else {
		PORTD |= (1 << pin);
	}
}

// incarcare valoare
void store1()
{
	PORTB |= (1 << STORE1);
	_delay_us(10);
	PORTB &= ~(1 << STORE1);
	_delay_us(10);
}

void store2()
{
	PORTD |= (1 << STORE2);
	_delay_us(10);
	PORTD &= ~(1 << STORE2);
	_delay_us(10);
}

// shiftare de pe un registru de deplasare pe altul
void shiftOut1(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val)
{

	uint8_t i;
	digitalWrite1(clockPin, LOW);	
	for (i = 0; i < 8; i++)  {
		if (bitOrder == LSBFIRST)
			digitalWrite1(dataPin, !!(val & (1 << i)));
		else	
			digitalWrite1(dataPin, !!(val & (1 << (7 - i))));
		digitalWrite1(clockPin, HIGH);
		digitalWrite1(clockPin, LOW);	
	}
}

void shiftOut2(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val)
{

	uint8_t i;
	digitalWrite2(clockPin, LOW);	
	for (i = 0; i < 8; i++)  {
		if (bitOrder == LSBFIRST)
			digitalWrite2(dataPin, !!(val & (1 << i)));
		else	
			digitalWrite2(dataPin, !!(val & (1 << (7 - i))));
		digitalWrite2(clockPin, HIGH);
		digitalWrite2(clockPin, LOW);	
	}
}

Functii de printare a matricilor din cod pe matricile de led-uri:

void print_matrix(int i) {
	convert1();
	convert1_see();
	convert2();
	convert2_see();
	if(i == 1) {
		for(i = 0; i < 8; i++) {
			shiftOut1(DATA1, SHIFT1, LSBFIRST, ~table1[i]);
			shiftOut1(DATA1, SHIFT1, LSBFIRST, ~table1_see[i]);
			shiftOut1(DATA1, SHIFT1, LSBFIRST, 128 >> i);
			store1();
		}
	} else {
		for(i = 0; i < 8; i++) {
			shiftOut2(DATA2, SHIFT2, LSBFIRST, ~table2[i]);
			shiftOut2(DATA2, SHIFT2, LSBFIRST, ~table2_see[i]);
			shiftOut2(DATA2, SHIFT2, LSBFIRST, 128 >> i);
			store2();
		}
	}
}

Acestea sunt functiile pe care le-am folosit in principal la controlul shift registrelor.

Desfasurarea intregului joc este:

ADC_init();
IO_init();

place_ships1();

place_ships2();

start_fight();

if(check == 1) {
	while(1)
		print_final1();
} else {
	while(1)
		print_final2();
}

Rezultate Obţinute

Proiectul final arata in felul urmator:

Concluzii

Atât partea de hardware, cât și cea de software au necesitat foarte multe ore de lucru, totuși partea de hardware a durat simțitor mai mult decât partea de software. Deoarece realizatul conxiunilor între pini cu fire lipite era mult prea dificil, încurcat și existau foarte mari sanșe să apare situatții de a face masă unde nu te așțepți (și foarte inestetic), probleme de care m-am lovit deoarece inițial am încercat să realizez toate conexiunile prin fire, dar după foarte mult timp pierdut și un progres foarte mic, am ales folosirea a două plăcuțe de cupru, pentru crearea două cablaje imprimat. Totuși conexiunile dintre PCB, Joystick și montajul matricilor este realizată prin fire.

Acest proiect (deși nu mi s-a părut unul nici pe departe ușor) m-a învățat să proiectez și gândesc toată partea de hardware, precum și înțelegerea mai bine a programării software pe microcontrolere.

Proiectul este final și îndeplinește toate cerințele funcționale minimale.

Download

Jurnal

1. Alegerea proiectului.
2. Discutarea cu asistentului a componentelor necesare.
3. Schema electrică.
4. Comandarea componentelor.
5. Încercarea de realizare a cablajului folosind plăcuțe de test și fire.
6. Renunțarea la plăcuțele de test după ce am dezlipit piesele puse.
7. Căutarea unei soluții alternative.
8. Studierea cablajului imprimat.
9. Mici modificări aduse schemei electrice.
10. Realizarea unui cablaj imprimat.
11. Proiectarea software.
12. Mici modificări la conexiunea componentelor.
13. Terminarea proiectului.
14. Testarea proiectului.

Bibliografie/Resurse

pm/prj2019/apredescu/battleships-led.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