This is an old revision of the document!
Nume: Dumitrache Stefan-Adelin
Grupa:331CB
Proiectul implementeaza jocul 2048 folosind o placa Arduino Uno R3. Jocul este afisat pe un display LCD grafic 128×64 cu controller ST7920, iar controlul mutarilor se face prin 4 butoane directionale. Pentru feedback, proiectul foloseste un buzzer pasiv si un LED RGB. Resetarea jocului se poate face folosind butonul de reset al placii Arduino.
Jocul 2048 este un joc de puzzle in care utilizatorul muta placutele de pe o tabla 4×4 in una dintre cele patru directii: sus, jos, stanga sau dreapta. Daca doua placute cu aceeasi valoare se intalnesc, acestea se combina intr-o singura placuta cu valoare dubla.
Scopul jocului este obtinerea unei placute cu valoarea 2048. Jocul se termina atunci cand nu mai exista mutari valide. In cadrul proiectului, interactiunea cu utilizatorul se realizeaza prin butoane, iar tabla de joc este afisata pe un display LCD grafic.
Partea hardware este formata dintr-o placa Arduino Uno R3, un display LCD grafic 128×64 cu controller ST7920, 4 butoane pentru controlul directiilor, un buzzer pasiv si un LED RGB. Display-ul este folosit pentru afisarea tablei de joc si a scorului, butoanele sunt folosite pentru mutarea placutelor, iar buzzer-ul si LED-ul RGB ofera feedback sonor si vizual.
| Nr. | Componenta | Cantitate | Rol in proiect |
|---|---|---|---|
| 1 | Arduino Uno R3 compatibil | 1 | Placa principala pe care ruleaza jocul |
| 2 | Display LCD grafic 128×64 ST7920, 5V | 1 | Afisarea tablei de joc, scorului si mesajului de final |
| 3 | Butoane tactile / switch-uri | 4 | Controlul directiilor: sus, jos, stanga, dreapta |
| 4 | Buzzer pasiv | 1 | Feedback sonor pentru mutari si game over |
| 5 | LED RGB 5mm | 1 | Feedback vizual pentru starea jocului |
| 6 | Rezistente 220/330 Ohm | 3 | Limitarea curentului pentru LED-ul RGB |
| 7 | Potentiometru 10K | 1 | Reglarea contrastului display-ului LCD |
| 8 | Breadboard 830 puncte | 1 | Realizarea conexiunilor |
| 9 | Fire jumper | aprox. 20-30 | Conectarea componentelor |
| 10 | Cablu USB | 1 | Alimentarea si programarea placii Arduino |
Majoritatea componentelor, in afara display-ului LCD grafic, sunt incluse intr-un kit Arduino basic.
Schema electrica a proiectului este realizata pe breadboard, folosind placa Arduino Uno R3 ca unitate principala de control. Display-ul LCD ST7920 este conectat in mod serial, butoanele sunt conectate la pini digitali folosind rezistentele interne de pull-up ale microcontrollerului, iar LED-ul RGB si buzzer-ul sunt folosite pentru feedback vizual si sonor.
| Componenta | Conectare |
|---|---|
| Arduino 5V | Linia + de pe breadboard |
| Arduino GND | Linia - de pe breadboard |
| Pin LCD ST7920 | Pin Arduino / Breadboard |
|---|---|
| GND / VSS | GND |
| VCC / VDD | 5V |
| VO / V0 | Pin mijloc potentiometru 10K |
| RS / CS | D10 |
| R/W / SID | D11 |
| E / SCLK | D13 |
| PSB | GND |
| RST | D8 |
| VOUT | Pin lateral potentiometru 10K |
| BLA / LED+ | 5V |
| BLK / LED- | GND prin rezistenta 220 Ohm |
Pinii DB0-DB7 nu sunt folositi, deoarece display-ul este conectat in mod serial.
| Pin potentiometru | Conectare |
|---|---|
| Pin lateral 1 | LCD VOUT |
| Pin lateral 2 | GND |
| Pin mijloc | LCD VO / V0 |
Butoanele sunt configurate in cod folosind rezistentele interne de pull-up. Fiecare buton este conectat intre pinul digital al placii Arduino si GND.
| Buton | Pin Arduino | Cealalta parte |
|---|---|---|
| Sus | D2 | GND |
| Jos | D3 | GND |
| Stanga | D4 | GND |
| Dreapta | D5 | GND |
| Pin buzzer | Conectare |
|---|---|
| + | D6 |
| - | GND |
LED-ul RGB folosit este de tip catod comun. Fiecare culoare este conectata printr-o rezistenta de limitare a curentului.
| Pin LED RGB | Conectare |
|---|---|
| Rosu | D7 prin rezistenta 220/330 Ohm |
| Verde | D9 prin rezistenta 220/330 Ohm |
| Albastru | D12 prin rezistenta 220/330 Ohm |
| Catod comun | GND |
| Pin potentiometru | Conectare |
|---|---|
| Pin lateral 1 | GND |
| Pin lateral 2 | 5V |
| Pin mijloc | VO LCD |
Butoanele vor fi configurate in cod folosind rezistentele interne de tip INPUT_PULLUP ale placii Arduino. Fiecare buton va fi conectat intre pinul Arduino si GND.
| Buton | Pin Arduino |
|---|---|
| Sus | D2 |
| Jos | D3 |
| Stanga | D4 |
| Dreapta | D5 |
| Componenta | Pin Arduino |
|---|---|
| Buzzer pasiv + | D6 |
| Buzzer pasiv - | GND |
| Pin LED RGB | Pin Arduino |
|---|---|
| Rosu | D7 prin rezistenta 330 Ohm |
| Verde | D9 prin rezistenta 330 Ohm |
| Albastru | D12 prin rezistenta 330 Ohm |
| Catod comun | GND |
Proiectul este implementat in Arduino IDE. Pentru controlul componentelor simple sunt folositi registrii microcontrollerului ATmega328P, iar pentru display-ul LCD ST7920 este folosita biblioteca U8g2 in mod software SPI.
Logica jocului este implementata folosind o matrice 4×4. La fiecare mutare, linia sau coloana afectata este comprimata, placutele egale sunt combinate, scorul este actualizat, iar apoi se adauga o noua placuta cu valoarea 2 sau 4. Jocul verifica permanent daca exista mutari valide sau daca s-a ajuns la valoarea 2048.
Pentru debugging este folosita comunicatia UART, initializata prin registri. Pentru buzzer-ul pasiv este folosit Timer2 in mod CTC, iar LED-ul RGB si butoanele sunt controlate prin acces direct la registrii GPIO.
Proiectul foloseste concepte din mai multe laboratoare PM:
Pentru GPIO, pinii folositi pentru butoane sunt configurati ca intrari cu rezistente interne de pull-up, iar starile lor sunt citite din registrul PIND. LED-ul RGB si buzzer-ul sunt configurate ca iesiri prin registrii DDRD si DDRB si sunt controlate prin PORTD si PORTB.
Pentru UART, proiectul foloseste comunicatia seriala pentru debugging. Sunt trimise mesaje in Serial Monitor la pornirea jocului, la apasarea butoanelor, la mutari valide/invalide si la finalul jocului.
Pentru buzzer, Timer2 este configurat in modul CTC. La fiecare intrerupere, pinul buzzer-ului este comutat, generand un semnal periodic necesar pentru buzzer-ul pasiv.
Pentru LCD, comunicatia cu display-ul ST7920 este realizata prin SPI hardware. Arduino Uno foloseste pinii D13 pentru SCK, D11 pentru MOSI si D10 pentru CS. Datele sunt trimise catre LCD prin registrul SPDR, iar finalizarea transferului este verificata prin flag-ul SPIF din registrul SPSR.