This shows you the differences between two versions of the page.
|
pm:prj2026:ciprian.popescu0411:ionut.nicolae2009 [2026/05/16 16:42] ionut.nicolae2009 [Hardware Design] |
pm:prj2026:ciprian.popescu0411:ionut.nicolae2009 [2026/05/22 16:22] (current) ionut.nicolae2009 [Rezultate Obţinute] |
||
|---|---|---|---|
| Line 12: | Line 12: | ||
| Scopul proiectului este unul pur recreational, realizat pentru amuzamentul utilizatorului. | Scopul proiectului este unul pur recreational, realizat pentru amuzamentul utilizatorului. | ||
| ===== Descriere generală ===== | ===== Descriere generală ===== | ||
| - | {{ :pm:prj2026:ciprian.popescu0411:ionut.nicolae2009:block_diagram.png |}} | + | {{ :pm:prj2026:ciprian.popescu0411:ionut.nicolae2009:block_diagram2.png |}} |
| Pentru acest proiect, jocul are 4 multimi a cate 7 elemente fiecare. Voi utiliza 4 butoane, unul pentru fiecare heap, si un buton care sa marcheze confirmarea actiunii si trecerea la jucatorul urmator. Fiind doar un joc pe display, nu sunt necesare multe module pentru a asigura buna functionare a acestuia, importanta consta in inregistrarea inputului jucatorului si afisarea pe ecran a actiunii. | Pentru acest proiect, jocul are 4 multimi a cate 7 elemente fiecare. Voi utiliza 4 butoane, unul pentru fiecare heap, si un buton care sa marcheze confirmarea actiunii si trecerea la jucatorul urmator. Fiind doar un joc pe display, nu sunt necesare multe module pentru a asigura buna functionare a acestuia, importanta consta in inregistrarea inputului jucatorului si afisarea pe ecran a actiunii. | ||
| Line 24: | Line 24: | ||
| * breadboard | * breadboard | ||
| * level shifter bidirectional 3V3 <-> 5V | * level shifter bidirectional 3V3 <-> 5V | ||
| + | |||
| + | **Pini utilizati**: | ||
| + | ^ Pin ^ Rol ^ Componenta ^ | ||
| + | | PB7 | GPIO | Buton master | | ||
| + | | PD2 | GPIO | Buton heap 1 | | ||
| + | | PD3 | GPIO | Buton heap 2 | | ||
| + | | PD4 | GPIO | Buton heap 3 | | ||
| + | | PD5 | GPIO | Buton heap 4 | | ||
| + | | PB2 | SPI | CS | | ||
| + | | PD7 | GPIO | Reset | | ||
| + | | PD6 | GPIO | DC | | ||
| + | | PB3 | SPI | SDA | | ||
| + | | PB5 | SPI | SCK | | ||
| + | | GND | Ground | | | ||
| + | | GND | Ground | | | ||
| + | | 5V | Power | | | ||
| + | | 3V3 | Power | | | ||
| + | |||
| {{ :pm:prj2026:ciprian.popescu0411:ionut.nicolae2009:hardware.jpeg?800 |}} | {{ :pm:prj2026:ciprian.popescu0411:ionut.nicolae2009:hardware.jpeg?800 |}} | ||
| Line 31: | Line 49: | ||
| Proiectul va fi dezvoltat cu ajutorul **PlatformIO** care este integrat in MS Visual Studio Code, folosind avr-gcc.\\ | Proiectul va fi dezvoltat cu ajutorul **PlatformIO** care este integrat in MS Visual Studio Code, folosind avr-gcc.\\ | ||
| Modulele software ale proiectului sunt: | Modulele software ale proiectului sunt: | ||
| - | * Modulul pentru timere: utilizat in principal pentru debouncing-ul butoanelor | + | * Modulul pentru timere: utilizat pentru a numara milisecundele trecute de la pornire |
| * Modulul pentru logica jocului: va avea logica botului si tratarea inputului jucatorului. De asemenea, verifica regulile jocului la fiecare mutare | * Modulul pentru logica jocului: va avea logica botului si tratarea inputului jucatorului. De asemenea, verifica regulile jocului la fiecare mutare | ||
| * Modulul SPI: esential, permite comunicarea cu display-ul. Este modulul principal al proiectului | * Modulul SPI: esential, permite comunicarea cu display-ul. Este modulul principal al proiectului | ||
| - | * Modulul pentru intreruperi: utilizat pentru setarea flag-urilor | + | * Modulul pentru intreruperi: utilizat pentru setarea flag-urilor privind apasatul butoanelor |
| + | * Modulul de USART, folosit doar pentru debugging. | ||
| - | Functionalitati principale pentru logica jocului: | + | Functia main are rolul de initializare a modulelor si rularea unui loop infinit care sa inglobeze toate rundele care sunt jucate. Asta inseamna ca exista un loop care numara rundele castigate sau pierdute, fara a se ocupa de logica jocului. in acest loop exista game loop-ul propriu zis, care verifica constant starea jocului si determina castigatorul.\\ |
| - | * void reset_game() | + | \\ |
| - | * void machine_move() | + | Logica jocului este urmatoarea: |
| - | * void player_move() | + | - cpu-ul mereu face prima miscare. Acesta este singurul mod in care jucatorul are un set de miscari cu care poate castiga |
| - | * void print_game() | + | - se verifica daca au mai ramas obiecte de luat |
| + | - jucatorului ii este permisa mutarea | ||
| + | - se verifica daca au mai ramas obiecte de luat sau daca a expirat timpul | ||
| + | - se reia de la primul punct | ||
| - | Functionalitati principale pentru LCD: | + | Jocul este reprezentat in cod de un struct care contine numarul total obiecte si numarul de obiecte din fiecare heap.\\ |
| - | * void lcd_init() | + | \\ |
| - | * void lcd_clear() | + | |
| - | * void lcd_put_pixel() | + | |
| - | * void lcd_fill_rect() | + | |
| - | In loop-ul principal, pentru jucator se verifica daca unul dintre flag-urile pentru input au fost setate. Daca da, atunci se verifica daca este apasat un buton valid, iar apoi se asteapta apasarea butonului pentru confirmarea actiunii. Pentru bot, un simplu apel de functie este de ajuns pentru modificarea datelor interne ale jocului. | + | LCD-ul este modul prin care jocul comunica informatie jucatorului. Exista trei ecrane principale: cel de start joc, jocul propriu zis, si ecranul de win/lose, alaturi de numarul de runde castigate/pierdute. Dintre acestea, cel mai complex este ecranul in timpul jocului, deoarece sunt randate multimile, numarul lor, timer-ul jucatorului si mesajul de play/wait. Pentru ca nu sunt modificate parti ale ecranului foarte des, nu exista un framebuffer care este trimis LCD-ul la fiecare frame, ci portiuni sunt updatate direct. Functiile principale sunt |
| + | * render_win() | ||
| + | * render_lost() | ||
| + | * draw_heap() | ||
| + | * draw_turn_mark() | ||
| + | * render_time() | ||
| + | |||
| + | Toate aceste functii fac apel la bibliotecile pentru SPI Adafruit GFX library si Adafruit ST7735 and ST7789 library\\ | ||
| + | \\ | ||
| + | |||
| + | Intreruperile sunt in principal folosite pentru debouncing-ul butoanelor. Acestea se impart in doua categorii: butoanele pentru heap-uri si butonul principal. Fiecare din aceste categorii au routine diferite si registre de flaguri diferite. Pentru butonul principal este reprezentat de 2 valori boolene, iar restul butoanelor sunt reprezentate toate pe 2 bytes. Starile lor sunt citite si modificate cu ajutorul unor masti. | ||
| ===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
| - | + | Aici este un scurt demo al proiectului: {{:pm:prj2026:ciprian.popescu0411:ionut.nicolae2009:demo_proiect.zip|}} | |
| - | <note tip> | + | |
| - | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | |
| - | </note> | + | |
| ===== Concluzii ===== | ===== Concluzii ===== | ||
| + | Pentru partea de hardware, singurul neajuns a fost necesitatea level shifter-ului pentru trecerea de la 5V (pinii mcu) si 3V3 (pinii LCD), desi rezolvarea acesteia nu a prezentat o problema.\\ | ||
| + | \\ | ||
| + | Pentru software, partea cea mai voluminoasa a proiectului, comunicarea SPI, este rezolvata de bibiliotecile Adafruit. De asemenea, codul pentru miscarea cpu-ului a necesitat putin mai multa atentie pentru a ma asigura ca sunt acoperite toate cazurile de exceptie, reusind astfel sa il fac destul de greu de invins.\\ | ||
| + | \\ | ||
| + | Pentru viitor, imi doresc sa imi fac propriile fire de conexiune pentru un aspect ingrijit, iar pe partea de software as vrea sa adaug mai multe nivele de dificultate jocului, prin adaugarea unor "greseli" cu o anumita probabilitate.\\ | ||
| + | \\ | ||
| + | Sunt multumit ca am reusit sa fac un proiect hardware si software de la 0 cu ajutorul cunostiintelor dobandite in cadrul cursului si laboratorului de PM. | ||
| ===== Download ===== | ===== Download ===== | ||
| - | + | {{:pm:prj2026:ciprian.popescu0411:ionut.nicolae2009:nimlcd.zip|}}\\ | |
| - | <note warning> | + | https://github.com/GionutN/ATmega328P-Nim |
| - | 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**. | + | |
| - | </note> | + | |
| ===== Jurnal ===== | ===== Jurnal ===== | ||
| - | * 5/4/2026 Initializarea paginii proiectului, completare "Introducere" si "Descriere generela" | + | * 05/04/2026 Initializarea paginii proiectului, completare "Introducere" si "Descriere generela" |
| - | * 5/6/2026 Adaugare diagrame block si schita electrica | + | * 05/06/2026 Adaugare diagrame block si schita electrica |
| + | * 05/16/2026 Finalizare hardware | ||
| + | * 05/22/2026 Finalizare software | ||
| ===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
| Line 78: | Line 107: | ||
| **Resurse software**\\ | **Resurse software**\\ | ||
| - | Pentru realizarea diagramei bloc am utilizat PlantUML. | + | * Pentru realizarea diagramei bloc am utilizat PlantUML. |
| + | * Adafruit GFX library - https://github.com/adafruit/Adafruit-GFX-Library | ||
| + | * Adafruit ST7735 and ST7789 library - https://github.com/adafruit/Adafruit-ST7735-Library | ||
| <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | ||