This shows you the differences between two versions of the page.
|
pm:prj2026:farhad_ali.gul:teodora.plopeanu [2026/05/18 14:42] 127.0.0.1 external edit |
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 intrare, procesare ș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 senzorului, de 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 PC, prin 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 (ax, ay, 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 MPU6050, prin interfața I2C, valori brute de accelerație pe axele X și Y (ax, ay), 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 91: | 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 întrerupere, ISR, declanș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 (ISR) declanșată pe frontul descendent, cu debounce software. La apăsarea butonului, microcontrollerul transmite către PC mesajul serial: | + | |
| <code> | <code> | ||
| Line 105: | Line 101: | ||
| </code> | </code> | ||
| - | pe baza că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 că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 ecran, iar valoarea asociată variabilei 'shot' declanșează acțiunea de tragere în joc. | + | Jocul este de tip arcade, bazat pe o mecanica de tipul "light in the dark". |
| - | Jocul este de tip arcade, bazat 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ștri, vizibili 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ție. Sistemul poate fi îmbunătățit prin creșterea frecvenței de eșantionare a senzorului și adoptarea unui protocol serial mai compact, pentru o 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 129: | Line 133: | ||
| </note> | </note> | ||
| + | |||
| ===== Jurnal ===== | ===== Jurnal ===== | ||