Differences

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

Link to this comparison view

pm:prj2026:atoader:bogdan.raucescu [2026/05/18 19:00]
bogdan.raucescu
pm:prj2026:atoader:bogdan.raucescu [2026/05/18 19:03] (current)
bogdan.raucescu
Line 7: Line 7:
 **Scopul:** **Scopul:**
 Scopul principal al acestui proiect este implementarea unui joc de viteza si reactie folosind senzori capacitivi construiti manual. Scopul principal al acestui proiect este implementarea unui joc de viteza si reactie folosind senzori capacitivi construiti manual.
 +
 **Ideea de la care am pornit:** **Ideea de la care am pornit:**
 Conceptul a fost inspirat de proiectele de tip "Pian din banane"​. Totusi, in loc sa utilizez input-ul capacitiv in mod pasiv (pentru a genera note muzicale), acest proiect transforma input-ul intr-un joc activ, bazat pe logica, cu un sistem de scor, dificultate crescatoare si feedback vizual/​audio. Conceptul a fost inspirat de proiectele de tip "Pian din banane"​. Totusi, in loc sa utilizez input-ul capacitiv in mod pasiv (pentru a genera note muzicale), acest proiect transforma input-ul intr-un joc activ, bazat pe logica, cu un sistem de scor, dificultate crescatoare si feedback vizual/​audio.
Line 20: Line 21:
   * Daca utilizatorul atinge tinta conductoare (ex: banda de cupru, moneda sau folie) inainte ca timpul sa expire, microcontrolerul detecteaza schimbarea de capacitate, inregistreaza lovitura, creste scorul si reda un sunet de succes.   * Daca utilizatorul atinge tinta conductoare (ex: banda de cupru, moneda sau folie) inainte ca timpul sa expire, microcontrolerul detecteaza schimbarea de capacitate, inregistreaza lovitura, creste scorul si reda un sunet de succes.
   * Pe masura ce scorul creste, timpul permis pentru a lovi tinta scade, crescand astfel dificultatea.   * Pe masura ce scorul creste, timpul permis pentru a lovi tinta scade, crescand astfel dificultatea.
-  * Daca timpul expira sau utilizatorul loveste tinta gresita, jocul se termina cu un sunet de "Game Over", iar scorul este afisat pe ecranul LCD.+  * Daca timpul expira sau utilizatorul loveste tinta gresita, jocul se termina cu un sunet de "Game Over", iar scorul este afisat pe ecranul LCD, in timp ce statisticile sunt trimise pe terminalul serial.
  
 ===== Hardware Design ===== ===== Hardware Design =====
  
 {{:​pm:​prj2026:​atoader:​schema_bloc_raucesu.png?​300|}} {{:​pm:​prj2026:​atoader:​schema_bloc_raucesu.png?​300|}}
 +
 **Lista de piese (BOM):** **Lista de piese (BOM):**
-  * 1 x Microcontroler ATmega328P (format placuta Arduino Uno)+  * 1 x Microcontroler ATmega328P (format placuta Arduino Uno / Xplained Mini)
   * 6 x Rezistente 10 MΩ (Cruciale pentru constanta de timp RC a senzorilor capacitivi)   * 6 x Rezistente 10 MΩ (Cruciale pentru constanta de timp RC a senzorilor capacitivi)
   * 6 x Rezistente 330 Ω (Pentru limitarea curentului prin LED-uri)   * 6 x Rezistente 330 Ω (Pentru limitarea curentului prin LED-uri)
Line 42: Line 44:
   * **Feedback Audio:** Buzzer-ul pasiv este conectat la pinul ''​PC3''​.   * **Feedback Audio:** Buzzer-ul pasiv este conectat la pinul ''​PC3''​.
   * **Afisaj LCD:** Ecranul I2C foloseste pinii hardware TWI standard: SDA (''​PC4''​) si SCL (''​PC5''​).   * **Afisaj LCD:** Ecranul I2C foloseste pinii hardware TWI standard: SDA (''​PC4''​) si SCL (''​PC5''​).
 +  * **Interfata Debugging (USART):** Pinii hardware TX/RX (comunicarea seriala via USB) sunt utilizati pentru a transmite asincron date de monitorizare catre PC.
  
 https://​youtube.com/​shorts/​x_dYqr80P_w?​feature=share https://​youtube.com/​shorts/​x_dYqr80P_w?​feature=share
Line 47: Line 50:
 ===== Software Design ===== ===== Software Design =====
  
