This is an old revision of the document!


PONG GAME

Introducere

  • Proiectul consta in implementarea unui joc de tip Pong pentru doi jucatori utilizand o placa de dezvoltare ATmega328P Xplained Mini, un display OLED 128×64 si module LED pentru feedback vizual. Fiecare jucator controleaza o paleta prin intermediul a doua butoane, unul pentru deplasarea in sus si unul pentru deplasarea in jos. Scopul jocului este de a lovi mingea si de a inscrie puncte impotriva adversarului.

Descriere generala

  • Sistemul implementat reprezinta un joc interactiv in timp real pentru doi jucatori. Fiecare jucator controleaza o paleta aflata pe marginea ecranului, iar mingea se deplaseaza continuu intre cele doua parti. Directia mingii se modifica in functie de coliziunea cu marginile ecranului sau cu paletele jucatorilor.
  • Jocul include un sistem de scor care este actualizat automat atunci cand unul dintre jucatori nu reuseste sa loveasca mingea. Afisarea elementelor grafice se realizeaza pe display-ul OLED, iar interactiunea utilizatorului este realizata prin intermediul butoanelor. Pentru imbunatatirea experientei de joc, sistemul poate genera semnale sonore folosind un buzzer la evenimente precum coliziunile sau marcarea unui punct.
  • Proiectul foloseste si doua module LED de tip semafor pentru feedback vizual. Acestea indica starea jocului in timpul countdown-ului, marcheaza vizual momentul in care un jucator inscrie si evidentiaza castigatorul la finalul meciului.

Hardware Design

Lista de piese (Bill of Materials):

  • Placa de dezvoltare ATmega328P Xplained Mini: Microcontrollerul principal care gestioneaza logica jocului, citirea input-urilor si controlul perifericelor.
  • Display OLED 0.96” SSD1306 cu interfata I2C: Ecran grafic utilizat pentru afisarea paletelor, mingii si scorului in timpul jocului.
  • Module buton KY-004: 4 bucati utilizate pentru controlul paletelor celor doi jucatori prin miscari sus si jos.
  • Modul buzzer pasiv KY-006: Utilizat pentru generarea efectelor sonore controlabile prin software la coliziuni sau marcarea punctelor.
  • Module LED semafor compatibile Arduino: 2 bucati utilizate pentru feedback vizual, cate unul pentru fiecare jucator. Acestea indica starea jocului, marcheaza inscrierea unui punct si semnalizeaza castigatorul.
  • Breadboard 400 puncte: Folosit pentru realizarea conexiunilor hardware si prototiparea circuitului fara lipire.
  • Fire Dupont Tata-Tata si Tata-Mama: Utilizate pentru realizarea conexiunilor electrice intre placa de dezvoltare, module si breadboard.

Conexiunile hardware finale sunt urmatoarele:

Componenta Pin componenta Conectare
OLED SSD1306 VCC VCC microcontroller
OLED SSD1306 GND GND microcontroller
OLED SSD1306 SDA PC4 microcontroller
OLED SSD1306 SCL PC5 microcontroller
Componenta Pin componenta Conectare
Buton P1_UP KY-004 S D2 microcontroller
Buton P1_DOWN KY-004 S D3 microcontroller
Buton P2_UP KY-004 S D4 microcontroller
Buton P2_DOWN KY-004 S D5 microcontroller
Toate butoanele KY-004 - GND breadboard
Toate butoanele KY-004 pin mijloc neconectat
Componenta Pin componenta Conectare
Buzzer pasiv KY-006 S D6 microcontroller
Buzzer pasiv KY-006 minus GND breadboard
Componenta Pin componenta Conectare
Modul LED Player 1 R D7 microcontroller
Modul LED Player 1 Y D8 microcontroller
Modul LED Player 1 G D9 microcontroller
Modul LED Player 1 GND GND breadboard
Modul LED Player 2 R D10 microcontroller
Modul LED Player 2 Y D11 microcontroller
Modul LED Player 2 G D12 microcontroller
Modul LED Player 2 GND GND breadboard
Componenta Conectare
Breadboard GND microcontroller → bara GND breadboard
  • Breadboard-ul este folosit pentru distribuirea conexiunii de masa catre butoane, buzzer si modulele LED. Display-ul OLED este conectat direct la microcontroller deoarece foloseste interfata I2C, prin pinii PC4 si PC5. Butoanele sunt configurate in cod cu INPUT_PULLUP, motiv pentru care pinul de mijloc al modulelor KY-004 ramane neconectat, iar apasarea butonului conecteaza pinul de semnal la GND.

