Toma Mihai Dragos 332CB
Joc snake
Introducere
Ce face:
Proiectul meu implică construirea unei plăci Arduino cu un display LCD și funcționalitatea de a juca jocul Snake, însoțit de efecte sonore/muzic fundal. Utilizatorul poate controla direcția șarpelui din joc folosind butoanele, iar difuzorul redă sunetele custom implementate de mine.
Scopul:
Scopul proiectului meu este de a crea o experiență de divertisment interactivă și personalizată. Integrând jocul clasic Snake, îmi propun să combin pasiunea pentru tehnologie și programare cu o creativitatea.
Idea inițială:
Ideea a pornit de la dorința mea de a explora posibilitățile Arduino și de a-mi pune abilitățile de programare la încercare într-un mod distractiv și creativ. Jocul Snake, fiind unul dintre primele jocuri pe care le-am jucat, a fost alegerea perfectă pentru acest proiect.
Utilitate personală:
Consider că acest proiect este util pentru mine, deoarece îmi oferă o oportunitate de a învăța și de a experimenta cu tehnologia Arduino într-un mod practic și distractiv. În plus, finalizarea proiectului îmi va oferi o satisfacție personală și o realizare în domeniul hobby-ului meu.
Descriere generală
Ideea mea este in felul urmator: jucatorul are 4 buatone la dispozitie si apasa unul dintre ele pt a schimba directia sarpelui pe display. Vreau sa am o muzica de fundal care sa cicleze intre melodii, si poate chiar efecte sonore. MP3 player o sa aiba un sd card cu aceste sunete (muzica de fundal). O sa am si mai multe nivele in care sarpele se va misca cu viteze diferite. Un led RGB o sa zica la ce nivel esti prin 3 culori: albastru - 1, verde - 2, rosu - 3
Hardware Design
Piese:
Schema electrica
1. LCD 5110 Nokia
Acesta l-am conectat la niste pini digitali de pe arduinoul meu si am folosit libraria Adafruit_PCD8544 pt a citi informatia si a da diferite outputuri pe ecranul meu. Pini folositi de pe arduino sunt: D2-D6 5 pini digitali pt a initaliza LCD, unul pt alimentare VCC, unul pt ground si unul de lumina pe care l-am conectat la 3.3v impreuna cu cel de VCC (merge si la 5v, dar am pus la 3.3v)
2. Cele 4 butoane
Aici am 4 butoane cu cate 2 pini. Unul il conectez la pinul analog pe care il convertesc la digital si celalat in ground din breadboard (o sa se vada in poza). Pini folositi A0-A3
3. DFPlayer Mini MP3 Player
Am conectat 5 pini aici: TX si RX pe 10 si 11 si le-am configurat eu si speakerul in MP3 player. Am mai pus VCC si ground si inca un pin, BUSY,
care ma ajuta sa vad cand s-a terminat o melodie
4. Difuzor
Acesta este conectat in MP3 player pt a putea pune muzica
5. LED RGB
Acest led se aprinde pentru fiecare nivel:
Software Design
Mediu de Dezvoltare (IDE): Arduino IDE 2.3.2
Librării Utilizate:
DFRobotDFPlayerMini.h: Utilizată pentru controlul modulului DFPlayer Mini MP3.
SPI.h: Utilizată pentru comunicarea SPI cu diverse componente.
Adafruit_GFX.h: Oferă funcții grafice generale pentru afișaje.
Adafruit_PCD8544.h: Specifică pentru afișajul LCD Nokia 5110.
SoftwareSerial.h: Permite comunicarea serială pe alte pinii decât cei standard.
Structura pentru Snake:
Structura Point pentru a reprezenta coordonatele (x, y) ale șarpelui și ale mâncării.
Array snake pentru a stoca segmentele șarpelui.
Variabila snakeLength pentru a stoca lungimea actuală a șarpelui.
Variabila food pentru a stoca poziția mâncării.
Variabila direction pentru a stoca direcția de deplasare a șarpelui.
Algoritmi Implementați:
Plasarea Mâncării: Funcția placeFood() generează poziții aleatorii pentru mâncare și verifică dacă acestea nu se suprapun cu corpul șarpelui.
Gestionarea Intrării: Funcția handleInput() gestionează apăsările butoanelor pentru a schimba direcția șarpelui.
Mișcarea Șarpelui: Funcția moveSnake() actualizează pozițiile segmentelor șarpelui pe baza direcției.
Desenarea Jocului: Funcția drawGame() desenează șarpele și mâncarea pe afișaj.
Coliziuni: Funcția checkCollision() verifică coliziunile șarpelui cu pereții sau cu propriul corp și resetează jocul în caz de coliziune.
Niveluri și Muzică: Funcția checkMusicFinished() verifică starea de finalizare a melodiei și redă melodii specifice pentru fiecare nivel.
Funcții și Detalii Implementate
Funcția setup():
Inițializează comunicarea serială.
Inițializează modulul MP3 și afișajul LCD.
Configurează pinii pentru butoane și lumini RGB.
Apelează funcția start_game() pentru a inițializa jocul.
Funcția start_game():
Setează parametrii inițiali pentru joc (interval de mișcare, scor, upgrade).
Afișează mesajul “Start Game” pe ecran și redă o melodie de start.
Realizează un countdown de la 3 la 1.
Funcția placeFood():
Funcția handleInput():
Funcția moveSnake():
Funcția drawGame():
Funcția checkCollision():
Funcția resetGame():
Funcția checkMusicFinished():
Funcția loop():
Gestionează intrările utilizatorului.
Actualizează starea jocului în funcție de scor și nivele.
Verifică coliziunile și mișcă șarpele la intervale de timp specifice.
Verifică și redă muzica adecvată pentru fiecare nivel.
Concepte folosite:
GPIO: (General Purpose Input/Output):
GPIO reprezinta o parte esentiala a interactiunii mele cu mediul exterior al placii Arduino. Am utilizat GPIO pentru a permite controlul butoanelor de directie si al LED-ului RGB, facilitand astfel interactiunea mea cu jocul. Prin intermediul pinilor GPIO, pot detecta apasarile butoanelor si pot controla luminozitatea si culoarea LED-ului in functie de evenimentele din
UART:
Comunicatia seriala este un aspect crucial al proiectului meu, iar UART este modalitatea prin care realizez aceasta comunicare intre Arduino si player-ul MP3 DFPlayer Mini. Folosind portul serial software si biblioteca dedicata, pot trimite si primi comenzi catre player-ul MP3, controland astfel redarea melodiilor si volumul.
Timere:
Pentru a gestiona miscarea sarpelui si actualizarea starii jocului, am utilizat timere pentru a programa actiuni periodice. Aceste timere imi permit sa controlez intervalul de timp in care se misca sarpele si sa actualizez ecranul jocului in mod regulat, oferind o experienta fluida si placuta.
SPI (Serial Peripheral Interface):
SPI este un alt concept esential in proiectul meu, folosit pentru a comunica cu afisajul LCD Nokia 5110. Aceasta interfata seriala permite transferul rapid de date intre Arduino si LCD, facilitand afisarea informatiilor pe ecranul jocului. Folosind biblioteca Adafruit_PCD8544, am gestionat comunicarea SPI pentru a desena grafica jocului si pentru a afisa diverse mesaje si informatii.
Github:
https://github.com/TomaDragos1/Snake-Game
Rezultate obtinute
Concluzii
Un proiect cu adevarat captivant, in care am reusit sa aplic tot ceea ce am invatat la curs si in laborator. Mi-a placut in mod deosebit partea de hardware, cu toate provocarile pe care a trebuit sa le rezolv.
Jurnal
Timeline:
15.04.2024 - Alegere tema proiect
17.04.2024 - Cumparare piese
03.05.2024 - Finalizare M1 (documentatia initiala)
15.05.2024 - Asamblare piese si testarea lor
16.05.2024 - Documentatie hardware
22.05.2024 - Finalizare parte Software
24.05.2024 - Documentatie software
Bibliografie
Biblioteci:
Software:
Hardware: