This shows you the differences between two versions of the page.
pm:prj2025:aluca:mihai_catalin.stan [2025/05/25 00:21] mihai_catalin.stan [Introducere] |
pm:prj2025:aluca:mihai_catalin.stan [2025/05/25 22:32] (current) mihai_catalin.stan [Software Design] |
||
---|---|---|---|
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 ===== | ||