Proiectul presupune un joc de memorie. Microcontroller-ul va genera secvente aleatoare de litere pe care o va afisa pe ecran litera cu litera. Utilizatorul are la dispozitie un set de butoane pe care trebuie sa le apese in ordinea corecta pentru a reprezenta secventa. Daca greseste, atunci se va genera un sunet specific si se va scadea o viata. Jocul va avea un singur mod : Endless, care presupune ca jocul tine pana cand jucatorul ramane cu 0 vieti. Pentru modul Endless va exista un sistem de score si highscore si un sistem de nivele in care creste dificultatea in mod liniar : secvente mai lungi, timp mai scurt de raspuns. Jocul va dispune si de un meniu, care va contine cateva setari de baza : exit, play (1 singur mode momentan deci nu e necesar mai mult), time (se afiseaza ora si data pentru un interval de 5 secunde), hscore (se afiseaza highscore-ul pentru un interval de 5 secunde). De asemenea, in spate se vor crea fisiere de logging pentru a putea retine toate interactiunile dintre jucator si calculator : input-uri, output-uri, intreruperi etc.
Scopul acestui joc este de a testa memoria vizuala a jucatorului sau memoria auditiva a acestuia si de a te relaxa dupa o zi foarte grea de munca.
Am pornit de la ideea de a face o reprezentare la pian ale unor soundtrack-uri(MP3 to Piano Version), Ideea mi s-a parut interesanta dar cum o simpla convertire din note muzicale in afisaj pe display proiectul ar fi fost unul 95 % soft si fara nicio interactiune cu utilizatorul / mediul extern, ceea ce nu ar fi fost ideal pentru un proiect de PM, asa ca am ales sa gandesc un proiect care sa combine joaca, dar si care sa aduca putin spre muzica.
Acest proiect nu este util pe domeniul tehnic, dar este util pe domeniul psihologic deoarece te poate scapa de stres, te poate ajuta sa iti testezi memoria si coordonarea creier - maini si multe altele.
Schema bloc
Jocul ofera o comunicare prin semnal analog intre user si microcontroller, user-ul folosind o mini tastatura formata din 6 butoane. De asemenea, user-ul poate comunica si prin folosirea a 3 butoane conectate digital la Arduino, butoane ce sunt pentru a naviga cu usurinta prin meniul de setari.
Jucatorul poate naviga printr-un meniu simplu cu 4 setari, de unde poate sa si porneasca jocul apasand pe optiunea de “play”. Odata apasata aceasta optiune jocul inccepe de la nivelul 0. Microcontroller-ul va genera o secventa de caractere random pe baza unui functii f(x, y) ce primeste ca input valoarea data de senzorul de temperatura si valoarea senzorului de lumina. Vom trata aceasta functie ca un blackbox in spatele jocului deoarece ne dorim ca jocul sa nu redea o secventa previzibila pentru jucator. Jucatorul trebuie sa tasteze, folosind cele 6 butoane, in ordinea corecta literele generate de Arduino. In caz contrar se scade o viata din totalul de vieti al jucatorului si se repeta secventa generata. Jocul se termina cand player-ul ramane cu 0 vieti, urmand ca acesta sa fie intampinat de un meniu ce ii ofera posibilitatea de a relua jocul sau de a merge inapoi in meniul de setari.
Acesta este proiectul complet in format fizic:
Lista de piese:
Schematic:
Aici evidentiez o rulare a jocului care afiseaza pe seriala cat si pe cardul usb in fisierul de log aferent mesaje de logging:
Pentru acest proiect am dedcis sa lucrez cu Arduino IDE. De asemenea, pentru a putea rula jocul cu usurinta tot ce trebuie facut e sa descarcati arhiva cu proiectul, sa includeti libraria in folder-ul “libraries” din folder-ul Arduino si sa rulati exemplul sugerat de IDE “Run game”. Astfel, pentru a facilita utilizarea si rularea cu usurinta a proiectului codul este structurat in 2 fisiere:
Pentru a putea organiza mai usor structura proiectului am facut 3 clase majore :
Acestea sunt toate functiile si variabilele ce se pot accesa:
#include <MemoryGame.h> MemoryGame *game = new MemoryGame(); ISR(TIMER1_COMPA_vect) { // Interrupt code game->g_sleepPeriod = game->g_sleepPeriod + 1; game->setGreenValue(game->getGreenValue() - 30); } void setup() { game->init(); } void loop() { game->draw(); game->update(); game->input(); }
Jocul este mai mult un state machine. Asteapta input si pe baza acestuia schimba sau nu starea jocului.
Dupa cum se poate observa, meniul de setari se acceseaza pur si simplu apasand butonul digital din mijloc. Aici ne putem plimba cu un cursor care selecteaza o setare din cele 4 disponibile : exit, play, time, hscore. Apasarea din nou a butonului digital din mijloc va duce jocul in starea aferenta setarii. Jocul sta doar 5 secunde in starile TIME_SHOW si SCORE_SHOW, iar in starea RUNNING incepe jocul. Aici e mai mult un ciclu de stari care se repeta la nesfarsit sau pana cand jucatorul ramana cu 0 vieti:
Jocul functioneaza conform asteptarilor, fara bugg-uri mari la input, dar exista niste probleme pe care nu am stiut cum sa le abordez:
Overall, iata un video care arata modul in care functioneaza jocul:
A fost frumos sa lucrez la acest proiect. Am invatat cum comunica componentele intre ele si acesta este si primul proiect fizic pe care il fac. Codul este usor de modificat in caz ca s-ar dori sa se adauge noi moduri de joc si noi functionalitati, dar trebuie optimizat din cauze lipsei de memorie pe care microcotroller-ul o duce (in momentul actual codul ocupa fara sa ruleze in jur de 80% din memorie). As fi dorit sa am un buzzer mai puternic deoarece accesta pe care l-am achizitionat nici in video-ul de prezentare nu se aude, dar singura varianta era un buzzer pasiv deoarece aveam nevoi de sunete diferite in functie de ce tasta analog s-a apasat.
Resurse hardware:
Resurse software: