This is an old revision of the document!
Proiectul „PAC-MAN Portable” constă în realizarea unei mini-console portabile de joc, inspirată de titlul clasic PAC-MAN, implementată pe platforma Arduino Uno R3 (ATmega328P). Sistemul îmbină mai multe componente hardware și software, oferind funcționalități integrate precum afișare grafică pe display OLED, interacțiune prin butoane fizice, reglaj de viteză prin potențiometru, feedback vizual prin LED RGB, efecte sonore prin buzzer și salvarea progresului pe un card microSD.
Acest proiect are rolul de a demonstra integrarea și utilizarea eficientă a diferitelor interfețe hardware și protocoale de comunicație serială, fiind totodată un exemplu aplicat de dezvoltare embedded cu funcționalități avansate de joc.
Consola este alcătuită dintr-un modul principal Arduino Uno R3 (ATmega328P), un display OLED 128×64 I2C (SSD1306), un LED RGB pentru feedback vizual, 5 butoane tactile pentru controlul jocului, un buzzer pentru efecte sonore și un potențiometru pentru ajustarea vitezei. De asemenea, include un modul SD card conectat prin SPI pentru salvarea automată a progresului. Toate componentele sunt montate pe breadboard pentru testare rapidă, apoi pe o placă de prototipare. Alimentarea se face fie prin USB, fie printr-o baterie de 9V conectată la Arduino printr-un suport cu jack (OKY0259).
Componente:
Protocoale și Interfețe Hardware:
Bill of Materials (BOM)
Componentă | Tip | Protocol | Cantitate | Link / Specificații |
---|---|---|---|---|
Arduino UNO R3 | Controller | - | 1 | datasheet |
Buton (Sus - D2) | Input | GPIO | 1 | link-piesa |
Buton (Jos - D3) | Input | GPIO | 1 | link-piesa |
Buton (Stânga - D4) | Input | GPIO | 1 | link-piesa |
Buton (Dreapta - D5) | Input | GPIO | 1 | link-piesa |
Buton (Shoot - D6) | Input | GPIO | 1 | link-piesa |
OLED Display 128 x 64 | Output | I2C | 1 | link-piesa |
RGB LED (anod comun) | Output | GPIO / PWM | 1 | link-piesa |
Potențiometru (10kΩ) | Input | ADC | 1 | link-piesa |
Buzzer (pe A1) | Output | GPIO | 1 | link-piesa |
Card SD + Modul | I/O | SPI | 1 | link-piesa |
Breadboard 170 puncte | - | - | 1 | link-piesa |
Placă prototipare 7×9 | - | - | 1 | link-piesa |
Suport baterie 9V | - | - | 1 | link-piesa |
Rezistență 220Ω - LED | - | - | 3 | - |
Rezistență 10kΩ - butoane | - | - | 5 | - |
Schemă Electrică
Descriere Detaliată
Caracteristici Advanced ale Jocului
Tabel Conexiuni Componente
Componentă | Pin Arduino | Funcție |
---|---|---|
Buton Sus | D2 | Control joc – mișcare sus (digital input) |
Buton Jos | D3 | Control joc – mișcare jos (digital input) |
Buton Stânga | D4 | Control joc – mișcare stânga (digital input) |
Buton Dreapta | D5 | Control joc – mișcare dreapta (digital input) |
Buton Shoot | D6 | Declanșare împușcare (digital input) |
Potențiometru | A0 | Reglare dificultate – citire analogică (ADC) |
Display OLED | A4 (SDA), A5 (SCL) | Afișaj stare joc |
LED RGB - Roșu | D7 | Feedback – stare eșec (digital output) |
LED RGB - Verde | D8 | Feedback – stare victorie (digital output) |
LED RGB - Albastru | D9 (PWM) | Feedback – efecte fading (PWM output) |
Buzzer | A1 | Sunete joc (digital output) |
SD Card – MISO | D12 | Citire date (SPI) |
SD Card – MOSI | D11 | Scriere date (SPI) |
SD Card – SCK | D13 | Ceas SPI |
SD Card – CS | D10 | Chip Select pentru SD (SPI) |
Imagini Sugestive Implementare Hardware
Mediu de dezvoltare Arduino IDE
Librării și surse 3rd-party Adafruit_GFX.h – librărie grafică utilizată pentru desenarea formelor și simbolurilor pe ecrane OLED.
Adafruit_SSD1306.h – driver pentru afișajele OLED cu controller SSD1306 (comunicare I2C).
SPI.h, Wire.h – librării standard pentru comunicația SPI și I2C.
Componente hardware utilizate Display OLED 128×64 (conectat prin I2C la pinii A4 – SDA, A5 – SCL)
5 Butoane pentru control direcțional și acțiune (pini D2–D6)
Potentiometru pentru controlul vitezei jocului (A0)
LED RGB pentru feedback vizual (pini D7 – roșu, D8 – verde, D9 – albastru, PWM)
Buzzer pentru semnale audio (pin A1)
Harta jocului este definită sub formă de matrice 2D (wallsMap), cu dimensiuni 16×8.
La începutul fiecărui nivel, se generează puncte de colectat (DOT-uri) aleator pe poziții libere.
Jucătorul este reprezentat de un cerc desenat pe ecran, care se deplasează în funcție de inputul de la butoane.
Un “fantomă” (ghost) apare în nivelurile 3 și 4, deplasându-se pentru a urmări jucătorul.
În nivelul 4, este introdus un tile special de tip power-up, care activează imunitatea temporară (5 secunde).
Cât timp imunitatea este activă:
Fantoma nu mai produce Game Over la coliziune.
LED-ul albastru pulsează.
Jucătorul are o animație grafică specială.
Jocul se termină în două moduri:
Victorie: Toate DOT-urile au fost colectate (LED verde + sunet de victorie)
Game Over: Jucătorul este prins de fantomă sau calcă într-o capcană (LED roșu + sunet specific)
setup() Inițializează comunicațiile I2C și seriale.
Inițializează display-ul OLED și LED-urile.
Configurează pinii pentru butoane și buzzer.
Afișează ecranul de Start.
loop() Monitorizează inputul de la butoane pentru mișcarea jucătorului.
Actualizează poziția fantomei (dacă este activă).
Verifică coliziunile: cu pereți, puncte, capcane, fantome.
Desenează constant harta actualizată și toate elementele vizuale.
Activează și dezactivează automat imunitatea în funcție de timp.
Controlează LED-urile în funcție de starea jocului.
Generează efecte audio prin buzzer pentru evenimentele importante.
generateDots(uint8_t count) Populează harta cu un număr de puncte colectabile.
Adaugă capcane și fantoma în nivelurile superioare.
În nivelul 4, adaugă un tile power-up într-o poziție fixă.
drawTile(), drawPlayer(), drawGhost() Redau grafic elementele jocului pe OLED: pereți, puncte, capcane, power-up, jucător, fantomă.
Jucătorul primește o animație specială în timpul imunității.
isImmunityActive() Returnează true dacă jucătorul este încă în perioada de imunitate.
Dezactivează automat imunitatea după 5 secunde și oprește LED-ul albastru.
playPowerUpSound(), playGameOverSound(), playWinSound() Emit tonuri sonore diferite prin buzzer în funcție de evenimentul declanșat.
Controlul vitezei jocului printr-un potentiometru (analog A0), adaptând delay-ul de mișcare.
Feedback vizual și audio complet:
LED verde: câștig
LED roșu: pierdere
LED albastru: imunitate
Buzzer: notificări sonore
Extindere modulară pentru niveluri multiple (până la 4), fiecare cu logică specifică.
Proiectul integrează hardware divers cu logică de joc completă, gestionare de evenimente, animații grafice și feedback în timp real. Este un exemplu complex de utilizare a microcontrolerului Arduino UNO în jocuri embedded cu interfață interactivă.
Fişierele se încarcă pe wiki folosind facilitatea Add Images or other files. Namespace-ul în care se încarcă fişierele este de tipul :pm:prj20??:c? sau :pm:prj20??:c?:nume_student (dacă este cazul). Exemplu: Dumitru Alin, 331CC → :pm:prj2009:cc:dumitru_alin.