-**Mediu de dezvoltare:​** ​+**Mediu de dezvoltare:​**
 Firmware-ul a fost dezvoltat folosind Microchip Studio (Atmel Studio) / AVR-GCC, scriind cod exclusiv in C si manipuland direct registrii hardware. Firmware-ul a fost dezvoltat folosind Microchip Studio (Atmel Studio) / AVR-GCC, scriind cod exclusiv in C si manipuland direct registrii hardware.
  
Line 58: Line 61:
   * **Laboratorul 1 (GPIO - Intrare/​Iesire):​** A reprezentat baza intregului hardware. L-am aplicat pentru configurarea pinilor ca Iesire (aprinderea LED-urilor de pe Portul D, trimiterea semnalului catre Buzzer) si ca Intrare (citirea starii pinilor de RECEIVE pentru senzorii capacitivi). Am folosit intensiv manipularea la nivel de bit a registrilor DDR, PORT si PIN.   * **Laboratorul 1 (GPIO - Intrare/​Iesire):​** A reprezentat baza intregului hardware. L-am aplicat pentru configurarea pinilor ca Iesire (aprinderea LED-urilor de pe Portul D, trimiterea semnalului catre Buzzer) si ca Intrare (citirea starii pinilor de RECEIVE pentru senzorii capacitivi). Am folosit intensiv manipularea la nivel de bit a registrilor DDR, PORT si PIN.
   * **Laboratorul 3 (Timere si Intarzieri):​** Conceptele de temporizare au fost vitale pentru implementarea mecanismului de baza al jocului (masurarea timpului de raspuns al jucatorului,​ scaderea acestui timeout odata cu cresterea dificultatii,​ pauzele dintre runde). De asemenea, logica de timere a fost folosita pentru a genera frecventele necesare buzzer-ului pasiv (tonuri scurte si ascutite pentru succes, tonuri lungi si grave pentru Game Over).   * **Laboratorul 3 (Timere si Intarzieri):​** Conceptele de temporizare au fost vitale pentru implementarea mecanismului de baza al jocului (masurarea timpului de raspuns al jucatorului,​ scaderea acestui timeout odata cu cresterea dificultatii,​ pauzele dintre runde). De asemenea, logica de timere a fost folosita pentru a genera frecventele necesare buzzer-ului pasiv (tonuri scurte si ascutite pentru succes, tonuri lungi si grave pentru Game Over).
 +  * **Laboratorul 4 (Comunicatii Seriale - USART):** Desi feedback-ul vizual principal este gestionat prin ecranul LCD, am integrat perifericul USART pentru transmiterea asincrona de date catre PC, la un baud rate de 9600 bps. Acesta a fost utilizat ca instrument de depanare (debugging),​ trimitand in timp real catre un terminal serial ID-ul tintei active generat si scorul curent al jucatorului,​ validand astfel corectitudinea datelor procesate.
   * **Laboratorul 6 (Interfata I2C / TWI):** Acest laborator a fost aplicat direct pentru conectarea ecranului LCD 16x2. Folosind protocolul I2C am reusit sa afisez scorul, mesajele de start si starea jocului, utilizand doar 2 pini de date (SDA si SCL), economisind astfel pini pretiosi pe microcontroler.   * **Laboratorul 6 (Interfata I2C / TWI):** Acest laborator a fost aplicat direct pentru conectarea ecranului LCD 16x2. Folosind protocolul I2C am reusit sa afisez scorul, mesajele de start si starea jocului, utilizand doar 2 pini de date (SDA si SCL), economisind astfel pini pretiosi pe microcontroler.
  
Line 63: Line 67:
   * **Algoritmul senzorului capacitiv:​** Logica de baza presupune setarea pinului de ''​SEND''​ pe HIGH si numararea iteratiilor/​ciclurilor necesare pentru ca pinul de ''​RECEIVE''​ sa ajunga tot in starea HIGH. Din cauza rezistentei mari de 10 MΩ, corpul uman actioneaza ca un condensator cand atinge tinta, incetinind cresterea tensiunii. Daca numarul de cicluri depaseste o valoare calibrata (''​THRESHOLD''​),​ este inregistrata o atingere valida.   * **Algoritmul senzorului capacitiv:​** Logica de baza presupune setarea pinului de ''​SEND''​ pe HIGH si numararea iteratiilor/​ciclurilor necesare pentru ca pinul de ''​RECEIVE''​ sa ajunga tot in starea HIGH. Din cauza rezistentei mari de 10 MΩ, corpul uman actioneaza ca un condensator cand atinge tinta, incetinind cresterea tensiunii. Daca numarul de cicluri depaseste o valoare calibrata (''​THRESHOLD''​),​ este inregistrata o atingere valida.
   * **Masina de stare a jocului (State Machine):** Jocul opereaza intr-o bucla infinita cu stari distincte: Asteptare Start -> Generare Tinta Random -> Asteptare Input (cu Timeout) -> Evaluare (Lovit/​Ratat) -> Actualizare Dificultate.   * **Masina de stare a jocului (State Machine):** Jocul opereaza intr-o bucla infinita cu stari distincte: Asteptare Start -> Generare Tinta Random -> Asteptare Input (cu Timeout) -> Evaluare (Lovit/​Ratat) -> Actualizare Dificultate.
