Differences

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

Link to this comparison view

pm:prj2026:farhad_ali.gul:teodora.plopeanu [2026/05/03 20:37]
teodora.plopeanu
pm:prj2026:farhad_ali.gul:teodora.plopeanu [2026/05/20 00:23] (current)
teodora.plopeanu [Descriere generală]
Line 21: Line 21:
 ===== Descriere generală ===== ===== Descriere generală =====
  
-Arhitectura proiectului este construită în jurul microcontrollerului ATmega328P Xplained mini. Sistemul este conceput pentru a integra un mecanism de control bazat pe mișcare într-un joc video. ​Este organizat logic în module ​de intrareprocesare ​și ieșire.+Arhitectura proiectului este construită în jurul microcontrollerului ATmega328P Xplained mini. Sistemul este conceput pentru a integra un mecanism de control bazat pe mișcare într-un joc video. ​ 
 + 
 +Rolul microcontrolerului este de a colecta datele senzoruluide a gestiona inputul utilizatorului ​și de a genera feedback auditiv, în timp ce procesarea datelor ​și logica jocului sunt gestionate de aplicația Python.
  
 Dispozitivul este construit pe o platforma din lemn, cu două niveluri: ​ Dispozitivul este construit pe o platforma din lemn, cu două niveluri: ​
-  * pe nivelul superior este montat pistolul cu butonul de trigger, ​împreună cu senzorul ​giroscopic +  * pe nivelul superior este montat pistolul, impreuna ​cu butonul de trigger, senzorul ​giroscop si buzzer-ul 
-  * pe nivelul inferior ​sunt amplasate restul componentelor electronice:​ placa de dezvoltare, breadboard-ul și buzzerul+  * pe nivelul inferior ​este amplasat microcontroller-ul
  
 === Interacțiunea modulelor === === Interacțiunea modulelor ===
  
-  * **Modulul giroscopic (MPU6050)** comunică cu microcontrolerul prin **I2C** și furnizează date despre ​orientarea ​dispozitivului. La pornirea jocului, ​poziția inițială a senzorului este considerată ​referință ​(centru ​al ecranului), iar ulterior ​deplasarea ​este calculată relativ la această poziție. Orientarea pe ecran este determinată în funcție ​de înclinarea controllerului,​ valorile senzorului fiind mapate ​la coordonate 2D care definesc ​poziția țintei.+  * **Modulul giroscopic (MPU6050)** comunică cu microcontrolerul prin **I2C** și furnizează date despre ​accelerația ​dispozitivului. La pornirea jocului, ​primele citiri sunt folosite ca referință ​de centru, iar aplicația Python calculează ​deplasarea ​față de aceasta și o mapează ​la coordonate 2D pentru ​poziționarea cursorului pe ecran.
  
   * **Butonul de trigger** este conectat la un pin de intrare digital și este utilizat pentru declanșarea acțiunii de tragere.   * **Butonul de trigger** este conectat la un pin de intrare digital și este utilizat pentru declanșarea acțiunii de tragere.
  
-  * **Interfața USART** este utilizată pentru transmiterea în timp real a datelor către jocul dezvoltat în Python. Microcontrollerul ​trimite coordonatele calculate pe baza senzorului, iar aplicația interpretează aceste valori ​și actualizează poziția cursorului pe ecran.+  * **Interfața USART** este utilizată pentru transmiterea în timp real a datelor către jocul dezvoltat în Python. Microcontrollerul ​colectează datele ​senzorului și le transmite în timp real către aplicația Python prin interfața USART.
  
-  * **Buzzerul pasiv** este utilizat pentru generarea feedback-ului auditiv, fiind comandat prin semnale **PWM** pentru simularea sunetului de tragere.+  * **Buzzerul pasiv** este utilizat pentru generarea feedback-ului auditiv, fiind comandat prin semnale **PWM** pentru simularea sunetului de tragere. Semnalul PWM este generat hardware prin Timer2, în modul Fast PWM, pe pinul OC2B/PD3.
  
-Sistemul procesează datele de intrare și le transmite în timp real către aplicația software, unde sunt utilizate pentru actualizarea interacțiunilor din joc. 
  
 === Schema bloc === === Schema bloc ===
  
-{{:​pm:​prj2026:​farhad_ali.gul:​screenshot_2026-05-03_at_18.31.52.png?600|}}+ 
 +{{:​pm:​prj2026:​farhad_ali.gul:​screenshot_2026-05-20_at_00.22.56.png?600|}}
  
 ===== Hardware Design ===== ===== Hardware Design =====
  
