This shows you the differences between two versions of the page.
pm:prj2024:vstoica:gheorghe.grosu [2024/05/19 16:02] gheorghe.grosu [Hardware Design] |
pm:prj2024:vstoica:gheorghe.grosu [2024/05/26 18:13] (current) gheorghe.grosu [Jurnal] |
||
---|---|---|---|
Line 43: | Line 43: | ||
**Schema hardware** | **Schema hardware** | ||
- | {{:pm:prj2024:vstoica:snake_2024_bb_v3.png?600|}} | + | {{:pm:prj2024:vstoica:snake_2024_bb_v4.png?600|}} |
**Schema electrica** | **Schema electrica** | ||
- | {{:pm:prj2024:vstoica:snake_2024_schem_v3.png?600|}} | + | {{:pm:prj2024:vstoica:snake_2024_schem_v4.png?600|}} |
+ | |||
+ | {{:pm:prj2024:vstoica:img_3423.jpeg?600|}} | ||
===== Software Design ===== | ===== Software Design ===== | ||
+ | **Descrierea codului aplicaţiei (firmware)** | ||
- | <note tip> | + | 1. Mediu de dezvoltare: |
- | Descrierea codului aplicaţiei (firmware): | + | - **Platformă de dezvoltare**: Arduino IDE |
- | * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) | + | Arduino IDE este utilizat pentru scrierea, compilarea și încărcarea firmware-ului pe un microcontroller Arduino. |
- | * librării şi surse 3rd-party (e.g. Procyon AVRlib) | + | |
- | * algoritmi şi structuri pe care plănuiţi să le implementaţi | + | |
- | * (etapa 3) surse şi funcţii implementate | + | |
- | </note> | + | |
- | ===== Rezultate Obţinute ===== | + | 2. Librării şi surse 3rd-party: |
- | <note tip> | + | * **TFT Library**: `Adafruit_ST7735` |
- | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | - Această librărie este folosită pentru a controla ecranul TFT. |
- | </note> | + | * **SPI Library**: `SPI` |
+ | - SPI (Serial Peripheral Interface) este utilizat pentru comunicația cu ecranul TFT. | ||
+ | * **EEPROM Library**: `EEPROM` | ||
+ | - Această librărie permite stocarea persistentă a datelor, cum ar fi scorurile maxime. | ||
+ | * **Tone Library**: `tone()` | ||
+ | - Functia `tone()` este utilizată pentru a genera sunete pe pinul difuzorului. | ||
+ | |||
+ | 3. Algoritmi şi structuri implementate: | ||
+ | - **Structuri de date**: | ||
+ | |||
+ | **`Joystick`** | ||
+ | Structura `Joystick` se ocupă de citirea pozițiilor analogice ale joystick-ului și de calcularea direcțiilor următoare pentru deplasarea șarpelui. | ||
+ | |||
+ | **`GameState`** | ||
+ | |||
+ | Structura `GameState` gestionează stările jocului și timpul de cadru pentru fiecare stare, facilitând tranzițiile între stări și verificarea momentului potrivit pentru actualizarea jocului. | ||
+ | |||
+ | **`Snake` | ||
+ | ** | ||
+ | |||
+ | Structura `Snake` gestionează pozițiile șarpelui, lungimea sa și funcțiile pentru resetare, mișcare și creștere. De asemenea, verifică dacă șarpele a colizionat cu el însuși. | ||
+ | |||
+ | Șarpele este reprezentat prin structura `Snake`, care conține: | ||
+ | * **`length`**: lungimea șarpelui. | ||
+ | * **`positions`**: array de tip `byte` ce stochează pozițiile fiecărui segment al șarpelui. | ||
+ | |||
+ | Motive pentru această reprezentare: | ||
+ | |||
+ | 1. **Eficiență Memorie**: Folosirea `byte` ocupă doar 1 octet, economisind memorie RAM limitată pe Arduino. | ||
+ | |||
+ | 2. **Simplitate și Performanță**: Acces rapid și simplu la pozițiile șarpelui pentru operațiuni de mișcare și creștere. | ||
+ | |||
+ | 3. **Gestionare Ușoară a Lungimii**: Lungimea și pozițiile sunt ușor de manipulat pentru actualizări rapide în timpul jocului. | ||
+ | |||
+ | |||
+ | - **Algoritmi**: | ||
+ | - Controlul direcției șarpelui pe baza intrărilor de la joystick. | ||
+ | - Verificarea coliziunilor cu pereții, obstacolele și corpul șarpelui. | ||
+ | - Gestionarea creșterii șarpelui și actualizarea scorului. | ||
+ | - Generarea aleatorie a pozițiilor merelor. | ||
+ | - Stocarea și citirea scorurilor maxime din EEPROM. | ||
+ | |||
+ | Funcțiile implementate | ||
+ | |||
+ | Funcții principale: | ||
+ | |||
+ | * **setup()** | ||
+ | - Inițializează comunicarea serială. | ||
+ | - Configurează pinii pentru joystick și LED-urile RGB. | ||
+ | - Inițializează ecranul TFT. | ||
+ | - Afișează ecranul de selecție a nivelului. | ||
+ | - Inițializează starea și timpul de cadru pentru joc. | ||
+ | |||
+ | * **loop()** | ||
+ | - Verifică dacă trebuie să actualizeze starea jocului pe baza timpului de cadru. | ||
+ | - Citește direcțiile de la joystick. | ||
+ | - Execută funcțiile corespunzătoare fiecărei stări (selecție nivel, inițializare nivel, rulare nivel, game over). | ||
+ | |||
+ | **Funcții de stare:** | ||
+ | |||
+ | * **state_level_select()** | ||
+ | - Permite utilizatorului să aleagă nivelul dorit folosind joystick-ul. | ||
+ | - Afișează săgeata de selecție pe ecran. | ||
+ | - Trecerea la starea de inițializare a nivelului atunci când utilizatorul apasă butonul de selecție. | ||
+ | |||
+ | * **state_level_init()** | ||
+ | - Inițializează nivelul selectat, resetând șarpele și plasând obstacole și mere pe hartă. | ||
+ | - Trecerea la starea de rulare a nivelului. | ||
+ | |||
+ | * **state_level_running()** | ||
+ | - Actualizează poziția șarpelui pe baza direcțiilor de la joystick. | ||
+ | - Verifică coliziunile și gestionează creșterea șarpelui. | ||
+ | - Actualizează scorul și generează sunete atunci când șarpele mănâncă un măr. | ||
+ | - Trecerea la starea de game over în caz de coliziune. | ||
+ | |||
+ | * **state_game_over()** | ||
+ | - Afișează scorul final și scorul maxim pe ecran. | ||
+ | - Salvează scorul maxim în EEPROM dacă este cazul. | ||
+ | - Afișează un mesaj de finalizare a jocului. | ||
+ | |||
+ | **Funcții utilitare:** | ||
+ | |||
+ | 1. **level_select_init()** | ||
+ | * Afișează ecranul de selecție a nivelului. | ||
+ | |||
+ | 2. **renderIfDifferent(int pos, int tile)** | ||
+ | * Redă graficul corespunzător pentru un tile dacă este diferit de cel precedent. | ||
+ | |||
+ | 3. **render_grass(int pos_x, int pos_y)** | ||
+ | * Redă grafica pentru iarbă. | ||
+ | |||
+ | 4. **render_snake_head(int pos_x, int pos_y)** | ||
+ | * Redă grafica pentru capul șarpelui. | ||
+ | |||
+ | 5. **render_snake_body(int pos_x, int pos_y)** | ||
+ | * Redă grafica pentru corpul șarpelui. | ||
+ | |||
+ | 6. **render_apple(int pos_x, int pos_y)** | ||
+ | * Redă grafica pentru un măr. | ||
+ | |||
+ | 7. **render_red_apple(int pos_x, int pos_y)** | ||
+ | * Redă grafica pentru un măr roșu. | ||
+ | |||
+ | 8. **render_obstacle(int pos_x, int pos_y)** | ||
+ | * Redă grafica pentru un obstacol. | ||
+ | |||
+ | 9. **get_random_pos()** | ||
+ | * Generează o poziție aleatorie pentru plasarea unui măr pe hartă. | ||
+ | |||
+ | ===== Rezultate Obţinute ===== | ||
+ | {{:pm:prj2024:vstoica:snk3_gif.gif?250|}} {{:pm:prj2024:vstoica:snk2_gif.gif?250|}}{{:pm:prj2024:vstoica:snk_gif.gif?250|}} | ||
===== Concluzii ===== | ===== Concluzii ===== | ||
Line 73: | Line 182: | ||
<note warning> | <note warning> | ||
- | 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ă ;-). | ||
- | 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**. | + | |
+ | {{:pm:prj2024:vstoica:snake.zip|}} | ||
</note> | </note> | ||
Line 85: | Line 195: | ||
* 02/05/2024 - Crearea paginii proiectului si completarea partiala a acesteia | * 02/05/2024 - Crearea paginii proiectului si completarea partiala a acesteia | ||
* 12/05/2024 - Adaugarea schemei electrice si a schemei hardware | * 12/05/2024 - Adaugarea schemei electrice si a schemei hardware | ||
+ | * 22/05/2024 - Adaugarea software designului | ||
+ | * 24/05/2024 - Finisare proiect | ||
</note> | </note> | ||