Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pm:prj2026:alexandru.jipa2803:acondorache [2026/05/12 17:36]
acondorache [Hardware Design]
pm:prj2026:alexandru.jipa2803:acondorache [2026/05/23 20:41] (current)
acondorache [Concluzii, Rezultate]
Line 5: Line 5:
 ===== Descriere generală ===== ===== Descriere generală =====
 Sistemul este compus din următoarele componente: Sistemul este compus din următoarele componente:
- 
-  * Bloc de control pentru mișcare: microcontrolerul ATmega328P primește input de la joystick și keypad și transmite comenzile prin UART către placa principală Arduino Mega. De asemenea, acesta primește mesaje de la Arduino Mega pentru activarea buzzerului atunci când este necesar. 
   * Joystick-ul este utilizat pentru controlul mișcării caracterului din joc.   * Joystick-ul este utilizat pentru controlul mișcării caracterului din joc.
   * Keypad-ul este folosit pentru atacarea inamicilor și pentru interacțiunea cu diferite elemente din joc.   * Keypad-ul este folosit pentru atacarea inamicilor și pentru interacțiunea cu diferite elemente din joc.
-  * Bloc de control ​pentru display: Arduino Mega se ocupă de afișarea sprite-urilor pe ecran. ​Acesta primește comenzile prin UART de la cealaltă placă și mută jucătorul sau realizează interacțiuni cu elementele din joc în funcție de acestea.+  * Bloc de control ​principal: Arduino Mega se ocupă de afișarea sprite-urilor pe ecran. ​La controler sunt conectate joystickul, keypadul si buzzerul ​
   * TFT Shield v2.2 este utilizat pentru conversia nivelului de tensiune de la 5V la 3.3V, deoarece pinii ecranului funcționează la 3.3V.   * TFT Shield v2.2 este utilizat pentru conversia nivelului de tensiune de la 5V la 3.3V, deoarece pinii ecranului funcționează la 3.3V.
   * Ecranul TFT LCD de 3.2 inch afișează harta, jucătorul și inamicii.   * Ecranul TFT LCD de 3.2 inch afișează harta, jucătorul și inamicii.
Line 18: Line 16:
 {{:​pm:​prj2026:​alexandru.jipa2803:​acondorache:​proiect.png?​800|}} {{:​pm:​prj2026:​alexandru.jipa2803:​acondorache:​proiect.png?​800|}}
  
-Ecranul este conectat ​in modul 16-bit paralel la Arduino Mega. Pinii ecranului ​efectuează comunicarea ​la 3.3V dar plăcuța ​dă output ​la 5V, astfel pentru ​face legătura între ​ecran și microcontroler ​am utilizat TFT Shield V2.2. Astfel Shield-ul se conectează la plăcuță astfel: +Ecranul ​ILI9341 TFT LCD Display Module ​este conectat ​în modul 16-bit paralel la un Arduino Mega 2560. Pinii de comunicație ai ecranului ​funcționează la 3.3V, în timp ce plăcuța ​oferă semnale ​la 5V. Pentru ​realiza conexiunea dintre ​ecran și microcontroller ​am utilizat ​un TFT Shield V2.2, care realizează conversia nivelurilor ​de tensiune.
-  * Ocupă toți pinii de power +
-  * Folosețe pinii digitali de la 0 la 7 si pinii digitali de la 22 la 53 +
-Această mapare a pinilor nu a fost făcută de mine shield-ul are doar un mod de conectare la Arduino Mega.+
  
