This shows you the differences between two versions of the page.
pm:prj2025:aluca:mihai_catalin.stan [2025/05/09 19:00] mihai_catalin.stan [Hardware Design] |
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 }} |
Dupa cum spune si numele, scopul proiectului este de a crea un produs fizic, portabil si cu un design de moda veche, suficient de complex incat sa acopere concepte din 3 laboratoare si 3 componente mai complexe/senzori. | Dupa cum spune si numele, scopul proiectului este de a crea un produs fizic, portabil si cu un design de moda veche, suficient de complex incat sa acopere concepte din 3 laboratoare si 3 componente mai complexe/senzori. | ||
Line 18: | Line 18: | ||
- | {{pm:prj2025:aluca:schema_bloc_mihai_catalin_stan.png?=700 | Schema bloc}} | + | {{ pm:prj2025:aluca:schemabloc_stanmihaicatalin.png?=600 | Schema bloc}} |
===== Hardware Design ===== | ===== Hardware Design ===== | ||
Line 40: | Line 40: | ||
* SPI (Card SD) | * SPI (Card SD) | ||
* I2C (RTC, Giroscop & Accelerometru) | * I2C (RTC, Giroscop & Accelerometru) | ||
+ | |||
+ | {{ pm:prj2025:aluca:schematicpm_-_mihai_catalin_stan_new.png?=700 | Schematic proiect}} | ||
+ | |||
+ | ^ Nume Componenta ^ Site ^ Datasheet ^ | ||
+ | | ESP32-DEVKIT-V1 | [[https://www.optimusdigital.ro/ro/placi-cu-bluetooth/4371-placa-de-dezvoltare-esp32-cu-wifi-i-bluetooth-42.html | OptimusDigital]] | [[https://www.espressif.com/sites/default/files/documentation/esp32_datasheet_en.pdf | Datasheet ESP32]] | | ||
+ | | ST7735 cu SD card | [[https://ardushop.ro/ro/display-uri-si-led-uri/1349-modul-lcd-spi-128x160-6427854019561.html | ArduShop Display]] | [[https://www.displayfuture.com/Display/datasheet/controller/ST7735.pdf | Datasheet ST7735]] | | ||
+ | | RTC PCF8563 | [[https://ardushop.ro/ro/module/384-modul-ceas-in-timp-real-pcf8563-6427854004307.html?gad_source=1&gad_campaignid=22058879462&gclid=CjwKCAjw56DBBhAkEiwAaFsG-qEJvoICxRV-gRSRsMDZfsXCnF5_vwPYBB4ee6xBYgoC0DGtkV9CRxoCtVAQAvD_BwE | ArduShop RTC]] | [[https://www.nxp.com/docs/en/data-sheet/PCF8563.pdf | Datasheet RTC]] | | ||
+ | | Accelerometru cu Giroscop MPU6500 | [[https://ardushop.ro/ro/electronica/741-mpu6500-modul-accelerometru-si-giroscop-6427854009449.html | Ardushop MPU6500]] | [[https://datasheet.octopart.com/MPU-6500-InvenSense-datasheet-138896167.pdf | Datasheet MPU6500]] | | ||
+ | |||
+ | ^ Nume ^ Protocol ^ Port ^ | ||
+ | | ST7735 | SPI | CS - GPIO15, MOSI - GPIO23, SCK - GPIO18, RESET - GPIO4, DC - GPIO2 | | ||
+ | | CardSD | SPI | CS - GPIO5, MOSI - GPIO23, MISO - GPIO19, SCK - GPIO18 | | ||
+ | | PCF8563 | I2C | SDA - GPIO21, SCL - GPIO22 | | ||
+ | | MPU6500 | I2C | SDA - GPIO21, SCL - GPIO22 | | ||
+ | |||
+ | Observatie: Display-ul desi este pe SPI, nu foloseste MISO deoarece scopul sau nu este sa transmita datele catre controller. De asemenea, deoarece semnalul de RST trebuie tinut pe HIGH, acesta poate fi conectat intr-un update ulterior la 3V3. | ||
+ | |||
+ | Protocoalele mentionate mai sus pot fi vazute explicit pe breadboard in faza de testare a componentelor | ||
+ | |||
+ | {{pm:prj2025:aluca:cablaraie.jpg?=400}} | ||
+ | |||
+ | Urmatoarele poze prezinta conectivitatea modulului de ceas si a giroscopului, dar si functionalitatea acestora impreuna cu cea a display-ului. Am afisat pe display data si timpul primit de pe modulul de ceas dupa ce l-am setat la data si ora de pe sistem, si valorile primite de accelerometru si giroscop, inca necalibrate. | ||
+ | |||
+ | {{pm:prj2025:aluca:giroscop_rtc.jpeg?=500}} | ||
+ | |||
+ | {{pm:prj2025:aluca:display_valori.jpeg?=400}} | ||
+ | |||
+ | Nu in ultimul rand, pe pcb-ul de prototipare aranjamentul pieselor - dupa lipituri - va arata astfel: | ||
+ | |||
+ | {{ pm:prj2025:aluca:componente_pcb.jpeg?=500 }} | ||
===== 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 | ||
+ | |||
+ | Biblioteci folosite: | ||
+ | * Display - AdafruitGFX.h, Adafruit_ST7735.h, SPI.h | ||
+ | * Giroscop - MPU9250_asukiaaa.h (biblioteca custom), Wire.h (biblioteca standard pentru I2C) | ||
+ | * Modul de ceas - I2C_RTC.h | ||
+ | |||
+ | 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. | ||
- | <note tip> | + | DEMO: |
- | Descrierea codului aplicaţiei (firmware): | + | |
- | * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) | + | |
- | * 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> | + | |
+ | <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 ===== | ||