Whack the Weasel

Descriere generală

Acest proiect reprezintă o replică a jocului “Whack the Weasel”, in care jucătorul trebuie să lovească în cap, veveriță fictivă când aceasta iese din scorbură. Din diverse motive nu am putut să realizez plăcuța cu diverse găuri și/sau să folosesc fel de fel de motorașe, am simulat gaurile cu LED-uri stinse, bâta cu butoane și faptul că nevăstuica apare din scorbură cu aprinderea LED-ului.

Schema Generală

Schema este destul de simplă, butoanele se conectează prin pinii de tip A la placa de bază, în timp ce LED-urile așteaptă mesaje pe pinii de tip C.

Poze proiect

Placuța de bază

Plăcuța cu led-ul și butoanele (față)

Plăcuța cu led-ul și butoanele (spate)

Varianta finală

Mod de desfășurare al jocului

Inițial toate LED-urile sunt deschise, până când jucătorul apasă pe cel mai din stânga buton (butonul 0). Jocul începe apoi, la fiecare pas, acesta trebuind să apese pe LED-ul aprins corespunzător. La fiecare pas va fi un singur LED aprins pentru o cuantă de timp iar jucătorul va pierde jocul direct doar dacă nu va apăsa pe butonul corespunzător LED-ului, în timp util, moment în care jocul va reîncepe.

Specificații Hardware

  • 8 LED-uri
  • 8 butoane simple
  • 8 rezistențe 100 Ω
  • 8 rezistențe 1K Ω
  • Baretă pini de conectare

Design Software

Programul reprezintă defapt un controller ce se ocupă cu medierea timpului în care LED-urile sunt aprinse și apăsarea de butoane.

La începutul programului se inițializează port-urile comunicație.

/* PORT A - IN */
DDRA = 0x00;
/* PORT C - OUT */
DDRC = 0xFF;
/* Pull-Up on PORT A */
PORTA = 0xFF;

În codul de mai jos se găsește logica aplicației, unde se aprinde un LED și se așteaptă apăsarea unui buton, după care se testează corectitudinea apăsării. În caz ca apăsarea a fost corectă se va decrementa timpul în care LED-ul e aprins.

PORTC=OFF;
turn_on_led(BIT0);
current_led = 0;
while(1){
	button = wait_for_button_press(current_led);
	if(button == -2){
		/* Game Over */
		break;
	}
	/* The button was pressed correctly */
	if(button != -1)
	{
		if(button != current_led){
			/* Game over */
			break;
		} else {
			/* The button has been correctly matched */
			time_q = time_q_size;
			if(++how_many_suc == 3){
				how_many_suc = 0;
				if(time_q_size > 100000){
					if(current_led == 3 || current_led == 6 || current_led == 7)
						time_q_size -= 200000;
				  else
						time_q_size -= 100000;
				}
				else if(time_q_size > 10000)
					time_q_size -= 10000;
				else
					time_q_size -= 100;
			}
			current_led = select_next_led();
		}
	}
}

Concluzii

Proiectul a fost unul foarte distractiv întrucât pentru mine a fost primul proiect ce implică lipit plăcuțe și programare “low-level”.

Download Proiect

Bibliografie

pm/prj2012/pbara/whack-the-weasel.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