-Proiectul cuprinde atat componente care opereaza la tensiunea de 5V, cat si la 3V3.+Componentele proiectului ​opereaza la tensiunea de 5V.
  
 === Lista de componente utilizate === === Lista de componente utilizate ===
  
-^ Nume componenta ^ Model ^ Protocol ^ +^ Nume componenta ^ Model ^ Protocol ​^ Pinout ​
-| Microcontroller | ATmega328P Xplained Mini | USART, USB | +| Microcontroller | ATmega328P Xplained Mini | USART, USB | - 
-| Senzor giroscop | MPU6050 | I2C | +| Senzor giroscop | MPU6050 | I2C | SDA=PC4, SCL=PC5 ​
-| Trigger Buton | Push Button | ISR + GPIO | +| Trigger Buton | Push Button | ISR + GPIO | PD2 (INT0) ​
-| Buzzer pasiv | - | Fast PWM + GPIO | +| Buzzer pasiv | - | Fast PWM + GPIO | PD3 (OC2B) ​
-| Breadboard | - | - | +| Breadboard ​| - | - | - | 
-| Fire Dupont | - | - |+| Fire Dupont ​| - | - | - |
  
  
Line 65: Line 67:
 === Mediu de dezvoltare si Biblioteci folosite === === Mediu de dezvoltare si Biblioteci folosite ===
  
-Firmware-ul este dezvoltat pentru ​microcontrollerul ​ATmega328P și are rolul de a prelua ​datele ​de la senzorul giroscop, de a procesa ​starea butonului de trigger și de a transmite informațiile către jocul rulat pe PCprin interfața USART (via USB).+Firmware-ul este dezvoltat pentru ​microcontrolerul ​ATmega328P și are rolul de a achiziționa ​datele ​senzorului IMU, de a gestiona ​starea butonului de trigger și de a transmite informațiile către jocul rulat pe PC prin interfața USART.
  
 Codul este scris în C++, utilizând mediul de dezvoltare PlatformIO. Codul este scris în C++, utilizând mediul de dezvoltare PlatformIO.
  
-Pentru interacțiunea cu senzorul MPU6050 va fi utilizată biblioteca Adafruit MPU6050 library, care simplifică comunicarea prin protocolul I2C și oferă acces direct la valorile de accelerație și rotație.+Pentru interacțiunea cu senzorul MPU6050 va fi utilizată biblioteca Adafruit MPU6050 library, care simplifică comunicarea prin protocolul I2C.
  
 === Algoritm === === Algoritm ===
  
-La pornirea sistemului se realizează inițializarea perifericelor folosite: I2C pentru comunicarea cu senzorul MPU6050, USART pentru comunicarea cu PC-ul, GPIO pentru citirea butonului de trigger și PWM pentru comanda buzzerului pasiv.+La pornirea sistemului se realizează inițializarea perifericelor folosite: I2C pentru comunicarea cu senzorul MPU6050, USART pentru comunicarea cu PC-ul, GPIO pentru citirea butonului de trigger și Timer2 cu FastPWM ​pentru comanda buzzerului pasiv.
  
-După inițializaresistemul realizează o etapă de calibrareîn care poziția inițială ​senzorului este memorată ​și considerată poziția de referință, corespunzătoare centrului ecranului. Valorile citite ulterior de la senzor sunt calculate relativ la această poziție și sunt mapate la coordonate 2D folosite pentru poziționarea țintei ​în joc.+În bucla principală, firmware-ul citește la fiecare 500ms valorile brute ale accelerometrului (axay, az) și giroscopului (gx, gy, gz) prin interfața I2C și le transmite către PC prin USART, în formatul:
  
-În bucla principalăfirmware-ul primește de la senzorul MPU6050prin interfața I2C, valori brute de accelerație pe axele X și Y (axay)care descriu înclinarea dispozitivului în spațiu. Aceste valori sunt procesate și raportate la poziția de referință stabilită la inițializare,​ pentru ​determina poziția țintei pe ecran.+<​code>​ 
 + 
 +Accel X: <ax> | Y: <ay> | Z: <az> m/s^2 
 +Gyro X: <gx> | Y: <gy> | Z: <gz> rad/s 
 +Temp: <t> C 
 + 
 +</​code>​ 
 + 
 +unde: 
 + 
 +  * axayaz = accelerațiile liniare ​pe cele trei axe 
 +  * gxgygz = vitezele unghiulare 
 +  * t = temperatura internă a senzorului
  
