This shows you the differences between two versions of the page.
|
pm:prj2026:bianca.popa1106:marina.simion05 [2026/05/15 10:47] marina.simion05 [Hardware Design] |
pm:prj2026:bianca.popa1106:marina.simion05 [2026/05/25 08:07] (current) marina.simion05 [Download] |
||
|---|---|---|---|
| Line 74: | Line 74: | ||
| | Display OLED 4 | I2C | Canal TCA 3 | | | Display OLED 4 | I2C | Canal TCA 3 | | ||
| | Display OLED 5 | I2C | Canal TCA 4 | | | Display OLED 5 | I2C | Canal TCA 4 | | ||
| - | | Buton 1 | Intrare digitală | D2 | | + | | Buton 1 | Intrare digitală | D30 | |
| - | | Buton 2 | Intrare digitală | D3 | | + | | Buton 2 | Intrare digitală | D31 | |
| - | | Buton 3 | Intrare digitală | D4 | | + | | Buton 3 | Intrare digitală | D32 | |
| - | | Buton 4 | Intrare digitală | D5 | | + | | Buton 4 | Intrare digitală | D33 | |
| - | | Buton 5 | Intrare digitală | D6 | | + | | Buton 5 | Intrare digitală | D34 | |
| | Potențiometru | Intrare analogică | A0 | | | Potențiometru | Intrare analogică | A0 | | ||
| - | | Comutator | Intrare digitală | D7 | | + | | Comutator | Intrare digitală | D45 | |
| - | | LED-uri RGB WS2812B | Ieșire digitală | D8 | | + | | LED-uri RGB WS2812B | Ieșire digitală | D50, D52 | |
| Line 87: | Line 87: | ||
| ===== Software Design ===== | ===== Software Design ===== | ||
| + | === Laboratoare utilizate === | ||
| - | <note tip> | + | * Laborator 0 - citirea butoanelor, debounce și logica jocului pe stări |
| - | Descrierea codului aplicaţiei (firmware): | + | * Laborator 1 - testare și debugging în timpul dezvoltării |
| - | * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) | + | * Laborator 4 - citirea potențiometrului și alegerea dificultății AI |
| - | * librării şi surse 3rd-party (e.g. Procyon AVRlib) | + | * Laborator 5 - controlul display-urilor OLED prin multiplexorul I2C |
| - | * algoritmi şi structuri pe care plănuiţi să le implementaţi | + | |
| - | * (etapa 3) surse şi funcţii implementate | + | |
| - | </note> | + | |
| - | ===== Rezultate Obţinute ===== | + | === Mediu de dezvoltare === |
| - | <note tip> | + | Mediul de dezvoltare folosit este PlatformIO, cu platforma atmelavr, placa configurată ca megaatmega2560 și framework-ul arduino. Configurația proiectului este definită în fișierul platformio.ini. |
| - | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | |
| - | </note> | + | Frecvența de lucru a plăcii este setată la: |
| + | |||
| + | ''board_build.f_cpu = 16000000L'' | ||
| + | |||
| + | Încărcarea programului pe placă se face folosind protocolul: | ||
| + | |||
| + | ''upload_protocol = wiring'' | ||
| + | |||
| + | Pentru monitorizare serială, proiectul este configurat cu viteza de **9600 baud**. | ||
| + | |||
| + | === Librării și surse 3rd-party === | ||
| + | |||
| + | Proiectul folosește biblioteci standard pentru AVR și C: | ||
| + | |||
| + | * avr/io.h pentru acces direct la registrele microcontrolerului; | ||
| + | * util/delay.h pentru temporizări; | ||
| + | * avr/interrupt.h pentru întreruperi; | ||
| + | * avr/pgmspace.h pentru stocarea imaginilor în memoria program; | ||
| + | * stdint.h, stdio.h, stdlib.h pentru tipuri de date, afișare formatată și generare pseudo-aleatoare. | ||
| + | |||
| + | În platformio.ini este declarată și dependența: | ||
| + | |||
| + | * adafruit/Adafruit NeoPixel | ||
| + | |||
| + | Aceasta este folosită pentru partea de control a **benzilor LED WS2812B**. În proiect, benzile LED sunt conectate și sunt folosite ca feedback vizual la finalul jocului, când partida se termină. | ||
| + | |||
| + | **Display-urile OLED** sunt controlate prin module proprii, implementate în fișierele display.c și display.h. Comunicarea cu acestea se face prin interfața TWI/I2C, implementată în twi.c și twi.h. Deoarece sunt folosite mai multe display-uri OLED cu aceeași adresă I2C, proiectul folosește un **multiplexor TCA9548A**, iar canalul activ este selectat prin funcția tca_select(). | ||
| + | |||
| + | === Algoritmi și structuri implementate === | ||
| + | |||
| + | Logica aplicației este implementată sub forma unei **mașini de stări finite**. Jocul trece prin mai multe stări: ecranul de start, afișarea modului de joc, alegerea dificultății pentru AI, începutul rundei, tura jucătorului 1, tura jucătorului 2 sau a AI-ului, afișarea rezultatului rundei, finalul jocului și restartarea partidei. | ||
| + | |||
| + | Structura principală folosită este **Game**, care reține informațiile necesare desfășurării jocului: starea curentă, modul de joc, dificultatea AI-ului, runda curentă, scorurile, numărul de acțiuni HIT rămase, cărțile curente și vectorul de cărți deja folosite. | ||
| + | |||
| + | Pentru extragerea cărților se folosește un **algoritm de alegere aleatoare fără repetare**. Fiecare carte extrasă este marcată într-un vector used_cards, astfel încât aceeași carte să nu fie extrasă de mai multe ori în timpul aceleiași partide. | ||
| + | |||
| + | Jocul permite **două moduri de funcționare**: Player vs Player și Player vs AI. În modul cu AI, dificultatea poate fi aleasă prin citirea unei valori analogice. Sunt implementate trei niveluri de dificultate: Easy, Medium și Hard. La nivelul Easy, AI-ul ia decizii simple pe baza propriei cărți. La nivelul Medium, ia în considerare și cartea jucătorului. La nivelul Hard, analizează cărțile rămase și estimează probabilitatea de a obține o carte mai bună. | ||
| + | |||
| + | === Surse și funcții implementate === | ||
| + | |||
| + | Fișierul ''**main.c**'' reprezintă punctul de intrare în aplicație. Acesta inițializează comunicația TWI/I2C, intrările, ADC-ul și interfața grafică, apoi pornește logica jocului prin apelul funcției game_run(). | ||
| + | |||
| + | Fișierul ''**game.c**'' conține logica principală a jocului. Aici sunt definite stările jocului, structura Game, funcțiile pentru inițializarea datelor, extragerea cărților, gestionarea tururilor, calcularea câștigătorului unei runde, actualizarea scorului și comportamentul AI-ului. | ||
| + | |||
| + | Fișierul ''**game_ui.c**'' gestionează interfața cu utilizatorul pe cele cinci display-uri OLED. Sunt implementate funcții pentru afișarea ecranului de start, a modului de joc, a dificultății, a cărților, a scorului, a mesajelor pentru jucători și a rezultatului final. | ||
| + | |||
| + | Fișierul ''**display.c**'' implementează funcțiile de bază pentru display-ul OLED: inițializare, ștergere ecran, setarea cursorului, afișarea textului și desenarea bitmap-urilor 128x64. Pentru afișarea textului este folosit un font 5x7 definit în memoria program. | ||
| + | |||
| + | Fișierul ''**cards.c**'' conține imaginile tuturor celor 52 de cărți de joc. Acestea sunt memorate ca bitmap-uri în PROGMEM, pentru a economisi memoria RAM a microcontrolerului. | ||
| + | |||
| + | Fișierul ''**input.c**'' gestionează butoanele și citirile analogice. Butoanele sunt configurate ca intrări cu rezistențe interne de pull-up, iar funcția button_pressed() implementează o metodă simplă de debounce. Există funcții separate pentru confirmare, HIT și STAND pentru fiecare jucător. | ||
| + | |||
| + | Fișierul ''**adc.c**'' configurează convertorul analog-digital al microcontrolerului. Funcția adc_init() setează referința ADC și prescaler-ul, iar funcția myAnalogRead() citește valoarea analogică de pe canalul selectat. | ||
| + | |||
| + | Fișierul ''**twi.c**'' implementează comunicația TWI/I2C. Sunt definite funcții pentru inițializarea magistralei, trimiterea condițiilor START și STOP, scrierea și citirea datelor, scanarea dispozitivelor I2C și selectarea canalului activ al multiplexorului TCA9548A. | ||
| + | |||
| + | Fișierul ''**uptime.c**'' implementează un contor de timp în milisecunde folosind Timer2 în modul CTC. Acesta poate fi folosit pentru temporizări și măsurarea timpului de funcționare al aplicației. | ||
| + | |||
| + | Fișierul ''**usart.c**'' conține funcții auxiliare pentru comunicarea serială prin USART0, utile pentru testare și debugging. | ||
| + | |||
| + | Fișierul ''**test.c**'' conține cod auxiliar pentru testarea benzilor LED WS2812B și a switch-ului. În varianta finală a proiectului, aceste elemente sunt conectate la sistem și sunt folosite pentru feedback vizual, în special la terminarea jocului. | ||
| + | |||
| + | În concluzie, firmware-ul este organizat pe module independente, ceea ce face codul mai ușor de urmărit, testat și extins. Separarea logicii jocului de interfața grafică și de partea hardware permite modificarea sau adăugarea unor funcționalități fără rescrierea întregii aplicații. | ||
| + | `===== Rezultate Obţinute ===== | ||
| + | |||
| + | În urma implementării, proiectul a ajuns într-o stare funcțională, în care jocul poate fi rulat complet pe microcontroler, cu interacțiune prin butoane și afișare pe display-urile OLED. | ||
| + | |||
| + | Au fost obținute următoarele rezultate: | ||
| + | |||
| + | * jocul pornește corect și afișează ecranul de început; | ||
| + | * rundele se desfășoară succesiv, cu actualizarea scorului după fiecare rundă; | ||
| + | * fiecare jucător poate alege acțiunile disponibile folosind butoanele dedicate; | ||
| + | * cărțile sunt generate aleator și sunt afișate grafic pe display-uri; | ||
| + | * sistemul evită reutilizarea aceleiași cărți în cadrul unei partide; | ||
| + | * cele cinci display-uri OLED funcționează simultan prin intermediul multiplexorului I2C; | ||
| + | * mesajele afișate sunt diferite în funcție de etapa jocului și de jucătorul activ; | ||
| + | * modul Player vs Player este funcțional; | ||
| + | * modul Player vs AI este implementat, cu niveluri diferite de dificultate; | ||
| + | * switch-ul este conectat pentru selectarea modului de joc; | ||
| + | * benzile LED sunt conectate și se aprind la finalul jocului; | ||
| + | * sistemul rulează stabil alimentat la 5V, fără blocări în timpul unei partide normale. | ||
| + | |||
| + | Un rezultat important este faptul că proiectul nu rămâne doar o simulare software, ci funcționează ca un joc fizic complet, cu input real, afișare separată pentru mai multe zone ale jocului și feedback vizual la final. Astfel, obiectivul principal al proiectului a fost atins: realizarea unui sistem embedded interactiv, bazat pe o logică de joc implementată direct pe microcontroler. | ||
| ===== Concluzii ===== | ===== Concluzii ===== | ||
| + | Proiectul a reprezentat o experiență practică utilă, deoarece a combinat partea de programare embedded cu integrarea efectivă a mai multor componente hardware. Pe lângă implementarea logicii jocului, a fost necesară conectarea și testarea display-urilor OLED, a butoanelor, a switch-ului, a multiplexorului I2C și a benzilor LED. | ||
| + | |||
| + | O parte interesantă a proiectului a fost și realizarea structurii fizice. A fost destul de amuzant, dar și migălos, să adaptez cutii pentru carcasă, să tai spațiile necesare pentru componente și să lipesc firele astfel încât totul să fie cât mai stabil și ușor de folosit. | ||
| + | |||
| + | Din punct de vedere tehnic, proiectul a evidențiat câteva aspecte importante: | ||
| + | |||
| + | === Organizarea codului === | ||
| + | |||
| + | Codul a fost împărțit în module separate pentru logica jocului, interfața grafică, citirea intrărilor, comunicația I2C/TWI, ADC și resursele grafice. Această structură a făcut aplicația mai ușor de urmărit și de modificat. | ||
| + | |||
| + | === Gestionarea memoriei === | ||
| + | Imaginile cărților au fost stocate în memoria program folosind PROGMEM, pentru a reduce consumul de RAM. Acest lucru este important în proiectele embedded, unde memoria disponibilă este limitată. | ||
| + | |||
| + | === Comunicarea cu display-urile OLED === | ||
| + | Pentru folosirea mai multor display-uri OLED cu aceeași adresă I2C, a fost necesară integrarea multiplexorului TCA9548A. Astfel, fiecare display poate fi selectat separat și poate afișa informații diferite. | ||
| + | |||
| + | === Logica jocului === | ||
| + | Fluxul aplicației este organizat ca o mașină de stări finite, ceea ce permite separarea clară a etapelor jocului: start, rundă, turele jucătorilor, rezultat și final. | ||
| + | |||
| + | |||
| + | ===== ===== | ||
| + | Ca îmbunătățiri viitoare, proiectul ar putea fi montat într-o carcasă mai solidă, eventual realizată prin imprimare 3D sau pe o placă PCB dedicată. De asemenea, se pot adăuga animații pe display-uri, efecte LED mai complexe și o integrare mai avansată a modului Player vs AI. | ||
| ===== Download ===== | ===== Download ===== | ||
| - | <note warning> | + | == Github Repo == |
| - | 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**. | + | [[https://github.com/marinaa13/War_Strategy_Game]] |
| - | </note> | + | |
| + | == Demo proiect == | ||
| + | |||
| + | [[https://youtube.com/shorts/xQ2b3eQk9FA?is=A0yvwEU_AsSVsj_M]] | ||
| ===== Jurnal ===== | ===== Jurnal ===== | ||
| - | <note tip> | + | 15.04 – Au ajuns toate componentele comandate. |
| - | Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. | + | |
| - | </note> | + | 24.04 – Am început testarea display-urilor OLED și a comunicației I2C, precum și afișarea cărților de joc pe display-uri. |
| + | |||
| + | 8.05 – Am completat secțiunea de Hardware a documentației. | ||
| + | |||
| + | 9.05 – Am conectat, folosind breadboard-uri, butoanele, display-urile și potențiometrul. | ||
| + | |||
| + | 15.05 – Am completat secțiunea de Software a documentației. | ||
| + | |||
| + | 16.05 – Am decupat și asamblat cutia pentru structura finală a proiectului. | ||
| + | |||
| + | 18.05 – Am lipit componentele finale ale proiectului: benzile LED și comutatorul. | ||
| + | |||
| + | 21.05 – Am terminat de decorat și pregătit proiectul, aducându-l în forma lui finală. | ||
| ===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
| - | <note> | + | == Resurse Hardware == |
| - | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. | + | [[https://ww1.microchip.com/downloads/en/devicedoc/atmel-2549-8-bit-avr-microcontroller-atmega640-1280-1281-2560-2561_datasheet.pdf?utm_source=chatgpt.com | Microchip ATmega2560 Datasheet]] |
| - | </note> | + | |
| + | [[https://www.ti.com/lit/ds/symlink/tca9548a.pdf?utm_source=chatgpt.com | TCA9548A Datasheet – I2C Multiplexer]] | ||
| + | |||
| + | [[https://cdn-shop.adafruit.com/datasheets/WS2812B.pdf?utm_source=chatgpt.com | WS2812B Datasheet]] | ||
| + | |||
| + | [[https://cdn-shop.adafruit.com/datasheets/SSD1306.pdf?utm_source=chatgpt.com | SSD1306 OLED Controller Datasheet]] | ||
| + | |||
| + | == Resurse Software == | ||
| + | |||
| + | [[https://javl.github.io/image2cpp/?utm_source=chatgpt.com | Image to byte array converter]] | ||
| + | |||
| + | [[https://adafruit.github.io/Adafruit_NeoPixel/html/index.html?utm_source=chatgpt.com | Adafruit NeoPixel Library Documentation]] | ||
| + | |||
| + | |||
| + | [[https://www.nongnu.org/avr-libc/user-manual/pgmspace.html?utm_source=chatgpt.com | AVR-LibC Documentation]] | ||
| + | |||
| + | ===== ====== | ||
| <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> | ||