This is an old revision of the document!


Piano Tiles Gameplay Assistant

Introducere

Acest proiect își propune construirea unui asistent pentru Piano Tiles bazat pe Arduino, capabil să joace complet autonom sau să sprijine un jucător uman prin notificări vizuale și audio în timp real. În modul autonom, sistemul folosește monede conductoare ale curentului electric pentru a simula apăsarea pe ecran prin impulsuri electrice; în modul asistat, îl ghidează pe jucător, indicând instantaneu unde și când a apărut o greșeală.

Scopul inițiativei este de a explora interacțiunea dintre automatizare și gameplay-ul uman, valorificând concepte de embedded systems. Ideea a pornit din dorința de a automatiza un joc mobil aparent banal (Piano Tiles) și de a-l extinde cu un asistent capabil să corecteze erorile, să rafineze sincronizarea prin feedback și chiar să concureze cu recordurile stabilite de oameni.

Proiectul oferă atât oportunitatea pentru experimenta cu senzori și cu logica de joc, ci și o fundație pentru sisteme asistive mai avansate în gaming, reabilitare sau instruire, permițând integrarea unor mecanisme elementare de învățare și adaptare prin machine learning. Combinația dintre distracție și valoare educativă transformă procesul de învățare într-o experiență mai eficientă și mai plăcută.

Overview

Assistant-ul de Gameplay pentru Piano Tiles este un proiect bazat pe Arduino ce îmbină automatizarea cu suportul activ pentru jucătorii acestui popular joc mobil. În modul autonom, sistemul folosește monede electromagnetice pentru a simula atingerile ecranului, iar în modul asistat oferă feedback vizual (LED-uri) și audio (buzzer) în timp real, ajutându-l pe utilizator să își corecteze greșelile. Scorul curent și highscore-ul sunt afișate pe un ecran LCD, iar selecția modului de joc se face simplu, prin două butoane (sânga sau dreapta).

Ideea a pornit din curiozitatea de a „păcăli” jocul cu ajutorul unui setup Arduino complet automatizat. Pe parcurs, conceptul s-a transformat într-un sistem interactiv și educativ, capabil nu doar să joace singur, ci și să-l asiste pe utilizator prin detectarea și corectarea erorilor. Asistentul încearcă permanent să depășească performanțele jucătorului, stabilind un scor de referință pe care acesta este provocat să îl bată.

Hardware Design

Listă de Componente

Listă de Componente

Achiziționate de pe Optimus Digital

Achiziționate de pe Bitmi

Schemă Bloc

Simulare electrică în Tinkercad

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 16×2 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

Software Design

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ă pentru implementarea scopului proiectului.

Stadiul din punctul de vedere al software-ului este aproape de final, funcționalitățile principale sunt integrate complet în codul proiectului și urmează să adaug câteva feature-uri ce țin de stilizare.

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

  • 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).

  • Biblioteca Wire.h

Am utilizat biblioteca aceasta pentru a activa comunicația I2C între plăcuța Arduino și ecranul LCD.

Algoritmi și Structuri

Software-ul este organizat ca o mașină cu state finite (FSM) cu două stări principale:

  • Mod Asistat – Jucătorul primește notificări prin LED-uri și buzzer în timp real.
  • 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ă:

  • Navigare în meniu – Controlată prin butoane, jucătorul poate schimba modurile de joc.
  • 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.
  • 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ă

Rezultate

Conclusions

Cod Sursă

Jurnal

05.05.2025 - Am decis tema proiectului și am realizat descrierea inițială a acestuia.

09.05.2025 - Am realizat schema eletrică în Tinkercad.

10.05.2025 - Am comanda primele componente.

12.05.2025 - Am ridicat componentele și am asamblat prima parte a proiectului.

13.05.2025 - Am dat comandă de componentele lipsă.

15.05.2025 - Am ridicat restul componentelor.

18.05.2025 - Am asamblat întregul proiect și am testat funcționalitatea componentelor.

Bibliografie/Resurse

pm/prj2025/avaduva/stefania.tunaru.1747948011.txt.gz · Last modified: 2025/05/23 00:06 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