-De la shield la ecran: +Shield-ul se conectează ​la plăcuță astfel: 
-  * Am conectat pinii **DB0-DB15** pentru modul 16-bit paralel + 
-  * Pinii **CS RD WR CS** pentru ​a folosi biblioteca de desenare +  * Ocupă toți pinii de power; 
-  * Pinii de **VDD** ​si **GND** pentru ​power+  * Utilizează pinii digitali 0–7 și 22–53. 
 + 
 +Această mapare a pinilor nu a fost realizată manual, deoarece ​shield-ul permite un singur mod de conectare ​la Arduino Mega. 
 + 
 +Conexiunile dintre shield și ecran sunt următoarele: 
 + 
 +  * Pinii **DB0DB15** ​sunt utilizați ​pentru ​comunicația în modul 16-bit paralel; 
 +  * Pinii **CSRDWR** și **RS** sunt utilizați ​pentru ​controlul ecranului și pentru funcționarea bibliotecii grafice; 
 +  * Pinii **VDD** ​și **GND** ​sunt utilizați ​pentru ​alimentare;​ 
 +  * Pinii **CLK, MOSI, MISO** și **SDCS** sunt utilizați pentru comunicarea cu slotul de card SD, necesar salvării datelor persistente. 
 + 
 +Pentru conectarea joystick-ului am utilizat: 
 + 
 +  * **A0** pentru VRx; 
 +  * **A1** pentru VRy. 
 + 
 +Acești pini au fost aleși deoarece semnalele VRx și VRy sunt citite analogic. 
 + 
 +Pentru conectarea keypad-ului am utilizat: 
 + 
 +  * Pinii **A8–A11**,​ câte unul pentru fiecare buton (1–4). 
 + 
 +Acești pini au fost aleși deoarece suportă întreruperi de tip PCINT, necesare pentru detectarea apăsării butoanelor. 
 + 
 +Buzzer-ul a fost conectat la pinul digital 13, deoarece este necesar un pin cu suport PWM pentru controlul acestuia. 
 + 
 + 
 +{{:​pm:​prj2026:​alexandru.jipa2803:​acondorache:​whatsapp_image_2026-05-16_at_23.07.51.jpeg?​400|}}
 ===== Software Design ===== ===== Software Design =====
  
 +== Mediu de dezvoltare: ==
 +  * Neovim + PlatformIO
 +  * C/C++
  
-<note tip> +== Librarii si surse utilizate== 
-Descrierea codului aplicaţiei (firmware)+  * UTFT: biblioteca a fost folosita pentru a desena sprite-urile pe ecranAm folosit aceasta biblioteca deoarece are suport pentru 16 bit parallel care a fost modul de conectare a ecranului cu microcontrolerul Arduino Mega.
-  * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) +
-  * librării şi surse 3rd-party (e.gProcyon AVRlib) +
-  * algoritmi şi structuri pe care plănuiţi să le implementaţi +
-  * (etapa 3) surse şi funcţii implementate +
-</​note>​+
  
-===== Rezultate Obţinute ===== 
  
-<note tip> +== Functionalitati din laborator: == 
-Care au fost rezultatele obţinute în urma realizării proiectului vostru. +  * ADC: Joystickul are 2 pini VRx si VRy care sunt conectati la 2 pini analogi de pe controler si folosesc adc pentru a dectecta daca joystickul s-a mutat sau nu 
-</​note>​+  * Timere: pentru a comuta frecventa buzzer-ului 
 +  * GPIO: Pentru a controla componenetele prin registri 
 +  * Intreruperi:​ pentru a determina daca un buton de pe keyboard sau pentru a citi valorile de pe joystick sunt am folosit intreruperi pentru ca nu am vrut sa am operatii blocante in ciclul principal al jocului astfel jocul ar fi avut micro lag-uri in timpul jocului
  
-===== Concluzii =====+== Flow-ul jocului: ​== 
 + La pornirea jocului se aude un sunet de la buzzer care semnalizeaza inceperea partidei. Apoi se incarca primul nivel, iar jucatorul intra efectiv in joc care poate dura atata timp cat doreste. La final daca hp-ul jucatorului a ajuns la 0 atunci apare un ecran de Game Over care arata cate camere a parcurs si cati inamici a invins. Aceste statistici sunt afisate pentru a permite inregistrarea recordurilor astfel ca player-ul sa aiba motivatia sa joace din nou.
  
-===== Download =====+== Implementarea jocului: ​==
  