Software Design

https://github.com/vled04/PONG-GAME-PM

Proiectul a fost dezvoltat in PlatformIO, folosind framework-ul Arduino pentru placa ATmega328P Xplained Mini. Codul este scris in C++ si foloseste functii specifice Arduino pentru citirea butoanelor, controlul LED-urilor, controlul buzzerului, comunicatia I2C cu display-ul OLED si comunicatia UART prin Serial Monitor.

Functii principale implementate:

Functie Rol
setup() Initializeaza pinii pentru butoane, buzzer si LED-uri, porneste comunicatia I2C, initializeaza display-ul OLED si pregateste ecranul initial al jocului.
loop() Reprezinta bucla principala a jocului. Verifica daca jocul a inceput, citeste input-ul jucatorilor, actualizeaza pozitia mingii, verifica coliziunile, scorul si redeseneaza ecranul.
readPaddles() Citeste cele patru butoane si modifica pozitia paletelor pentru Player 1 si Player 2.
drawGame() Deseneaza pe OLED scorul, viteza bilei, terenul, paletele si mingea.
drawStartScreen() Afiseaza ecranul initial, cu mesajul PONG si instructiunea de apasare a unui buton.
drawCountdownGameScreen() Afiseaza ecranul de pregatire inainte de inceperea meciului, pastrand vizibile paletele si mingea.
drawWinScreen() Afiseaza castigatorul meciului: P1 WINS sau P2 WINS.
startCountdown() Porneste secventa de pregatire inainte de meci, folosind LED-urile rosu, galben si verde.
checkWallCollision() Verifica daca mingea atinge bara de sus sau de jos si inverseaza directia pe axa Y.
checkPaddleCollision() Verifica daca mingea loveste una dintre palete si recalculeaza directia de ricosare in functie de zona lovita.
checkScore() Verifica daca mingea a iesit din teren prin stanga sau dreapta si actualizeaza scorul.
handleWin() Verifica daca un jucator a ajuns la scorul maxim si afiseaza castigatorul.
goalFlash() Controleaza LED-urile dupa marcarea unui punct: verde pentru jucatorul care a marcat si rosu pentru cel care a primit punctul.
winLEDAnimation() Controleaza animatia LED-urilor la finalul meciului.
beep() Genereaza sunete pe buzzer folosind functia tone().
increaseBallSpeed() Creste viteza bilei treptat, pana la o limita maxima.
resetBallRandom() Reseteaza mingea in centru si alege aleator directia initiala.
resetBallToDirection() Reseteaza mingea in centru si seteaza directia catre un anumit jucator.
printRoundResult() Afiseaza in Serial Monitor castigatorul rundei si viteza initiala/maxima a bilei.

Biblioteci folosite:

Biblioteca Rol
Arduino.h Functii de baza Arduino: GPIO, timere, delay, millis
Wire.h Comunicare I2C cu display-ul OLED
Adafruit_GFX.h Functii grafice pentru desenarea elementelor pe display
Adafruit_SSD1306.h Controlul display-ului OLED SSD1306
math.h Functii matematice pentru calculul directiei bilei

Rezultate Obtinute

Concluzii

Pentru PM FAIR o sa cumpar o cutie din plastic si o sa aranjez frumos toate componentele pentru a fi si frumos vizual

Bibliografie/Resurse

Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe Resurse Software şi Resurse Hardware.

pm/prj2026/ciprian.popescu0411/vlad_mihai.enea.1778678443.txt.gz · Last modified: 2026/05/13 16:20 by vlad_mihai.enea
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