-În paralel, ​este verificată starea butonului ​de triggerSistemul ​transmite ​continuu ​către PC un mesaj serial, în urmatorul format:+Butonul de trigger ​este conectat la pinul PD2 (INT0) și este gestionat printr-o rutină de întrerupere,​ ISR, declanșată pe frontul descendent, cu debounceLa apăsarea butonului, microcontrolerul ​transmite către PC pe serial ​mesajul:
  
 <​code>​ <​code>​
  
-x,y,shot+Buton apasat
  
 </​code>​ </​code>​
  
-unde:+și activează buzzerul pentru feedback auditiv si actiunea de tragere in joc.
  
-  * x = poziția pe orizontală +Sunetul de tragere este simulat prin varierea frecvenței semnalului PWM generat de Timer2. Incepe cu o frecvență ridicată (~900 Hz), care scade rapid către frecvențe joase (~120 Hz), simulând impactul unui foc de armă.
-  * y = poziția pe verticală +
-  * shot = starea acțiunii de tragere ​(poate fi 0 sau 1)+
  
-Astfel, poziția este actualizată permanent în joc.+Calibrarea și maparea coordonatelor sunt gestionate de aplicația Python. La pornirea joculuiprimele 5 citiri sunt folosite pentru a calcula o poziție de referință,​ din media valorilor ax și ay. Fiecare citire ulterioară este raportată la această referință,​ iar diferența ​este mapată la coordonate 2D pe ecran.
  
-Dacă trigger-ul este apăsat, microcontrollerul activează buzzerul pentru o perioadă scurtă, oferind feedback auditiv pentru acțiunea de tragere. 
  
 === Jocul de pe PC === === Jocul de pe PC ===
  
-Jocul este dezvoltat în Python, folosind biblioteca Pygame ​pentru randarea grafică și gestionarea logicii de joc. Aplicația citește datele primite de la microcontroller prin portul serial al calculatorului și le folosește pentru actualizarea poziției țintei pe ecran.+Jocul este dezvoltat în Python, folosind biblioteca Pygame.
  
-Coordonatele transmise ​de firmware controlează pozitia userului pe ecraniar valoarea asociată variabilei '​shot'​ declanșează acțiunea ​de tragere în joc.+Jocul este de tip arcadebazat pe o mecanica ​de tipul "light in the dark".
  
-Jocul este de tip arcadebazat pe o mecanica ​de tip "light in the dark"Pentru a castiga, trebuie sa tintesti cat mai multi monstri intr-un interval dat de timp.+Jucătorul are 60 de secunde să elimine cât mai mulți monștrivizibili doar când intră în raza de luminăExistă 6 tipuri ​de monștri, diferențiați prin culoare și punctaj.
 ===== Rezultate Obţinute ===== ===== Rezultate Obţinute =====
 +În urma implementării,​ am obtinut un joc interactiv care funcționează conform cerințelor propuse. Integrarea inputului fizic ofera o experienta de joc captivanta.
  
 +Senzorul MPU6050 transmite date către PC prin USART, iar aplicația le folosește pentru a controla cursorul în joc în timp real. Butonul de trigger declanșează acțiunea de tragere prin ISR, cu feedback auditiv generat de buzzerul pasiv controlat prin PWM pe Timer2.
 ===== Concluzii ===== ===== Concluzii =====
  
 +Proiectul demonstrează cum un sistem embedded poate fi integrat cu o aplicație software în timp real.
 +
 +Întreruperile hardware elimină latența specifică polling-ului,​ iar comunicația USART asigură transferul continuu al datelor.
 +
 +Ca îmbunătățiri posibile, creșterea frecvenței de eșantionare și o comunicare seriala mai compacta ar putea crește fluiditatea controlului.
 ===== GitHub ===== ===== GitHub =====
  
Line 115: Line 133:
  
 </​note>​ </​note>​
 +
 ===== Jurnal ===== ===== Jurnal =====
  
   * **01.03.2026 - 01.05.2026**:​ Stabilirea temei, achiziționarea componentelor,​ testarea individuală a modulelor.   * **01.03.2026 - 01.05.2026**:​ Stabilirea temei, achiziționarea componentelor,​ testarea individuală a modulelor.
   * **03.05.2026**:​ Realizarea documentatiei   * **03.05.2026**:​ Realizarea documentatiei
 +  * **11.05.2026**:​ Hardware finished
 +  * **18.05.2026**:​ Software finished
 ===== Bibliografie/​Resurse ===== ===== Bibliografie/​Resurse =====
  
pm/prj2026/farhad_ali.gul/teodora.plopeanu.1777829874.txt.gz · Last modified: 2026/05/03 20:37 by teodora.plopeanu
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