This shows you the differences between two versions of the page.
pm:prj2025:atoader:andrei_silviu.voicu [2025/05/18 11:14] andrei_silviu.voicu [Hardware Design] |
pm:prj2025:atoader:andrei_silviu.voicu [2025/05/28 14:04] (current) andrei_silviu.voicu [Software Design] |
||
---|---|---|---|
Line 8: | Line 8: | ||
===== Introducere ===== | ===== 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 progresului pe USB prin SPI. | + | * **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 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ă. | * **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ă. | ||
Line 18: | Line 18: | ||
* Game Logic & Timer ISR: actualizează poziția șarpelui, verifică coliziuni, declanșează frame-ul la interval hardware. | * 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. | * Display Driver (I2C): afișează tabla de joc, meniuri şi cronometru pe OLED. | ||
- | * Storage Manager (SPI): salvează și încarcă starea jocului (hartă, scor, timp) pe USB. | + | * Storage Manager (SPI): salvează și încarcă scorurile pe card SD. |
* Cronometru RTC/Timer: furnizează timpul curent sau tick-uri de ceas pentru joc. | * Cronometru RTC/Timer: furnizează timpul curent sau tick-uri de ceas pentru joc. | ||
- | * Indicator LED (PWM): semnalizează evenimente (mâncare, Game Over). | + | * Indicator LED (PWM): semnalizează evenimente (e.g. mâncare). |
**Schemă bloc:** | **Schemă bloc:** | ||
- | {{:pm:prj2025:atoader:schema-bloc-voicu.jpeg?300|}} | + | {{:pm:prj2025:atoader:schema-voicu.jpg?300|}} |
===== Hardware Design ===== | ===== Hardware Design ===== | ||
Line 32: | Line 31: | ||
* 4 butoane | * 4 butoane | ||
* OLED 128x64 | * OLED 128x64 | ||
- | * Modul USB | + | * Modul Card SD Reader |
* Modul RTC | * Modul RTC | ||
* LED | * LED | ||
Line 39: | Line 38: | ||
**Schematic:** | **Schematic:** | ||
- | {{:pm:prj2025:atoader:schematic-voicu.jpeg?300|}} | + | {{:pm:prj2025:atoader:schematic_voicu.jpeg?300|}} |
**Proiect asamblat:** | **Proiect asamblat:** | ||
- | {{:pm:prj2025:atoader:proiect-asamblat-voicu.jpeg?300|}} | + | {{:pm:prj2025:atoader:proiect-voicu.jpg?300|}} |
===== Software Design ===== | ===== Software Design ===== | ||
+ | **Mediu de dezvoltare:** | ||
+ | * **Platformă** – PlatformIO + VSCode pe Windows | ||
+ | * **Target** – Arduino UNO (ATmega328P) | ||
+ | * **Framework** – Arduino | ||
- | <note tip> | + | **Biblioteci și surse 3rd-party utilizate:** |
- | Descrierea codului aplicaţiei (firmware): | + | * **U8g2** – pentru controlul ecranului OLED I2C (SSD1306) |
- | * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) | + | * **SdFat** – pentru scriere/citire eficientă pe cardul SD |
- | * librării şi surse 3rd-party (e.g. Procyon AVRlib) | + | * **RTClib** – pentru utilizarea modulului RTC DS1307 |
- | * algoritmi şi structuri pe care plănuiţi să le implementaţi | + | |
- | * (etapa 3) surse şi funcţii implementate | + | |
- | </note> | + | |
- | ===== Rezultate Obţinute ===== | + | Aceste biblioteci sunt folosite pentru a controla perifericele externe și pentru a asigura o interfață abstractă și ușor de utilizat în firmware. |
- | <note tip> | + | **Algoritmi și structuri implementate:** |
- | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | * Structuri personalizate: Game, Snake, Point, ScoreEntry, Settings, pentru stocarea stării interne |
- | </note> | + | * 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 | ||
- | ===== Concluzii ===== | + | **Surse și funcții implementate:** |
- | ===== Download ===== | + | Structura surselor este modulară, fiecare funcționalitate având propriul fișier: |
- | <note warning> | + | * **main.cpp** – setup general, bucla principală loop() |
- | O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-). | + | * **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 | ||
- | 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**. | + | Funcțiile implementate sunt separate clar pe module, urmărind o arhitectură clară și reutilizabilă. |
- | </note> | + | |
+ | **Link GitHub:** | ||
+ | |||
+ | https://github.com/andreiv03/snake-game | ||
+ | ===== Rezultate Obţinute ===== | ||
+ | |||
+ | **Video demonstrativ:** | ||
+ | |||
+ | https://www.youtube.com/shorts/aLnb0Cn6LsI | ||
+ | |||
+ | ===== Concluzii ===== | ||
- | ===== Jurnal ===== | + | 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. |
- | <note tip> | + | În urma realizării acestui proiect: |
- | Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. | + | |
- | </note> | + | |
- | ===== Bibliografie/Resurse ===== | + | * 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. | ||
- | <note> | + | Pe viitor, proiectul poate fi extins cu: |
- | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. | + | |
- | </note> | + | |
- | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | + | * 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. |