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/19 23:28]
teodora.plopeanu [Hardware Design]
pm:prj2026:farhad_ali.gul:teodora.plopeanu [2026/05/20 00:23] (current)
teodora.plopeanu [Descriere generală]
Line 37: Line 37:
   * **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.   * **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.
  
  
 === 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 ===
Line 54: Line 55:
 | Senzor giroscop | MPU6050 | I2C | SDA=PC4, SCL=PC5 | | Senzor giroscop | MPU6050 | I2C | SDA=PC4, SCL=PC5 |
 | Trigger Buton | Push Button | ISR + GPIO | PD2 (INT0) | | Trigger Buton | Push Button | ISR + GPIO | PD2 (INT0) |
-| Buzzer pasiv | - | Fast PWM + GPIO | PD3 |+| Buzzer pasiv | - | Fast PWM + GPIO | PD3 (OC2B) ​|
 | Breadboard | - | - | - | | Breadboard | - | - | - |
 | Fire Dupont | - | - | - | | Fire Dupont | - | - | - |
Line 66: 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țializare,​ sistemul realizează o etapă de calibrare, în care poziția inițială a 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 (axayaz) și giroscopului ​(gxgy, gzprin 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 I2Cvalori brute de accelerație pe axele X și (axay), care descriu înclinarea dispozitivului în spațiu. Aceste valori sunt procesate ​și raportate la poziția de referință stabilită la inițializare,​ pentru a determina poziția țintei pe ecran. +
- +
-În paralel, este verificată starea butonului de trigger. Sistemul ​transmite ​continuu ​către PC un mesaj serial, în urmatorul format:+
  
 <​code>​ <​code>​
Line 92: Line 89:
 unde: unde:
  
-  * ax, ay, az = accelerațiile liniare pe cele trei axe în m/s² +  * ax, ay, az = accelerațiile liniare pe cele trei axe 
-  * gx, gy, gz = vitezele unghiulare ​în rad/s +  * gx, gy, gz = vitezele unghiulare 
-  * t = temperatura internă a senzorului ​în grade Celsius.+  * t = temperatura internă a senzorului
  
-Astfel, poziția este actualizată permanent în joc. +Butonul de trigger este conectat la pinul PD2 (INT0) și este gestionat printr-o rutină de întrerupereISRdeclanșată pe frontul descendent, cu debounce. La apăsarea butonului, ​microcontrolerul ​transmite către PC pe serial ​mesajul:
- +
-Butonul de trigger este conectat la pinul PD2 (INT0) și este gestionat printr-o rutină de întrerupere ​(ISRdeclanșată pe frontul descendent, cu debounce ​software. La apăsarea butonului, ​microcontrollerul ​transmite către PC mesajul ​serial:+
  
 <​code>​ <​code>​
Line 106: Line 101:
 </​code>​ </​code>​
  
-pe baza ruia aplicația ​PC înregistrează acțiunea de tragere în joc.+și activează buzzerul pentru feedback auditiv si actiunea de tragere in joc. 
 + 
 +Sunetul de tragere este simulat prin varierea frecvenței semnalului PWM generat de Timer2. Incepe cu o frecvență ridicată (~900 Hz), care scade rapid tre frecvențe joase (~120 Hz), simulând impactul unui foc de armă. 
 + 
 +Calibrarea și maparea coordonatelor sunt gestionate de aplicația ​Python. La pornirea jocului, primele 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.+Î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 de accelerație ​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 întrerupere hardware (ISR pe INT0), cu feedback auditiv ​asigurat ​de buzzerul pasiv controlat prin PWM pe Timer2. Jocul integrează complet inputul fizic.+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ă ​integrarea unui sistem embedded cu o aplicație software în timp real. Utilizarea întreruperilor ​hardware ​pentru buton elimină latența specifică polling-ului,​ iar comunicația USART asigură transferul continuu al datelor ​de pozițieSistemul poate fi îmbunătățit prin creșterea frecvenței de eșantionare ​a senzorului ​și adoptarea unui protocol serial mai compact, pentru ​experiență de joc mai fluidă.+ 
 +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 130: Line 133:
  
 </​note>​ </​note>​
 +
 ===== Jurnal ===== ===== Jurnal =====
  
pm/prj2026/farhad_ali.gul/teodora.plopeanu.1779222531.txt.gz · Last modified: 2026/05/19 23:28 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