Differences

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

Link to this comparison view

pm:prj2025:avaduva:stefania.tunaru [2025/05/18 19:22]
stefania.tunaru [Simulare electrică în Tinkercad]
pm:prj2025:avaduva:stefania.tunaru [2025/05/25 16:24] (current)
stefania.tunaru [Bibliografie/Resurse]
Line 83: Line 83:
 LCD → Comunicație I2C ⇒ SDA ⇔ A4; SCL ⇔ A5 LCD → Comunicație I2C ⇒ SDA ⇔ A4; SCL ⇔ A5
  
-{{:​pm:​prj2025:​avaduva:​image3.jpg?​600|}}+{{:​pm:​prj2025:​avaduva:​image3.jpg?​700|}}
  
-{{:​pm:​prj2025:​avaduva:​image1.jpg?​400|}} +{{:​pm:​prj2025:​avaduva:​image1.jpg?​350|}} 
-{{:​pm:​prj2025:​avaduva:​image2.jpg?​400|}}+{{:​pm:​prj2025:​avaduva:​image2.jpg?​350|}}
 ===== Software Design ====== ===== Software Design ======
 ==== Mediu de Dezvoltare ==== ==== Mediu de Dezvoltare ====
-Proiectul este dezvoltat în Arduino IDE, care oferă un mediu ușor de utilizat pentru programarea și încărcarea codului pe placa Arduino. Tot codul este scris în C++, folosind bibliotecile standard Arduino și logică personalizată.+Proiectul este dezvoltat în Arduino IDE, care oferă un mediu ușor de utilizat pentru programarea și încărcarea codului pe placa Arduino. Tot codul este scris în C++, folosind bibliotecile standard Arduino și logică personalizată ​pentru implementarea scopului proiectului. 
 + 
 +Proiectul a fost finalizat, iar toate funcționalitățile sale au fost prezentate în filmulețul de demo atașat acestei pagini. 
 + 
 +==== Elementul de noutate al proiectului ==== 
 + 
 +Deși acest tip de proiect a mai fost realizat în trecut, elementul de noutate pe care eu l-am introdus constă într-un meniu de joc. În cazul proiectului meu am integrat un LCD cu ajutorul căruia pot afișa un meniu de joc în care combin două moduri de joc diferite: modul asistent, în care jucătorul primește semnale luminoase (prin LED-uri) și auditive (printr-un buzzer) atunci când a ratat un tile și modul autonom prin care proiectul în sine ”joacă” jocul de Piano Tiles, identificând tile-urile în timp real și simulând apăsarea acestora prin intermediul unui impuls electric trimis către o monedă amplasată pe ecranul unui telefon/​tabletă. 
 +De asemenea, proiectul este scalabil și poate fi extins cu funcții precum dificultate progresivă sau chiar machine learning pentru a reține pattern-uri/​melodii care îi vor simplifica task-urile.
 ==== Libraries and Third-party Resources ==== ==== Libraries and Third-party Resources ====
  
 +  * **Biblioteca LiquidCrystal_I2C.h**
 +
 +Am folosit această bibliotecă pentru a controla display-ul LCD care comunică prin interfața I2C și care permite afișarea textului ce oferă informații la numele proiectului,​ moduri de joc, modul de joc selectat, scor, ecranul de sfărșit de joc, etc. Pentru afișare am folosit comenzi simple precum: **lcd.init()** - inițializează comunicarea cu ecranul LCD, **lcd.backlit()** - activează lumina de fundal a ecranului, **lcd.print()** - afișează textul specificat pe ecranul LCD, **lcd.setCursor()** - setează poziția cursorului unde va fi scris textul și **lcd.clear()** - șterge tot ce e afișat pe ecranul LCD și resetează cursorul la poziția (0, 0).
 ==== Algoritmi și Structuri ==== ==== Algoritmi și Structuri ====
 Software-ul este organizat ca o mașină cu state finite (FSM) cu două stări principale: Software-ul este organizat ca o mașină cu state finite (FSM) cu două stări principale:
-  * **Mod Autonom** – Asistentul joacă jocul pe diferite niveluri și grade de dificultate,​ trimițând impulsuri electrice către monede prin intermediul tranzistoarelor de fiecare dată când este detectat un tile neagru. Pe lângă scorul afișat pe ecranul dispozitivului,​ punctajul este gestionat intern, iar recordul este actualizat dacă este depășit+  ​* **Mod Asistat** – Jucătorul primește notificări prin LED-uri și buzzer în timp real. 
-  * **Mod Asistat** – Jucătorul primește notificări prin LED-uri și buzzer în timp real. Dacă un tile este ratat, asistentul poate activa moneda corespunzătoare pentru a compensa.+  ​* **Mod Autonom** – Asistentul joacă jocul pe diferite niveluri și grade de dificultate,​ trimițând impulsuri electrice către monede prin intermediul tranzistoarelor de fiecare dată când este detectat un tile negru. Pe lângă scorul afișat pe ecranul dispozitivului,​ punctajul este gestionat intern, iar recordul este actualizat dacă este depășit.
  
 **Logică suplimentară:​** **Logică suplimentară:​**
