Mikele SHTEMBARI - Memory Game

Autorul poate fi contactat la adresa: Login pentru adresa

Introducere

Scopul proiectului este realizarea unui joc de memorie, jucat de un singur jucator.

Vor fi amplasate 8 leduri si 8 butoane (1 pentru fiecare led). In fiecare round un anumit pattern este afisat (determinat de aprinderea secventiala a ledurilor). Dupa afisare, jucatorul apasa pe butoanele respective fiecarui led. Exista si un buton petru a reseta jocul. De asemenea exista si un led RGB, care arata culori diferite in functia starii de program (e.g. Afisare unui pattern, asteptare apasare butoane de la jucator, joc pierdut, joc castigat) Exista si un sunet diferit pentru fiecare led cand aceste se aprind.

Aceasta idee a pornit de la un joc numit Simon. Mie imi place acest tip de joc (short-term memory).

Acest proiect poate fi util pentru cei care vor sa vada limitele memoriei sau short-term si, de ce nu, a imbunatati acest parte a memoriei.

Descriere generală

Schema bloc

Descriere

Jocul incepe imediat dupa aprinderea placutei. Se genereaza un pattern aleator destul de lung, care este salvat in memorie. In fiecare runda se aprind i+1 leduri. Dupa ce jucatorul apasa butoanele se verifica raspunsul. Intre timp, fiecare actiune (aprindere led, apasare buton, pierdere joc, castigare runda, etc) e insotita si cu un sunet de la un buzzer.

Hardware Design

  • placuta de baza cu toate componentele sale (http://cs.curs.pub.ro/wiki/pm/cablaj/proiect2015)
    Cost - 43 lei
  • 8 leduri monocolor
  • 1 led RGB
  • 8 butoane
  • 9 rezistente 100 ohm
  • 20 pini
  • 20 fire de legatura tip mama-mama
  • alte fire pentru conexiune
  • 1 buzzer
  • placuta de test
    Cost total (si cu placuta de baza) - 80 lei

Schema electrica

Software Design

Mediul de dezvoltare folosit

  • Eagle 7.3.0 (pentru schema electrica)
  • WinAvr20100110 (pentru compilare)
  • Programer's Notepad (editorul de text)
  • bootloadHID CLI (pentru incarcarea fisierului binar)

Functii si detalii implementare

In dezvoltarea codului am plecat de la scheletul de cod folosit in primele 3 laboratoare.

  • Dupa ce se genereaza o secventa cu 50 valori aleatoare intre 0 si 7 (care reprezinta ledurile),
    se activeaza toate porturile folosite, se initializeaza timerele si incepe jocul.
  • In functia play(sequence), pentru fiecare runda se parcurge secventa, afisand atat leduri cat si numarul rundei.
  • Dupa afisare, userul apasa pe butoane si programul face verificarea, o data ce se apasa numarul
    de butoante rescpetiv a rundei. Daca se potrivesc, se da un semnal de castig si trece la runda urmatoare.
    Altfel se da semnalul de pierdere si se iese.
  • Daca cineva castiga tot jocul (50 de cifre) atunci se da semnalul de castig al jocului si se iese
  • Pentru motive de testare, numarul rundelor se poate modifica in macro ROUNDS

Probleme

  • Secventa generata cu valori aleatoare intre 0 si 7 este de fiecare data acelasi, pentru ca in aceasta versiune de avr-gcc
    nu exista functia time() si srand() primeste acelasi seed de fiecare data. In mod normal ar trebui sa fie srand(time(NULL))
    unde time(NULL) intoarce o valoare noua in functie de ceasul sistemului.
  • Din cauza nefunctionarii a portului PA6 pentru led-ul numar 7, am fost obligat sa pun acest led la un alt port, anume PD0
    si astfel s-a complicat un pic partea de cod, e.g. cand un led se aprinde si se stinge:
void blink_led(int led, int i) {
	if(i == 6) {
		PORTD |= (1 << led);
		tone(notes[led]);
		_delay_ms(400);
 
		PORTD &= ~(1 << led);
		no_tone();
		_delay_ms(150);
		return;
	}
	PORTA |= (1 << led);
	tone(notes[led]);
	_delay_ms(400);
 
	PORTA &= ~(1 << led);
	no_tone();
	_delay_ms(150);
 
}
  • O alta problema a fost led-ul RGB nefunctional si pe care nu am avut timp sa-l inlocuiesc

Rezultate Obţinute

In rest, proectul functioneaza cum trebuie. Mai jos sunt niste poze si un video ce arata un test.


Concluzii

A fost un proiect interesant, in special partea hardware (lipirea componentelor), fiind pentru mine prima ora ce fac asa ceva. Chiar daca au aparut niste probleme hardware (portul PA6 nefunctional, led-ul rgb nefunctional,bootloadHIV GUI nefunctional) am reusit sa termin proiectul inainte de termenul limita si el sa functioneze cum trebuie.
Cred ca cu cunostintele luate acum si de la proiect, in viitor o sa fac si proiecte mai complicate cu microcontrolere.

Download

Schema in EAGLE: mg_msh_schema_elec.sch
Arhiva cu codul sursa: memory_game_shtembari_mikele_332cb.zip
Fisierus executabil: executabil.zip
Video test: https://youtu.be/wAdBj1Y2qDs

Jurnal

(2015)

  • Cumparare componente si placa de baza, creare document, alegere tema proiect: 20 Apr - 26 Apr
  • Lipire componente si testare placa de baza, completare informatii in wiki: 27 Apr - 3 Mai
  • Cumparare componente specifice proiectului si placa de test 4 Mai - 10 Mai
  • Lipire componente placa test, completare informatii in documentul wiki: 11 Mai - 17 Mai
  • Implementare software, testare, finalizare wiki: 18 Mai - 28 Mai
  • Prezentare proiect: 29 Mai

Bibliografie/Resurse

pm/prj2015/vghita/1001.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