This is an old revision of the document!


Arcade Shooter Game

  • Autor: Teodora-Anca Plopeanu
  • Grupa: 332CA

Introducere

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.

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.

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:

  • pe nivelul superior este montat pistolul, impreuna cu butonul de trigger, senzorul giroscop si buzzer-ul
  • pe nivelul inferior este amplasat microcontroller-ul

Interacțiunea modulelor

  • 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.
  • 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. Semnalul PWM este generat hardware prin Timer2, în modul Fast PWM, pe pinul OC2B/PD3.

Schema bloc

Hardware Design

Componentele proiectului opereaza la tensiunea de 5V.

Lista de componente utilizate

Nume componenta Model Protocol Pinout
Microcontroller ATmega328P Xplained Mini USART, USB -
Senzor giroscop MPU6050 I2C SDA=PC4, SCL=PC5
Trigger Buton Push Button ISR + GPIO PD2 (INT0)
Buzzer pasiv - Fast PWM + GPIO PD3 (OC2B)
Breadboard - - -
Fire Dupont - - -

Schema electrica

Software Design

Mediu de dezvoltare si Biblioteci folosite

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.

Pentru interacțiunea cu senzorul MPU6050 va fi utilizată biblioteca Adafruit MPU6050 library, care simplifică comunicarea prin protocolul I2C.

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 Timer2 cu FastPWM pentru comanda buzzerului pasiv.

Î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:

Accel X: <ax> | Y: <ay> | Z: <az> m/s^2
Gyro X: <gx> | Y: <gy> | Z: <gz> rad/s
Temp: <t> C

unde:

  • ax, ay, az = accelerațiile liniare pe cele trei axe
  • gx, gy, gz = vitezele unghiulare
  • t = temperatura internă a senzorului

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:

Buton apasat

și activează buzzerul pentru feedback auditiv.

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.

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.

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.

Rezultate Obţinute

Î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.

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ă.

GitHub

Jurnal

  • 01.03.2026 - 01.05.2026: Stabilirea temei, achiziționarea componentelor, testarea individuală a modulelor.
  • 03.05.2026: Realizarea documentatiei
  • 11.05.2026: Hardware finished
  • 18.05.2026: Software finished

Bibliografie/Resurse

pm/prj2026/farhad_ali.gul/teodora.plopeanu.1779224551.txt.gz · Last modified: 2026/05/20 00:02 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