This shows you the differences between two versions of the page.
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/]] | ||
+ |