Differences

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

Link to this comparison view

pm:prj2025:avaduva:stefania.tunaru [2025/05/17 11:49]
stefania.tunaru [Bibliography/Resources]
pm:prj2025:avaduva:stefania.tunaru [2025/05/25 16:24] (current)
stefania.tunaru [Bibliografie/Resurse]
Line 19: Line 19:
 === Achiziționate de pe Optimus Digital === === Achiziționate de pe Optimus Digital ===
  
-  * Plăcuță Arduino Uno R3 +  * Plăcuță Arduino Uno R3 (https://​www.optimusdigital.ro/​ro/​placi-avr/​4561-placa-de-dezvoltare-compatibila-cu-arduino-uno-r3-atmega328p-atmega16u2-cablu-50-cm.html?​search_query=Placa+de+Dezvoltare+Compatibila+cu+Arduino+UNO+R3+%28ATmega328p+++ATmega16u2%29+++Cablu+50+c&​results=1) 
-  * LCD 16×2 cu modul I2C +  * LCD 16×2 cu modul I2C (https://​www.optimusdigital.ro/​ro/​optoelectronice-lcd-uri/​2894-lcd-cu-interfata-i2c-si-backlight-albastru.html?​search_query=0104110000003584&​results=1) 
-  * 4 × LED-uri roșii +  * 4 × LED-uri roșii ​(https://​www.optimusdigital.ro/​ro/​optoelectronice-led-uri/​696-led-rou-de-3-mm-cu-lentile-difuze.html?​search_query=0104210000006186&​results=1) 
-  * 1 × Buzzer +  * 1 × Buzzer ​(https://​www.optimusdigital.ro/​ro/​audio-buzzere/​12247-buzzer-pasiv-de-33v-sau-3v.html?​search_query=0104210000081527&​results=1) 
-  * 2 × butoane +  * 2 × butoane ​(https://​www.optimusdigital.ro/​ro/​butoane-i-comutatoare/​1115-buton-cu-capac-rotund-alb.html?​search_query=0104210000009590&​results=1) 
-  * 4 × rezistori 22 kΩ +  * 4 × rezistori 22 kΩ (https://​www.optimusdigital.ro/​ro/​componente-electronice-rezistoare/​848-rezistor-025w-22k.html?​search_query=0104210000007374&​results=1) 
-  * 10 × rezistori 1,8 kΩ +  * 10 × rezistori 1,8 kΩ (https://​www.optimusdigital.ro/​ro/​componente-electronice-rezistoare/​858-rezistor-025w-18k.html?​search_query=0104210000007466&​results=1) 
-  * 2 × rezistori 220 Ω +  * 2 × rezistori 220 Ω (https://​www.optimusdigital.ro/​ro/​componente-electronice-rezistoare/​1097-rezistor-025w-220.html?​search_query=0104210000010053&​results=1) 
-  * 1 × Breadboard +  * 1 × Breadboard ​(https://​www.optimusdigital.ro/​ro/​prototipare-breadboard-uri/​13249-breadboard-300-puncte.html?​search_query=breadboard&​results=125) 
-  * 4 × fotorezistori +  * 4 × fotorezistori ​(https://​www.optimusdigital.ro/​ro/​componente-electronice-altele/​1863-fotorezistor-tip-5528.html?​search_query=Fotorezistor+%28tip+5528%29&​results=1) 
-  * Fire colorate tată-tată+  * Fire colorate tată-tată ​(https://​www.optimusdigital.ro/​ro/​fire-fire-mufate/​890-set-fire-tata-tata-40p-30-cm.html?​search_query=0104210000007886&​results=1)
  
 === Achiziționate de pe Bitmi === === Achiziționate de pe Bitmi ===
  
-  * 4 × relee cu optocuplor +  * 4 × relee cu optocuplor ​(https://​www.bitmi.ro/​module-electronice/​modul-releu-4-canale-cu-optocuplor-5v-low-level-10494.html) 
-  * Fire colorate mamă-mamă+  * Fire colorate mamă-mamă ​(https://​www.bitmi.ro/​electronica/​40-x-fire-dupont-mama-mama-20cm-10509.html)
  
  
 ==== Schemă Bloc ==== ==== Schemă Bloc ====
 {{:​pm:​prj2025:​avaduva:​schema.drawio.png?​500|}} {{:​pm:​prj2025:​avaduva:​schema.drawio.png?​500|}}
 +
  
 ==== Simulare electrică în Tinkercad ==== ==== Simulare electrică în Tinkercad ====
Line 44: Line 45:
 {{:​pm:​prj2025:​avaduva:​schematic.png?​700|}} {{:​pm:​prj2025:​avaduva:​schematic.png?​700|}}
  
 +==== Descriere funcționalitate hardware ====
 +Proiectul utilizează o placă Arduino Uno R3 ca unitate principală de procesare și control. Aceasta gestionează atât partea de detecție (fotosenzori),​ cât și partea de acționare (relee, buzzer, LED-uri, LCD, butoane). Funcționalitatea hardware este împărțită în două moduri principale:
 +  * **Mod autonom**: Sistemul detectează tile-urile negre din joc prin fotosenzori și simulează apăsarea pe ecran activând monedele conductive prin relee.
 +  * **Mod asistat**: Oferă feedback vizual prin aprinderea led-ului coresponzător tile-ului ratat și feedback sonor jucătorului atunci când un tile este ratat.
  
 +== Componente utilizate ==
 +  * Arduino UNO R3 → Microcontroller principal
 +  * Fotorezistori → Detectare lumină/​întuneric (tile-uri negre) ⇒ Intrări analogice
 +  * LED-uri roșii → Feedback vizual (greșeală/​activare tile) ⇒ I/O digitale (OUTPUT)
 +  * Relee cu optocuplor → Acționare monede pentru apăsare pe ecran ⇒ I/O digitale (OUTPUT)
 +  * Butoane → Selecție mod de joc ⇒ I/O digitale (INPUT_PULLUP)
 +  * LCD 16x2 I2C → Afișare scor/mod de joc ⇒ I2C (SDA/A4, SCL/A5)
 +  * Buzzer pasiv → Feedback audio ⇒ I/O digital (OUTPUT)
 +  * Breadboard, rezistori, calburi → Conectare de componente, pull-up pentru butoane și fotorezistori
  
 +== Conectarea pinilor ==
 +Fotorezistori → Citire valori de lumină pentru fiecare coloană
 +  *   F1 ⇔ A3
 +  *    F2 ⇔ A2
 +  *    F3 ⇔ A1
 +  *    F4 ⇔ A0
 + ​LED-uri → Feedback vizual la detecție de erori pe fiecare coloană
 +  * LED1 ⇔ 4
 +  * LED2 ⇔ 5
 +  *    LED3 ⇔ 6
 +  *    LED4 ⇔ 7
 +Relee → Activează simularea atingerii prin monede
 +  *    R1 ⇔ 10
 +  *    R2 ⇔ 11
 +  *    R3 ⇔ 12
 +  *    R4 ⇔ 13
 +Butoane → Selectare mod de joc (B1 → autonom/B2 → asistat)
 +  *    B1 ⇔ 3
 +  *    B2 ⇔ 2
 +Buzzer → Semnal audio la detecția de greșeli ⇔ 8
  
 +LCD → Comunicație I2C ⇒ SDA ⇔ A4; SCL ⇔ A5
 +
 +{{:​pm:​prj2025:​avaduva:​image3.jpg?​700|}}
 +
 +{{:​pm:​prj2025:​avaduva:​image1.jpg?​350|}}
 +{{:​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 83: 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.1747471785.txt.gz · Last modified: 2025/05/17 11:49 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