-  * **Dificultate Dinamica:** Timeout-ul initial este setat la 2000ms. La fiecare lovitura reusita, timpul limita scade, necesitand reflexe din ce in ce mai rapide din partea jucatorului.+  * **Dificultate Dinamica:** Timeout-ul initial este setat la 4000ms. La fiecare lovitura reusita, timpul limita scade, necesitand reflexe din ce in ce mai rapide din partea jucatorului.
   * **Randomizare:​** Pentru a asigura ca tintele sunt cu adevarat aleatoare la fiecare joc, functia ''​srand()''​ este initializata folosind o variabila ce numara iteratiile scurse pana cand utilizatorul apasa butonul de start.   * **Randomizare:​** Pentru a asigura ca tintele sunt cu adevarat aleatoare la fiecare joc, functia ''​srand()''​ este initializata folosind o variabila ce numara iteratiile scurse pana cand utilizatorul apasa butonul de start.
 +  * **Transmisie Date (USART):** Rutina de trimitere a caracterelor ruleaza in background la schimbarea starii jocului, incarcand datele in registrul ''​UDR0''​ fara a bloca bucla principala de gameplay.
  
 ===== Rezultate Obtinute ===== ===== Rezultate Obtinute =====
Line 72: Line 77:
   * LED-urile si Buzzer-ul ofera un feedback instantaneu,​ fara intarzieri.   * LED-urile si Buzzer-ul ofera un feedback instantaneu,​ fara intarzieri.
   * Scalarea dificultatii functioneaza perfect, facand jocul progresiv mai greu si testand eficient viteza de reactie a utilizatorului.   * Scalarea dificultatii functioneaza perfect, facand jocul progresiv mai greu si testand eficient viteza de reactie a utilizatorului.
 +  * Ecranul I2C ofera claritate in urmarirea scorului, in timp ce consola seriala asigura un mediu robust de testare.
  
 ===== Concluzii ===== ===== Concluzii =====
  
-Dezvoltarea acestui proiect a reprezentat o experienta practica excelenta in gestionarea comportamentelor de tip analogic intr-un sistem complet digital. Principala provocare a fost calibrarea pragului capacitiv (threshold),​ deoarece valorile citite fluctuau usor in functie de grosimea firelor si de suprafata de contact a tintelor. Per total, proiectul demonstreaza ca se pot construi interfete interactive robuste folosind un numar minim de componente si algoritmi inteligenti de cronometrare.+Dezvoltarea acestui proiect a reprezentat o experienta practica excelenta in gestionarea comportamentelor de tip analogic intr-un sistem complet digital. Principala provocare a fost calibrarea pragului capacitiv (threshold),​ deoarece valorile citite fluctuau usor in functie de grosimea firelor si de suprafata de contact a tintelor. Per total, proiectul demonstreaza ca se pot construi interfete interactive robuste folosind un numar minim de componente si algoritmi inteligenti de temporizare si comunicare seriala.
  
 ===== Bibliografie / Resurse ===== ===== Bibliografie / Resurse =====
  
-  * [1] Fisiere de laborator PM pentru conectarea unui LCD prin interfata I2C.+  * [1] Fisiere de laborator PM pentru conectarea unui LCD prin interfata I2C si comunicatie USART.
   * [2] Teoria senzorilor capacitivi: Documentatia Arduino CapSense Library - http://​playground.arduino.cc/​Main/​CapacitiveSensor   * [2] Teoria senzorilor capacitivi: Documentatia Arduino CapSense Library - http://​playground.arduino.cc/​Main/​CapacitiveSensor
   * [3] Datasheet ATmega328P (pentru maparea pinilor, configurarea registrilor si porturilor).   * [3] Datasheet ATmega328P (pentru maparea pinilor, configurarea registrilor si porturilor).
pm/prj2026/atoader/bogdan.raucescu.1779120059.txt.gz · Last modified: 2026/05/18 19:00 by bogdan.raucescu
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