This shows you the differences between two versions of the page.
pm:prj2021:agrigore:chromedinosaur [2021/05/24 12:39] mihai.pirvulet [Hardware Design] |
pm:prj2021:agrigore:chromedinosaur [2021/06/02 15:02] (current) mihai.pirvulet [Jurnal] |
||
---|---|---|---|
Line 8: | Line 8: | ||
{{:pm:prj2021:agrigore:1_82d2cg8gpe9cvisaph6rpg.gif?nolink&300|}} | {{:pm:prj2021:agrigore:1_82d2cg8gpe9cvisaph6rpg.gif?nolink&300|}} | ||
===== Descriere generală ===== | ===== Descriere generală ===== | ||
- | Se conectează la Arduino UNO un ecran LCD si butoane de up/down/left/right. Acestea vor fi butoanele care vor fi folosite la controlul jucatorului, fiind nevoie sa sara peste obstacole. De asemenea, va fi conectat si un buzzer pentru feedback audio in joc si eventual niste LED-uri pentru a marca diverse evenimente speciale in timpul jocului. | + | Se conecteaza la un Arduino UNO: un ecran LCD, un buton, un led RGB si un buzzer. Jocul este similar celui din browser atunci cand iti pica netul. Ai un personaj pe care il controlezi (l-am botezat "Jimmy", idk why) si trebuie sa sara peste obstacole generate random. La fiecare obstacol sarit cu succes primesti 1 punct. |
+ | |||
+ | LED-ul RGB indica dificultatea: verde - usor, galben - mediu, rosu - greu, si se schimba la pragul de 5, respectiv 10 puncte, ca sa mentina jocul interesant. Buzzerul e folosit pentru feedback atunci cand jucatorul sare sau primeste 1 punct, precum si un cantec de incurajare (sau troll) la final de joc. Potentiometrul e folosit la setarea contrastului ecranului LCD. | ||
=== Schema Bloc === | === Schema Bloc === | ||
- | {{:pm:prj2021:agrigore:dino_diagram.png?nolink|}} | + | {{:pm:prj2021:agrigore:schema_chrome2.png?nolink|}} |
===== Hardware Design ===== | ===== Hardware Design ===== | ||
Line 16: | Line 19: | ||
* Arduino UNO | * Arduino UNO | ||
* Ecran LCD | * Ecran LCD | ||
- | * Butoane | + | * Buton |
* Buzzer | * Buzzer | ||
- | * LEDs | + | * LED RGB |
+ | * Potentiometru 10k | ||
+ | * Rezistente | ||
* Fire mama-tata, tata-mama, tata-tata | * Fire mama-tata, tata-mama, tata-tata | ||
=== Schema Electrica === | === Schema Electrica === | ||
+ | |||
+ | == Versiunea initiala - Tinkercad == | ||
+ | |||
{{:pm:prj2021:agrigore:schema_electrica_dino.png?nolink&700|}} | {{:pm:prj2021:agrigore:schema_electrica_dino.png?nolink&700|}} | ||
Link Tinkercad pentru testare: [[https://www.tinkercad.com/things/e6jOlGlUE3u]]. Momentan este incarcat un cod de test al componentelor pentru a verifica faptul ca acestea sunt conectate corect. Logica de joc va fi implementata cand se va face trecerea in hardware. Posibile modificari ulteroare: mai multe butoane conectate similar si un led RGB. | Link Tinkercad pentru testare: [[https://www.tinkercad.com/things/e6jOlGlUE3u]]. Momentan este incarcat un cod de test al componentelor pentru a verifica faptul ca acestea sunt conectate corect. Logica de joc va fi implementata cand se va face trecerea in hardware. Posibile modificari ulteroare: mai multe butoane conectate similar si un led RGB. | ||
+ | == Versiunea finala - EAGLE == | ||
+ | |||
+ | {{:pm:prj2021:agrigore:schema_electrica_chromedinosaur.png?nolink&700|}} | ||
+ | |||
+ | Dupa implementarea efectiva a proiectului, am adus cateva modificari. Schema EAGLE reprezinta varianta finala, cu led RGB si pinii corecti. | ||
===== Software Design ===== | ===== Software Design ===== | ||
+ | == Medii de dezvoltare folosite == | ||
+ | * **Arduino IDE** - pentru programarea placutei Arduino | ||
+ | * **Draw.io** - pentru schema bloc | ||
+ | * **EAGLE & TinkerCAD** - pentru schemele electrice | ||
+ | == Biblioteci == | ||
+ | * **LiquidCrystal.h** - pentru interactiunea cu ecranul LCD | ||
+ | * **pitches.h** - pentru a reda cantece pe buzzer | ||
+ | |||
+ | == Descrierea Codului == | ||
+ | |||
+ | **Initializari** - inainte de orice functie, sunt cateva variabile care controleaza flow-ul si functionalitatea jocului. Cateva din acestea sunt: | ||
+ | * **tempo** - controleaza viteza cu care se reda melodia la final | ||
+ | * **melody** - notele melodiei folosind **pitches.h** | ||
+ | * **jimmy, jumpingJimmy, spike, fence** - sprite-uri pentru grafica LCD-ului | ||
+ | * **chance** - sansa ca la un tick de joc sa se genereze un obstacol | ||
+ | * **gameOver** - variabila de stare care retine daca jocul s-a terminat sau nu | ||
+ | * **tick** - cate milisecunde dureaza un tick de joc (viteza jocului) | ||
+ | * **score** - initializat cu 0, in functie de acesta va creste dificultatea | ||
+ | * pinii pentru fiecare componenta pentru a fi folositi ulterior in cod | ||
+ | |||
+ | == Functii == | ||
+ | * **setup()** - se initializeaza LCD-ul, sprite-urile, se seteaza dificultatea initiala pe easy (culoarea LED-ului verde) si se seteaza seedul pentru randomizarea jocului | ||
+ | * **loop()** - logica principala de joc, se verifica daca jocul s-a terminat, caz in care se afiseaza un ecran de game over. Altfel, se randeaza jocul, starea lui fiind retinuta in matricea **ecran[][]**, unde 0 = clear, -1 = jucator, orice altceva diferit de 0 obstacole, care sunt de 2 tipuri. De asemenea, se verifica apasarea butonului si executia logicii de sarit. | ||
+ | * **setColorRGB()** - functie ajutatoare pentru a seta valori pe ledul RGB din intervalul 0-255 pentru fiecare channel. | ||
+ | * **renderGame()** - randeaza starea jocului pe LCD | ||
+ | * **permutare()** - genereaza un nou frame al jocului. Mai intai da un random sa vada daca va genera un obstacol sau nu. Am adaugat un check sa nu se genereze prea multe obstacole la rand si jocul sa fie imposibil. Dupa asta, se actualizeaza starea jocului mutand toate elementele cu o pozitie mai la stanga (permutare la stanga, de unde si numele functiei). | ||
+ | * **lose()** - afiseaza ecranul de game over, seteaza culoarea LED-ului pe rosu si reda melodia de game over. | ||
+ | * **updateScore()** - actualizeaza scorul jucatorului daca a sarit cu succes peste un obstacol. De asemenea, creste dificultatea la pragurile de scor 5 si 10, schimband culoarea LED-ului in galben, respectiv rosu, alaturi de cresterea vitezei. | ||
+ | * **jump()** - logica de sarit, cu animatie pe LCD. | ||
+ | * **isObstacle()** - wrapper peste functia de random care returneaza 1 in functie de sansa setata daca trebuie generat un obstacol nou | ||
+ | * **generate()** - returneaza un tip de obstacol random din cele setate (am apucat sa fac doar 2, dar e usor sa se adauge unele noi). | ||
+ | * **playSong()** - functie ce reda o melodie definita folosind **pitches.h** | ||
+ | |||
+ | == Observatii == | ||
+ | * Mi s-a parut destul de greu sa fac jocul "playable", m-am jucat foarte mult cu parametri lui pana sa ajunga intr-o versiune decenta, sa nu fie nici prea plictisitor nici imposibil. | ||
+ | * Un aspect de implementare interesant mi s-a parut animatia de sarit a jucatorului, care a fost destul de dificila. | ||
===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
+ | Demo:[[https://youtu.be/Rp5U3N3E26o|https://youtu.be/Rp5U3N3E26o]] | ||
+ | |||
+ | {{:pm:prj2021:agrigore:chrome_demo.jpg?nolink&700|}} | ||
===== Concluzii ===== | ===== Concluzii ===== | ||
+ | Mie imi place ce a iesit, am stat o gramada sa configurez jocul sa fie cat de cat enjoyable (si usor addictive). Cred ca ar mai putea fi imbunatatita viteza de raspuns la inputul utilizatorului, dar overall mi s-a parut un proiect dragut care a rezumat bine ce am invatat la PM semestrul acesta. | ||
===== Download ===== | ===== Download ===== | ||
+ | {{:pm:prj2021:agrigore:proiect_chrome_dinosaur.zip|}} | ||
===== Jurnal ===== | ===== Jurnal ===== | ||
* 24 Aprilie - Alegere Tema Proiect | * 24 Aprilie - Alegere Tema Proiect | ||
* 27 Aprilie - Discutie cu laborantul + schimbare de la shield la componente individuale | * 27 Aprilie - Discutie cu laborantul + schimbare de la shield la componente individuale | ||
- | * 24 Mai - Schema Electrica | + | * 24 Mai - Schema Electrica varianta initiala |
+ | * 2 Iunie - Schema Electrica varianta finala | ||
+ | * 2 Iunie - Finalizare pagina wiki, upload cod, poze, demo, bibliografie | ||
===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
+ | * [[https://www.arduino.cc/en/Tutorial/LibraryExamples/HelloWorld|https://www.arduino.cc/en/Tutorial/LibraryExamples/HelloWorld]] | ||
+ | * [[https://www.arduino.cc/en/Tutorial/BuiltInExamples/toneMelody|https://www.arduino.cc/en/Tutorial/BuiltInExamples/toneMelody]] | ||
+ | * Laboratoarele de PM | ||
+ | |||
+ | |||
Pdf: https://ocw.cs.pub.ro/courses/pm/prj2021/agrigore/chromedinosaur?do=export_pdf | Pdf: https://ocw.cs.pub.ro/courses/pm/prj2021/agrigore/chromedinosaur?do=export_pdf |