-  * Navigare în meniu – Controlată prin butoane, jucătorul poate schimba modurile de joc. +  ​* **Navigare în meniu** – Controlată prin butoane, jucătorul poate schimba modurile de joc. 
-  * Managementul scorului – Scorul curent este afișat și comparat cu highscore-ul. +  ​* **Managementul greșelilor** - Greșelile sunt controizate și semnalate corespunzător prin lumină și sunet, fiind tolerate până la 10 greșeli până la încheierea sesiunii în modul asistat. 
-  * Debouncing – Apăsările butoanelor sunt debounced în software, folosind logică de temporizare.+  * **Managementul scorului** – Scorul curent este afișat și comparat cu highscore-ul ​în modul autonom
 +  ​* **Debouncing** – Apăsările butoanelor sunt debounced în software, folosind logică de temporizare.
  
 +==== Utilizarea funcționalităților din laborator ====
 +  * **Laboratorul 0** - Am folosit Serial.begin(9600) pentru a porni comunicarea serială, necesară în faza de testare și depanare, pentru a afișa valorile citite de la senzori și a verifica funcționarea corectă a componentelor în timpul dezvoltării proiectului.
 +  * **Laboratorul 1** - Am folosit pinMode() pentru a configura pinii digitali ca input (pentru butoane) și output (pentru leduri și impulsuri transmise către monede). Am utilizat digitalRead() pentru a citi starea butoanelor de selecție mod. Am folosit digitalWrite() pentru a aprinde/​stinge ledurile și pentru a activa impulsurile de curent către monedele corespunzătoare în timpul jocului.
 +  * **Laboratorul 2** - Am folosit funcțiile tone(pin, frecvență) și noTone(pin) pentru a genera feedback sonor diferit pentru fiecare coloană dintre greșeli în funcție de coloana pe care se producea greșeala.
 +  * **Laboratorul 3** - Am utilizat analogRead() pentru a citi valorile de la fotorezistori (pinii A0-A3). Valorile analogice sunt comparate cu praguri (thresholds[]) pentru a determina dacă un tile nu a fost apăsat, astfel proudcând curent electric către tile-ul respectiv.
 +  * **Laboratorul 4** - Am folosit biblioteca LiquidCrystal_I2C.h pentru a controla afișajul pe LCD. Funcțiile lcd.init(), lcd.backlight(),​ lcd.clear(),​ lcd.setCursor() și lcd.print() sunt utilizate pentru a afișa meniul, scorurile, greșelile și ecranele de început/​final,​ permițând interacțiunea ușoară cu utilizatorul.
 +  * **Laboratorul 5** - Proiectul include un meniu de selecție între cele două moduri de joc (asistent și autonom). Folosirea LCD-ului împreună cu butoanele simulează un sistem interactiv similar unui meniu de joc, iar schimbarea modului se face în funcție de butonul apăsat de utilizator.
 +  * **Laborator 6** - Proiectul integrează toate componentele hardware (senzori, leduri, buzzer, impulsuri, butoane, lcd) într-o aplicație coerentă.
 ==== Funcții și Fișiere Sursă ==== ==== Funcții și Fișiere Sursă ====
  
 +== Scheletul proiectului ==
 +Proiectul este structurat în jurul a două moduri de funcționare:​
 +  * **Modul asistat** - asistentul oferă feedback vizual și sonor utilizatorului pentru a-i semnaliza greșelile.
 +  * **Modul autonom** - sistemul detectează tile-urile și simulează atingerea acestora prin intermediul monedelor.
 +
 +== Interacțiunea dintre funcționalități ==
 +  - **Buton de alegere mod de joc** - utilizatorul apasă unul dintre cele două butoane care poate activa fie funcția asistentMode(),​ fie funcția autonomMode()
 +  - **Fotorezistori** - senzorii sunt montati peste fiecare dintre coloanele jocului pe ecranul dispozitivului utilizat și detectează tile-urile negre folosindu-se de un anumit prag selectat în funcție de sensitivitatea senzorului.
 +  - **Feedback vizual și sonor** - în modul asistat pentru fiecare tile detectat se aprinde LED-ul corespunzător coloanei și se emite un sunet specific coloanei prin buzzer. În modul autonom dacă este detectat un tile se generează un impuls către moneda corespunzătoare coloanei pentru a simula apăsarea piesei respective.
 +  - **LCD I2C** - utilizat pentru afișarea informațiilor menționate anterior în descrierea proiectului.
 +  - **Variabile globale** - pentru scor și numărul de greșeli.
 +
 +== Modul de validare a funcționalităților ==
 +  * Fiecare fotorezistor a fost testat individual cu Serial.print() pentru a verifica sensitivitatea lor și pentru a determina valorile personalizate de detecție a culorii negre.
 +  * LED-urile și buzzer-ul au fost testateprin activare directă cu digitalWrite() și tone(), iar butoanele au fost testate folosind digitalRead().
 +  * Am testat fiecare mod de joc separat, pentru asistentMode() am verificat ca feedback-ul funcționa corect pentru semnalarea greșelilor,​ iar pentru autonomMode() am testat generarea impulsurilor de curent prin monede.
 +  * Am testat afișarea pe LCD prin afișarea informațiilor dorite și oferind diferite input-uri.
 +  * Am rulat sesiuni diferite de joc și de moduri de joc pentru a mă asigura că flow-ul proiectului este corect și conform specificațiilor.
 +
 +
 +== Calibrarea elementelor de senzoristică ==
 +
 +Pentru fiecare dintre senzori am testat folosind diferite surse de lumină și de umbră și chiar diferite display-uri (arătând culorile negru/alb) urmărind valorile afișate în Serial Monitor și stabilind astfel valori personalizate de detecție a tile-urilor pentru fiecare fotorezistor.
 +
 +== Optimizări ==
 +  * Citirea senzorilor fără delay() - am folosit millis() pentru a verifica periodic senzorii, evitând blocarea buclei principale.
 +  * Afișarea optimizată pe lcd – actualizez afișajul doar dacă s-a schimbat conținutul,​ evitând apeluri inutile la lcd.clear() și lcd.print().
 +  * Comutarea modurilor prin stare curentă – am folosit o variabilă mod_curent pentru a controla clar tranziția între modurile asistent și autonom.
 +  * Debouncing pentru butoane – am folosit millis() pentru a implementa o perioadă de debounce și a evita citiri greșite sau multiple.
 +  * Structurare modulară a codului – am separat funcționalitățile în funcții distincte pentru claritate, mentenanță și ușurință în extindere.
 ===== Rezultate ====== ===== Rezultate ======
 +
 +Am reușit devoltarea unui proiect care prezintă cele două funcționalități. Proiectul nu numai că asistă jucătorul în antrenament pentru a-și corecta greșelile realizate prin mesaje sonore și vizuale, dar poate juca pe cont propriu Piano Tiles, stabilind chiar și recorduri în joc. Pentru partea de asistență,​ jucătorul are dreptul la 5 greșeli și este monitorizat timpul de joc în care a reușit să nu întrecă numărul maxim impus de greșeli, stabilindu-se așa noi recorduri pe baza antrenamentului. Pentru funcționalitatea autonomă, proiectul reușește să se adapteze rapidității jocului și să rezolve singur diverse melodii.
 +
 +[[https://​youtube.com/​shorts/​AFzEK7ByMOg]]
 ===== Conclusions ====== ===== Conclusions ======
 +
 +Proiectul a fost unul foarte interesant, care m-a ajutat foarte mult să înțeleg conceptele predate în cadrul laboratorului. Pot spune ca a fost o experiență distractivă în același timp datorită faptului că am avut parte de prima experiență practică pentru dezvoltarea unui proiect, un lucru pe care mi l-am dorit mult timp în timpul facultății. Am avut parte de câteva dificultăți pe care am reușit să le depășesc după ce am urmărit mai multe tutoriale pe internet, însă acestea m-au ajutat să înțeleg cu adevărat funcționalitatea șu utilitatea componentelor utilizate.
  
 ===== Cod Sursă ====== ===== Cod Sursă ======
  
 +[[https://​github.com/​stefaniaemiliatunaru/​Piano-Tiles-Gameplay-Assistant/​blob/​main/​code.cpp]]
 ===== Jurnal ====== ===== Jurnal ======
 05.05.2025 - Am decis tema proiectului și am realizat descrierea inițială a acestuia. 05.05.2025 - Am decis tema proiectului și am realizat descrierea inițială a acestuia.
Line 123: Line 179:
  
 18.05.2025 - Am asamblat întregul proiect și am testat funcționalitatea componentelor. 18.05.2025 - Am asamblat întregul proiect și am testat funcționalitatea componentelor.
 +
 +22.05.2025 - Am dezvoltat și am testat partea de software a proiectului.
 +
 +25.05.2025 - Am realizat testarea finală, videoclipurile pentru demo și am incorporat proiectul într-o cutie pentru a realiza stilizarea proiectului.
  
 ===== Bibliografie/​Resurse ====== ===== Bibliografie/​Resurse ======
 +
 +  * [[https://​www.arduino.cc/​en/​Guide/​]]
 +  * [[https://​github.com/​johnrickman/​LiquidCrystal_I2C]]
 +  * [[https://​docs.arduino.cc/​built-in-examples/​basics/​AnalogReadSerial/​]]
 +  * [[https://​randomnerdtutorials.com/​guide-for-relay-module-with-arduino/​]]
 +  * [[https://​www.instructables.com/​Arduino-Plays-Piano-Tiles/​]]
 +
pm/prj2025/avaduva/stefania.tunaru.1747585354.txt.gz · Last modified: 2025/05/18 19:22 by stefania.tunaru
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