Snake Game

  • Autor: Voicu Andrei-Silviu
  • Grupa: 334CB

Introducere

  • ce face? Joc clasic Snake pe Arduino cu 4 butoane pentru mișcare, OLED 128×64 pe I2C pentru grafică și meniu, cronometru (timer hardware/RTC I2C) și salvare/încărcare a scorurilor pe card SD prin SPI.
  • care este scopul lui? Să aplice practic interfețele I2C, SPI și timerele hardware într-un sistem interactiv de gaming.
  • care a fost ideea de la care ați pornit? Dorința de a construi un proiect educativ și distractiv care să îmbine control digital, afișaj grafic și stocare externă.
  • de ce credeți că este util pentru alții și pentru voi? Oferă experiență reală în integrarea hardware-software pe Arduino și un punct de plecare pentru proiecte embedded avansate.

Descriere generală

Module și piese:

  • 4 butoane digitale → Input Handler: citește stările butoanelor pentru direcție și pauză.
  • Game Logic & Timer ISR: actualizează poziția șarpelui, verifică coliziuni, declanșează frame-ul la interval hardware.
  • Display Driver (I2C): afișează tabla de joc, meniuri şi cronometru pe OLED.
  • Storage Manager (SPI): salvează și încarcă scorurile pe card SD.
  • Cronometru RTC/Timer: furnizează timpul curent sau tick-uri de ceas pentru joc.
  • Indicator LED (PWM): semnalizează evenimente (e.g. mâncare).

Schemă bloc:

Hardware Design

Listă de piese:

  • Arduino UNO
  • 4 butoane
  • OLED 128×64
  • Modul Card SD Reader
  • Modul RTC
  • LED
  • Breadboard + fire

Schematic:

Proiect asamblat:

Software Design

Mediu de dezvoltare:

  • Platformă – PlatformIO + VSCode pe Windows
  • Target – Arduino UNO (ATmega328P)
  • Framework – Arduino

Biblioteci și surse 3rd-party utilizate:

  • U8g2 – pentru controlul ecranului OLED I2C (SSD1306)
  • SdFat – pentru scriere/citire eficientă pe cardul SD
  • RTClib – pentru utilizarea modulului RTC DS1307

Aceste biblioteci sunt folosite pentru a controla perifericele externe și pentru a asigura o interfață abstractă și ușor de utilizat în firmware.

Algoritmi și structuri implementate:

  • Structuri personalizate: Game, Snake, Point, ScoreEntry, Settings, pentru stocarea stării interne
  • Meniu interactiv scrollabil cu selecție și confirmare
  • Gestionare a scorurilor cu salvare persistentă în fișier binar pe card SD
  • Cronometru de joc bazat pe millis() pentru măsurarea duratei rundei
  • Logica jocului Snake: detecție coliziuni, extindere șarpe, generare pseudo-random a punctelor
  • Debounce software pentru butoane (prin verificarea valorii lui millis())
  • Temporizare afișare ecrane (e.g. “Game Over”, “You Win”) cu delay()
  • Mod de afișare grafică eficient folosind display.firstPage() / display.nextPage() din U8g2

Surse și funcții implementate:

Structura surselor este modulară, fiecare funcționalitate având propriul fișier:

  • main.cpp – setup general, bucla principală loop()
  • menu.cpp – logica meniului principal
  • game.cpp – logica jocului Snake
  • display.cpp – inițializarea și funcțiile de afișare
  • scores.cpp – manipularea scorurilor, salvare/încărcare de pe SD
  • settings.cpp – meniu pentru opțiuni (e.g. coliziuni ON/OFF)
  • led.cpp – efecte LED simple (e.g. flash verde când e mâncat un punct)
  • rtc.cpp – inițializare și citire oră de la modulul RTC

Funcțiile implementate sunt separate clar pe module, urmărind o arhitectură clară și reutilizabilă.

Link GitHub:

https://github.com/andreiv03/snake-game

Rezultate Obţinute

Concluzii

Proiectul “Snake Game pe Arduino” demonstrează modul în care conceptele fundamentale de interfațare hardware pot fi aplicate într-un context practic și intuitiv. Prin îmbinarea I2C, SPI, PWM și timere hardware, am reușit să dezvolt un sistem embedded interactiv, modular și extensibil, care combină logica jocului clasic Snake cu funcționalități moderne precum salvarea scorurilor, afișaj grafic și feedback vizual.

În urma realizării acestui proiect:

  • Am aprofundat lucrul cu magistralele I2C și SPI, învățând cum să integrez mai multe module pe aceleași magistrale fără conflicte.
  • Am utilizat eficient timerul hardware millis() pentru controlul timpului de joc și pentru debounce-ul butoanelor.
  • Am structurat codul pe module independente, ceea ce facilitează mentenanța și extinderea proiectului.
  • Am înțeles limitările resurselor hardware (RAM, pini, conflicte de biblioteci) și am luat decizii tehnice pentru optimizarea funcționării sistemului.

Pe viitor, proiectul poate fi extins cu:

  • Implementarea unui sistem de scoruri bazat pe nume introduse de utilizator.
  • Integrarea unui buzzer pentru feedback sonor.
  • Posibilitatea de a selecta mai multe niveluri de dificultate.
  • Migrarea către un microcontroler cu mai multă memorie pentru suport extins de funcționalități.

În concluzie, acest proiect nu este doar un joc recreativ, ci și un cadru educațional valoros pentru învățarea dezvoltării sistemelor embedded. A oferit o platformă ideală pentru consolidarea cunoștințelor teoretice prin practică, dovedindu-se util atât pentru începători, cât și pentru cei care doresc să experimenteze interacțiunea complexă dintre software și hardware.

pm/prj2025/atoader/andrei_silviu.voicu.txt · Last modified: 2025/05/28 14:04 by andrei_silviu.voicu
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