This is an old revision of the document!
Proiectul propune dezvoltarea unui sistem de gaming interactiv format dintr-un joc de tip shooter și un controller fizic sub formă de pistol, capabil să transpună în timp real mișcările utilizatorului în mediul virtual.
Obiectivul principal este integrarea segmentelor hardware și software într-un sistem coerent, oferind o experiență de joc captivantă bazată pe motion control.
Sistemul utilizează un microcontroller ATmega328P si un senzor giroscop pentru detectarea miscarii, în timp ce gameplay-ul mizează pe o mecanică de tip “light in the dark” pentru a intensifica nivelul de dificultate și realism.
Ideea a pornit de la dorința de a crea o alternativă interactivă la metodele clasice de control în jocuri, combinând acțiunea fizică cu cea digitală.
De ce este util? Consider că un astfel de sistem aduce un plus de realism și implicare în gaming, prin înlocuirea comenzilor tradiționale cu interacțiuni fizice intuitive. Această abordare optimizează experiența utilizatorului și explorează noi direcții în motion gaming, oferind o alternativă accesibilă și ușor de implementat la soluțiile VR complexe.
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.
Dispozitivul este construit pe o platforma din lemn, cu două niveluri:
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.
Proiectul cuprinde atat componente care opereaza la tensiunea de 5V, cat si la 3V3.
| Nume componenta | Model | Protocol |
|---|---|---|
| Microcontroller | ATmega328P Xplained Mini | USART, USB |
| Senzor giroscop | MPU6050 | I2C |
| Trigger Buton | Push Button | ISR + GPIO |
| Buzzer pasiv | - | Fast PWM + GPIO |
| Breadboard | - | - |
| Fire Dupont | - | - |
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).
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.
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.
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 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:
Accel X: <ax> | Y: <ay> | Z: <az> m/s^2 Gyro X: <gx> | Y: <gy> | Z: <gz> rad/s Temp: <t> C
unde:
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 software. La apăsarea butonului, microcontrollerul transmite către PC mesajul serial:
Buton apasat
pe baza căruia aplicația PC înregistrează acțiunea de tragere în joc.
Dacă trigger-ul este apăsat, microcontrollerul activează buzzerul pentru o perioadă scurtă, oferind feedback auditiv pentru acțiunea de tragere.
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.
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 tip “light in the dark”. Pentru a castiga, trebuie sa tintesti cat mai multi monstri intr-un interval dat de timp.
În urma implementării, am obtinut un joc interactiv care funcționează conform cerințelor propuse.
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.
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ă.
Resurse hardware:
Resurse software: