Minimalist Piano Tiles
Nume: Vasilache Maria-Augusta
Grupa: 331CB
Îndrumător: Cristian Contășel
Introducere
Proiectul are ca finalitate un joc cu doua moduri: Piano Tiles si Nostalgia. Într-o nota mai minimalistă, jocul Piano Tiles se rezumă la sincronizarea apăsării unor butoane cu apariția clapelor pe un display. Pentru a marca finalul unui joc, se vor aprinde niște leduri, ori verde, ori roșu, în funcție de câștig. Nostalgia este un adaos pentru jucător, acesta putând să redea piese vechi românești cu ajutorul unui card SD.
Scopul principal al proiectului este de a întoarce în trecut user-ul, fie prin piesele vechi, fie prin jocul foarte popular prin 2014.
Descriere generală
Proiectul va fi realizat cu ajutorul plăcuței Arduino UNO. Având un display și 3 butoane sincronizate, voi realiza jocul propriu-zis, iar câștigul îl voi marca prin ledurile care se vor aprinde verde sau roșu. Câștigul jocului e determinat de apăsarea corectă a butoanelor. Dacă se greșește de 3 ori, se ajunge la pierderea rundei. Redarea muzicii o voi face cu ajutorul unui SD card reader și al unui difuzor. Piesele disponibile pe cardul de memorie vor fi alese în urma unui sondaj de opinie. 'Skip song' va fi realizat cu ajutorul unui buton. Odată ajuns la finalul unei melodii, următoarea se va reda automat, pana la terminarea playlist-ului.
Hardware Design
Lista de componente și rolul lor:
placuță Arduino UNO: microcontroller-ul controlează activitatea celorlalte componente. Acesta primește input de la butoane și de la modul SD și oferă output spre led-uri, ecranul OLED și speaker;
breadboard: conectează componentele între ele și cu placa Arduino UNO;
display OLED: afișează matricea 3×3 a jocului și mesaje;
5 butoane: 3 dintre ele sunt folosite pentru jocul de Piano Tiles, unul este folosit pentru a face switch între moduri, iar ultimul oferă posibilitatea de a da Skip pieselor redate de pe cardul de memorie;
led roșu: anunță o greșeală făcută de user în timpul jocului;
led verde: anunță câștigarea rundei;
modul cititor card SD: ajută la citirea pieselor de pe cardul de memorie;
SD card: stochează piesele ce urmează să fie redate;
difuzor loudity ld-bzpn-2312: redă piesele;
rezistențe: limitează curentul electric care trece prin leduri și butoane (rezistență de pull-down);
fire: unește componentele.
Schema bloc
Schemă electrică
În schema de mai sus am ilustrat conexiunile dintre componente, o prezentare vizuală fiind mai sugestivă. Se pot observa pinii folosiți și cu ce componente sunt legați.
Descriere pini
Toate componentele sunt legate și la VCC și Ground.
Componentele și pinii folosiți:
display OLED: se folosește de protocolul I2C și se conectează la pinii A4 (pentru SCL - serial clock) și A5 (pentru SDA - serial data), ambii fiind pini analogici;
5 butoane: sunt conectate la pinii digitali 6, 7, 8, 9, 10, ca input;
ledurile: sunt conectate la pinii digitali 2 și 5 ca output;
modul cititor card SD: se folosește de protocolul SPI și se conectează la pinii 11 (pentru MOSI - Master Out Slave In), 12 (pentru MISO - Master In Slave Out), 13 (pentru SCK - Serial Clock) și 3 (pentru CS - Chip Select).
difuzor loudity ld-bzpn-2312: este conectat la pinul analog A1, ca output.
Merge?
Se poate observa că pe ecranul display-ului este afișat mesajul de început de joc.
Software Design
Inițial, am creat câteva variabile globale și define-uri pentru a fi mai ușoară accesarea lor. Acestea referă pinii conectați la componente, elemente ale jocului și modurile de redare.
Bibliotecile foloiste:
pentru funcționarea display-ului (afișarea datelor), am folosit bibliotecile Adafruit_GFX.h și Adafruit_SSD1306.h;
pentru comunicare I2C cu display-ul, am folosit biblioteca Wire.h
pentru comunicarea cu cardul SD, am folosit SD.h;
pentru comunicarea SPI cu SD card reader-ul, am folosit SPI.h;
pentru sunet, prin buzzer, am folosit TMRpcm.h.
Funcțiile implementate:
setup() - setez pinii ca INPUT/OUTPUT(butoanele ⇒ input; ledurile ⇒ output), pregătesc display-ul, speaker-ul și SD reader-ul spre a fi folosite (sunt definite global);
loop() - verific modul de redare (0 = PIANO_TILES; 1 = NOSTALGIA_PLAYER). În cazul în care se apasă Butonul 1, se face switch între acestea, iar apăsarea butonului 2 realizează intrarea în modul respectiv;
updateModeDisplay() - Înainte de a se porni modul de redare, pe display va apărea titlul modului ales pentru o mai ușoară gestionare a lor de către utilizator;
drawGameMatrix() - Se creează matricea pentru joc din pătrate. Pentru un 'tile', se va afișa un pătrat plin;
startPianoTilesGame() - Aici este prezentă logică jocului de Piano Tiles. Pe display va apărea o matrice 3×3, care va imita pianul. Ulterior se verifică daca butonul apăsat (Butoanele 3, 4 și 5) corespunde cu cel unde se află clapa pe ecran. În caz de eșec, se incrementează contorul 'misses' și se aprinde ledul roșu. Această variabilă este verificată constant, deoarece, ajunsă la 3, determină finalitatea jocului. Pentru 5 apăsări corecte se aprinde ledul verde, care marchează o rundă câștigată
startNostalgiaPlayerGame() - Se redau piesele citite de pe cardul de memorie. La apăsarea butonului 1, se oprește melodia și se iese din modul Nostalgia Player; la apăsarea butonului 2, se dă skip la piesa curentă; la apăsarea butonului 3, se pune pe pauză melodia.
Printre programele folosite se numără: Arduino IDE (pentru codare), Fritzing (pentru crearea schemei electrice) si draw.io (pentru crearea schemei bloc).
Rezultate Obţinute
Ca finalitate, s-a obținut un joc simpatic de Piano Tiles, generat random, care permite jucătorului să își pună la încercare atenția și reflexele.
Download
Jurnal
Bibliografie/Resurse