This is an old revision of the document!


Joc 2048 pe Arduino

Nume: Dumitrache Stefan-Adelin
Grupa:331CB

Scurta descriere

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.

Descriere generala

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.

Schema bloc

Hardware Design

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.

BOM - Bill of Materials

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 provizorie

Schema electrica finala va fi realizata dupa testarea componentelor pe breadboard. Pentru moment, conexiunile propuse sunt urmatoarele:

Conectare LCD 12864 ST7920

Pin LCD ST7920 Pin Arduino Uno
VSS / GND GND
VDD / VCC 5V
VO / V0 Pin mijloc potentiometru 10K
RS / CS D10
RW / SID D11
E / SCLK D13
PSB GND
RST D8
BLA / LED+ 5V
BLK / LED- GND prin rezistenta 220 Ohm

Conectare potentiometru pentru contrast

Pin potentiometru Conectare
Pin lateral 1 GND
Pin lateral 2 5V
Pin mijloc VO LCD

Conectare butoane

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

Conectare buzzer

Componenta Pin Arduino
Buzzer pasiv + D6
Buzzer pasiv - GND

Conectare LED RGB

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

Software Design

Proiectul este implementat in Arduino IDE, dar pentru partea de control hardware sunt folositi registrii microcontrollerului ATmega328P. Biblioteca standard Arduino este folosita doar pentru functii auxiliare, iar controlul principal al pinilor, UART-ului, timerului si interfetei SPI este realizat prin acces direct la registri.

Codul implementeaza logica jocului 2048 folosind o matrice 4×4. Dupa fiecare mutare valida, placutele sunt deplasate si combinate conform regulilor jocului, scorul este actualizat si se adauga o noua placuta cu valoarea 2 sau 4. Jocul se termina atunci cand nu mai exista mutari posibile sau cand este obtinuta valoarea 2048.

Laboratoare acoperite

Proiectul foloseste concepte din mai multe laboratoare PM:

  • Laboratorul 0 - GPIO: butoanele directionale sunt citite direct din registrul PIND, iar LED-ul RGB si buzzer-ul sunt controlate prin registrii PORTD si PORTB.
  • Laboratorul 1 - UART: interfata UART este initializata prin registrii UBRR0H, UBRR0L, UCSR0B si UCSR0C, iar datele de debug sunt trimise prin registrul UDR0.
  • Laboratorul 3 - Timere: buzzer-ul pasiv este controlat folosind Timer2 in mod CTC, prin registrii TCCR2A, TCCR2B, OCR2A si TIMSK2.
  • Laboratorul 5 - SPI: display-ul LCD ST7920 este controlat prin interfata SPI hardware a microcontrollerului, folosind registrii SPCR, SPSR si SPDR.

Detalii de implementare

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.

Functii implementate

  • setup() - initializeaza GPIO, UART, Timer2, SPI, LCD-ul si tabla de joc
  • loop() - citeste butoanele si proceseaza mutarile
  • gpioInitRegisters() - configureaza pinii folosind registrii DDRD, DDRB, PORTD si PORTB
  • uartInitRegisters() - initializeaza UART-ul folosind registrii specifici ATmega328P
  • timer2InitForBuzzer() - configureaza Timer2 pentru generarea sunetului pe buzzer
  • spiInitRegisters() - initializeaza SPI hardware pentru comunicatia cu LCD-ul
  • lcdInitRegisters() - initializeaza display-ul ST7920
  • addRandomTile() - adauga o placuta noua cu valoarea 2 sau 4
  • drawGame() - deseneaza tabla de joc, scorul si mesajele pe LCD
  • moveLeft(), moveRight(), moveUp(), moveDown() - implementeaza logica mutarilor
  • isGameOver() - verifica daca mai exista mutari posibile
  • beepRegisters() - genereaza sunet folosind Timer2
  • setLedRegisters() - controleaza LED-ul RGB prin registri

Jurnal

  • 8 mai - completare descriere, schema bloc si lista de componente
  • 11 mai - testare LCD ST7920, butoane, LED RGB si buzzer
  • 11 mai - integrare hardware completa pe breadboard
  • 11 mai - implementare joc 2048 si trecere la control prin registri
  • urmeaza - finalizare schema electrica si realizare demo video
pm/prj2026/victor.stoica0203/stefan.dumitrache.1779527912.txt.gz · Last modified: 2026/05/23 12:18 by stefan.dumitrache
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