This is an old revision of the document!


Snake Game - Luca David-Ionut 334CD

Acest proiect constă într-o implementare a jocului Snake clasic pe platforma Arduino Uno R3. O caracteristică importantă este controlul vitezei șarpelui prin intermediul unui potențiometru, iar scorul obținut de jucător este vizualizat pe un display LCD.

Milestone 2 (HARDWARE):

Componente: LCD 12864 Albastru ST7920, Modul potentiometru rotativ RV09, 4 x Buton Mini 6x6x5 4 pini.

Am finalizat conexiunile componentelor, configurarea pinilor butoanelor, citirea valorilor potențiometrului și funcționarea display-ului LCD. Partea hardware este completă, urmând să mă concentrez pe implementarea software-ului.

Butoane:

Cele 4 butoane sunt conectate la pinii 2, 3, 4 și 9. Am ales acești pini deoarece:

  1. Butonul conectat la pinul 2 va genera o întrerupere externă INT0.
  2. Butonul conectat la pinul 3 va genera o întrerupere externă INT1.
  3. Butonul conectat la pinul 4 va genera o întrerupere la schimbarea stării pinului (PCINT2)
  4. Butonul conectat la pinul 9 va genera o întrerupere la schimbarea stării pinului (PCINT0)

În acest mod, avem rutine separate (sau mecanisme de identificare) pentru fiecare buton, și nu trebuie să verificăm ce buton a fost apăsat în mod constant în bucla principală a programului. Un pin al fiecărui buton este conectat la ground, iar celălalt este conectat la pinul de intrare respectiv al plăcii. De asemenea, butoanele folosesc rezistențele de pull-up interne ale Arduino.

Potentiometru:

Potențiometrul este conectat astfel: GND la masă, Vcc la 5V, iar ieșirea (OUT) la pinul analogic A0 al Arduino. Valoarea citită de pe potențiometru va fi utilizată pentru a controla viteza șarpelui

LCD-ul:

Pinii LCD-ului ST7920 128×64 sunt conectati de placa Arduino in felul urmator:

  • GND → GND (Pinul de masă al LCD-ului este conectat la masa Arduino. Acesta este punctul de referință pentru toate tensiunile din circuit.)
  • Vcc → 5V (Pinul de alimentare al LCD-ului este conectat la 5V de pe Arduino.)
  • RS → PIN 10 (Pinul “Register Select” (RS) al LCD-ului este conectat la pinul 10 al Arduino. Acest pin este folosit pentru a diferenția între datele de comandă și datele de afișat trimise către LCD.)
  • R/W → PIN 11 (Pinul “Read/Write” (R/W) al LCD-ului este conectat la pinul 11 al Arduino. Acest pin controlează direcția de transfer al datelor.)
  • E → PIN 13 (Pinul “Enable” (E) al LCD-ului este conectat la pinul 13 al Arduino. Acest pin este folosit pentru a sincroniza transferul de date între Arduino și LCD.)
  • PSB → GND (Pinul “Parallel/Serial Select” (PSB) al LCD-ului este conectat la GND. Acest pin selectează modul de comunicare cu LCD-ul.)
  • RST → PIN 8 (Pinul “Reset” (RST) al LCD-ului este conectat la pinul 8 al Arduino. Acest pin este folosit pentru a reseta LCD-ul, aducându-l într-o stare inițială cunoscută.)
  • BLA → 3.3V (Pinul “Backlight Anode” (BLA) al LCD-ului este conectat la 3.3V. Acesta este pinul pozitiv de alimentare pentru iluminarea de fundal a LCD-ului.)
  • BLK → GND (Pinul “Backlight Cathode” (BLK) al LCD-ului este conectat la GND. Acesta este pinul negativ de alimentare pentru iluminarea de fundal a LCD-ului.)

LCD-ul ST7920 comunică cu placa de dezvoltare Arduino prin protocolul SPI.

Bill of Materials:

Diagrama Bloc a proiectului:

Circuit:

Schema electrică:

Poză:

MILESTONE 3 - SOFTWARE

Stadiul proiectului

Proiect finalizat cu toate functiile precizate de mai sus complete. Sarpele poate fi controlat, creste, se poate schimba viteza si de asemenea se tine cont de scorul curent si recordul din sesiunea curenta din joc.

Biblioteci

Biblioteca pe care am folosit-o este u8g2. Aceasta faciliteaza accesul la functiile LCD-ului, se poate afisa text usor, forme etc.

Elemente originale

Elementul de unicitate este schimbarea vitezei, nemaintalnind aceasta functionalitate cand am jucat diverite versiuni ale jocului “Snake”.

Concepte aplicate

Ca si concepte dobandite de la laborator am folosit intreruperi, generate de butoane cand sunt apasate. Rutinele de intreruperi schimba directia in care se misca sarpele. Am folosit si SPI, pentru comunicarea dintre placa si LCD, si de asemenea ADC, pentru citirea inputul-ui analog al potentiometrului.

Sumarul scheletului de cod

In functia de loop, capul sarpelui isi actualizeaza coordonatele in functie de directia curenta. Dupa actualizarea pozitiei se verifica urmatoarele:

  1. Player-ul a atins un punct de scor → Lungimea sarpelui va creste, iar scorul jocului va fi incrementat
  2. Player-ul s-a lovit de o parte a sarpelui sau perete → GAME OVER, se reseteaza scor-ul (in cazul in care scorul este mai mare decat recordul curent, acesta va fi actualizat)

De asemenea la finalul loop-ului exista un delay de 100ms + map(valoare_ADC) pentru ca viteza sarpelui sa poata fi reglabila.

Un scurt demo al jocului

ejmf104xeie

pm/prj2025/fstancu/david_ionut.luca.1748205664.txt.gz · Last modified: 2025/05/25 23:41 by david_ionut.luca
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