-<note warning>​ +Pentru a implementa jocul am definit ​mai multe clase pentru a modulariza codul: 
-O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării ​proiectului: ​surse, schemeetcUn fişier README, un ChangeLog, un script ​de compilare şi copiere automată ​pe uC crează întotdeauna ​impresie bună ;-).+  * **Keypad**: aceasta clasa se ocupa de functionalitatea keypad-ului. In cadrul ​proiectului ​am folosit un keypad 1x4. Pentru inceput clasa initializeaza registrii corespunzatori pinilor la care este conecata keypad-ul la microcontroler. Apoi prin functia **getKey** se determina ce buton a fost apasat. Verificarea daca un buton a fost apasat se procude in interiorul unei intreruperi. 
 +  * **Joystick**aceasta clasa se ocupa de functionalitatea joystick-ului. Clasa initializeaza registrii corespunzatori pinilor de pe placuta. Apoi prin intermediul functiilor **getX** si **getY** determina pozitia joystickului. Citirea pentru valorile din joystick se fac intr-o intrerupere ADC care se intampla de fiecare data cand conversia ADC sa terminat. Astfel initial citest X apoi fac switch pe canalul pentru Y si citesc Y si fac switch pe canalul lui X si tot asa. Am folosit aceasta intrerupere deoarece nu am vrut ca citirea joystick-ului sa fie o operatie blocanta ci sa fie facut de hardware. 
 +  * **DrawUtils**:​ aceasta clasa se ocupa de desenarea imaginilor pe ecran. Este un mini engine pentru a desena. Pentru inceput clasa intializeaza ecranul. Apoi in clasa principala **Game** utilizez functiile din aceasta clasa pentru de desena blocuriinamici pe ecran in pozitii predefinite. 
 +  * **Game**: aceasta este clasa care se ocupa de logica jocului. 
 + 
 +== Implementarea clasei Game: == 
 +In aceasta sectiune voi descrie functiile principale din cadrul clasei Game 
 +  * initGame: initializeaza toate resursele cum ar fi joystick-ulkeypad-ul, ecranul si se deseneaza primul nivel al jocului care este un fel de tutorial unde jucatorul se poate obisnui cu controalele din joc. 
 +  * loop: game loop-ul principal aici se face efectiv update la toti inamiciiplayer, detecteaza coliziuni. Citeste input-urile de la player pentru a le executa in joc 
 +  * resetGame: daca jucatorul a pierdut are optiunea de a da restart la joc pentru a reconecta placuta la sursa de curent sau pentru a nu da upload din nou la cod. Aici hp-ul, attack power-ul jucatorului sunt resetate si totul incepe de la nivelul initial. 
 +  * updatePlayerPos,​ updateEnemies,​ updateProjectiles:​ aceste functii fac update la pozitia jucatorului,​ inamicilor, personajului principal verificand pe parcurs coliziunea cu blocurile, alti inamici. 
 +  * drawLevel: fiecare nivel este reprezentat in forma ascii intr-o matrice 14x10 unde # reprezinta bloc obisnuit, P pozitia la jucator, E inamici, C chest-uri cu diferite upgrade-uri. aceasta functie parcurge toata matricea si deseneaza nivelul 
 +  * interactChest:​ in joc exista 2 stats-uri hp-ul jucatorului si puterea lui de atac adica cat damage da cand un proiectil a avut o coliziune cu un inamic. Cand jucatorul interactioneaza cu un chest atunci in mod random se va decide ce fel de resursa va primi jucatorul 
 +  * pickNextLevel:​ aceasta functie se asigura ca urmatorul nivel care va fi in joc poate fi conectat cu precedentul. Astfel daca jucatorul a intrat ​pe usa de sus atunci trebuie sa asigur ca urmatorul nivel tot are usa din partea de sus a nivelului. Plus aceasta functie asigura faptul ca nivelurile cu chest-uri si fara chest-uri vor aparea balansat adica nu va fi situatia in care jucatorul da de 5 camere la rand cu chest-uri. 
 + 
 +Jocul functioneaza asa cum mi-am propus deoarece am facut mai multe expeditii in care am explorat mai multe camere, inclusiv interactiunea cu inamicii, chest-uri si proiectile. 
 + 
 +== Optimizari facute: == 
 +Desi Arduino Mega are 8 KB de SRAM pentru jocul meu aceasta dimensiune este prea mica. Astfel m-am folosit de memoria flash a microcontrelui. Toate sprite-urile folosite in jocul meu au fost incarcate in memoria flash folosind in cod atributul PROGMEM. Fiecare sprite are in medie dimensiunea 24x24 pixeli. Nivelele tot sunt salvate in memoria flash. Am in total 30 de nivele, initial jucatorul se afla la nivelul 0 care este practic gol, in acest timp urmatorul nivel este deja decis, care va fi nivelul urmator este ales la random. 
 + 
 +Miscarea entatilor pe ecran este la fel optimizata. Astfel este redesenat doar dreptunghiul din ecran care se modifica si este marginit de pozitia veche si pozitia noua a entitatii. Apoi sprite-urile sunt reprezentate ca niste vectori de 32x32, 16x16, 24x24 elemente dar au si portiuni care sunt transparente astfel am ales culoare care va reprezenta ca acel pixel este transparent si astfel el nu va fi desenat. Astfel am incercat sa compensez faptul ca placuta are o frecventa a procesorului mai mica ca un procesor normal si sa nu am ca personajul apare si dispare de pe ecran, dar se modifica doar acei pixeli care trebuie redesenati. 
 + 
 + 
 + 
 +===== Concluzii, Rezultate ===== 
 + 
 +Acest proiect m-a ajutat foarte mult sa inteleg cum sa folosesc mai bine microcontrolerele cum ar fi Arduino si cum sa lucrez cu un ecran care are un refresh rate mai mic 
 +Ca rezultate proiectul este finisat si jocul este interesant de jucat in timpul liber. 
 + 
 + 
 +Link demo: 
 +[[https://​drive.google.com/​file/​d/​1tccLH1Gs1xAEqbNDfu5Hg3Xr-CNV5Sut/​view?​usp=drive_link|demo]] 
 +===== Download =====
  
-Fişierele se încarcă pe wiki folosind facilitatea **Add Images or other files**. Namespace-ul în care se încarcă fişierele este de tipul **:pm:prj20??:c?** sau **:​pm:​prj20??:​c?:​nume_student** (dacă este cazul)**Exemplu:​** Dumitru Alin, 331CC -> **:​pm:​prj2009:cc:dumitru_alin**. +{{:pm:prj2026:alexandru.jipa2803:acondorache:dungeonexplorer.zip|}}
-</​note>​+
  
-===== Jurnal =====+[[https://​github.com/​SanduCondorache/​DungeonExplorer]]
  
-<note tip> 
-Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. 
-</​note>​ 
  
 ===== Bibliografie/​Resurse ===== ===== Bibliografie/​Resurse =====
  
-<​note>​ +[[https://​docs.arduino.cc/resources/​datasheets/​A000067-datasheet.pdf|Arduino Mega datasheet 1]]
-Listă cu documente, datasheet-uri,​ resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. +
-</note>+
  
-<​html><​a class="​media mediafile mf_pdf"​ href="?​do=export_pdf">​Export to PDF</a></html>+[[https://ww1.microchip.com/​downloads/​en/​devicedoc/​atmel-2549-8-bit-avr-microcontroller-atmega640-1280-1281-2560-2561_datasheet.pdf|Arduino Mega datasheet 2]]
  
 +[[https://​forum.arduino.cc/​uploads/​short-url/​fTrC55TqThgJtzQom9cJ1APwmty.pdf|TFT Shield v2.2]]
  
pm/prj2026/alexandru.jipa2803/acondorache.1778596585.txt.gz · Last modified: 2026/05/12 17:36 by acondorache
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