This shows you the differences between two versions of the page.
pm:prj2025:aluca:mihai_catalin.stan [2025/05/18 09:38] mihai_catalin.stan |
pm:prj2025:aluca:mihai_catalin.stan [2025/05/25 22:32] (current) mihai_catalin.stan [Software Design] |
||
---|---|---|---|
Line 8: | Line 8: | ||
===== Introducere ===== | ===== Introducere ===== | ||
- | Proiectul va consta intr-o consola de jocuri inspirata de produsul de mai jos, dar si de consola ArduBoy. Pe aceasta va rula o varianta actualizata de Tetris, cu muzica, logs, mecanica de tilting si un modul de ceas pentru surprize zilnice. | + | Proiectul va consta intr-o consola de jocuri inspirata de produsul de mai jos, dar si de consola ArduBoy. Pe aceasta va rula un joc retro clasic in stil Chicken Invaders, cu muzica, logs, mecanica de tilting si un modul de ceas pentru surprize regulate. |
{{ :pm:prj2025:aluca:retro_tetris_console.png?300 }} | {{ :pm:prj2025:aluca:retro_tetris_console.png?300 }} | ||
Line 41: | Line 41: | ||
* I2C (RTC, Giroscop & Accelerometru) | * I2C (RTC, Giroscop & Accelerometru) | ||
- | {{ pm:prj2025:aluca:schematicpm_-_mihai_catalin_stan.png | Schematic proiect}} | + | {{ pm:prj2025:aluca:schematicpm_-_mihai_catalin_stan_new.png?=700 | Schematic proiect}} |
^ Nume Componenta ^ Site ^ Datasheet ^ | ^ Nume Componenta ^ Site ^ Datasheet ^ | ||
Line 73: | Line 73: | ||
===== Software Design ===== | ===== Software Design ===== | ||
+ | Stadiu milestone software: | ||
+ | * Un joc inspirat classic, retro, inspirat dupa Chicken Invaders, a fost implementat | ||
+ | * Interactiunea utilizator-giroscop-joc a fost implementata, prin interfata I2C | ||
+ | * Interactiunea utilizator-buton-joc a fost implementata prin pini de GPIO cu intreruperi | ||
+ | * Interactiunea joc-modul de ceas a fost implementata prin I2C si intreruperi al timerului extern | ||
+ | * Interactiunea joc-display este facuta prin interfata SPI | ||
- | <note tip> | + | Biblioteci folosite: |
- | Descrierea codului aplicaţiei (firmware): | + | * Display - AdafruitGFX.h, Adafruit_ST7735.h, SPI.h |
- | * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) | + | * Giroscop - MPU9250_asukiaaa.h (biblioteca custom), Wire.h (biblioteca standard pentru I2C) |
- | * librării şi surse 3rd-party (e.g. Procyon AVRlib) | + | * Modul de ceas - I2C_RTC.h |
- | * algoritmi şi structuri pe care plănuiţi să le implementaţi | + | |
- | * (etapa 3) surse şi funcţii implementate | + | |
- | </note> | + | |
+ | Am ales sa folosesc bibliotecile de mai sus intrucat sunt foarte folosite in utilizarea componentelor pe care le-am cumparat, cu multe forum-uri deschise pentru eventualele probleme si exemple de utilizare a acestora. | ||
+ | |||
+ | Elementul de noutate al proiectului este dat de interactiunea intre joc si utilizator prin intermediul giroscopului, iar calibrarea acestuia a fost facuta prin citirea valorii analogice a giroscopului si trecerea vitezei unghiulare intr-un unghi de inclinatie in jurul axelor Oz (Roll) si Ox (Pitch). Cu toate acestea la momentul curent nu folosesc si unghiul de Pitch. | ||
+ | |||
+ | La momentul curent nu exista optimizari, dar in varianta finala doresc sa folosesc al doilea buton pentru a pune consola in deep sleep, respectiv a o trezi din deep sleep, si sa o conectez la baterii. | ||
+ | |||
+ | Utilizarea functionalitatilor din laborator a fost in special intalnit la transmiterea de date prin I2C (Wire.begin/beginTransmission/endTransmission/requestFrom), prin SPI (SPI.begin/beginTransaction/endTransaction/setClockDivider), si la utilizarea intreruperilor (setarea unei intreruperi pe un anumit GPIO cu attachInterrupt(pin, functia_isr, frontul/valorea pe care se activeaza), si scrierea de isr-uri prin atasarea antetului IRAM_ATTR). De asemenea, am folosit minimal si cunostinte din laborator si datasheet-ul RTC-ului pentru setarea unui Timer. | ||
+ | |||
+ | In cod am folosit structuri de date pentru obstacole si gloante, pentru a le contoriza starea de existenta si coordonatele. Ca functii avem doua pe care le-am trecut in memoria interna a uC-ului pentru intreruperi: fire_bullet() - pentru a trage un glont si rewards() - pentru a primit un reward in game la scurgerea timer-ului extern. Alte functii implementate de mine sunt: start_screen(), game_over_screen(), reset(), spawn_asteroids(). Functii folosite, dar neimplementate de mine sunt cele din biblioteca display-ului, pentru desenarea primitivelor geometrice, folosite pentru gloante (pixel), asteroizi (cercuri) si nava (triunghi). Logica de mutarea a navei, asteroizilor, gloantelor si de coliziune este facuta in functia loop(), pentru a nu incarca stiva cu apeluri inutile din moment ce complexitatea ciclomatica si cognitiva a codului este redusa. | ||
+ | |||
+ | DEMO: | ||
+ | |||
+ | <html> | ||
+ | <iframe width="560" height="315" | ||
+ | src="https://www.youtube.com/embed/rlgCxp-0uKw?si=nVdr1mpfgMVzz8b_" | ||
+ | title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen> | ||
+ | </iframe> | ||
+ | </html> | ||
===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||