This shows you the differences between two versions of the page.
|
pm:prj2026:alexandru.jipa2803:eusebiu.burtescu [2026/05/23 17:17] eusebiu.burtescu [Introducere] |
pm:prj2026:alexandru.jipa2803:eusebiu.burtescu [2026/05/25 07:58] (current) eusebiu.burtescu [Download] |
||
|---|---|---|---|
| Line 5: | Line 5: | ||
| ===== Descriere generală ===== | ===== Descriere generală ===== | ||
| - | {{ :pm:prj2026:alexandru.jipa2803:bloctictactoe252.png |}} | + | {{:pm:prj2026:alexandru.jipa2803:tictactoe_schema_bloc.png?300|}} |
| Componentele principale pe care le utilizez în proiect sunt: | Componentele principale pe care le utilizez în proiect sunt: | ||
| Line 11: | Line 11: | ||
| **Microcontroler ATmega328P (Xplained Mini)** | **Microcontroler ATmega328P (Xplained Mini)** | ||
| - | Este unitatea centrală de procesare a consolei, responsabilă pentru rularea logicii jocului și coordonarea tuturor perifericelor. Acesta citește semnalele de la matricea de butoane, procesează mutările jucătorilor și transmite datele vizuale către ecranul TFT prin protocolul SPI, precum și semnalele audio către buzzer. Placa permite programarea facilă prin interfața Micro-USB și oferă stabilitatea necesară pentru gestionarea unei interfețe grafice color. | + | Este unitatea centrala de procesare a consolei, responsabila pentru rularea logicii jocului și coordonarea tuturor perifericelor. Acesta citește semnalele de la butoane, procesează mutarile jucatorilor si transmite datele vizuale către ecranul TFT prin protocolul SPI, precum și semnalele audio catre buzzer. |
| - | **Display TFT LCD 1.44 inch (Color)** | + | **Display TFT LCD 1.44 inch** |
| - | Am utilizat un afișaj TFT color cu rezoluție de 128x128 pixeli pentru a oferi o interfață grafică modernă jocului TicTacToe++. Acesta comunică cu microcontrolerul prin protocolul SPI (Serial Peripheral Interface), oferind o viteză de refresh superioară. Ecranul este compatibil cu logica de 5V și afișează grila de joc, simbolurile "X" și "0" în culori diferite, cursorul de selecție și animații pentru mesajele de victorie sau remiză. | + | Am utilizat un ecran TFT color cu rezoluție de 128x128 pixeli pentru a oferi o interfata grafica moderna jocului TicTacToe++. Acesta comunica cu microcontrolerul prin protocolul SPI. Ecranul este compatibil cu logica de 5V și afișează grila de joc, simbolurile "X" si "0" în culori diferite, cursorul de selecție si animații pentru mesajele de victorie sau remiză. |
| **Butoane Push-Button (Input Control)** | **Butoane Push-Button (Input Control)** | ||
| Sistemul utilizează un set de 6 butoane tactile configurate pentru un control optim: patru butoane așezate în format "D-Pad" pentru navigarea pe grilă (sus, jos, stânga, dreapta), un buton pentru confirmarea mutării (Select) și un buton pentru funcții suplimentare (Reset). Fiecare buton este configurat folosind rezistențele interne de tip pull-up ale microcontrolerului pentru a asigura citiri digitale stabile și pentru a simplifica circuitul electronic. | Sistemul utilizează un set de 6 butoane tactile configurate pentru un control optim: patru butoane așezate în format "D-Pad" pentru navigarea pe grilă (sus, jos, stânga, dreapta), un buton pentru confirmarea mutării (Select) și un buton pentru funcții suplimentare (Reset). Fiecare buton este configurat folosind rezistențele interne de tip pull-up ale microcontrolerului pentru a asigura citiri digitale stabile și pentru a simplifica circuitul electronic. | ||
| - | |||
| - | **LED-uri de Semnalizare (5mm)** | ||
| - | |||
| - | Am integrat un set de LED-uri de 5mm (roșii și verzi) pentru a oferi feedback vizual suplimentar în afara ecranului. Acestea sunt utilizate pentru a indica rândul jucătorului curent sau pentru a semnaliza starea de "Game Over". Fiecare LED este conectat în serie cu o rezistență de 220$\Omega$ pentru a limita curentul și a proteja pinii microcontrolerului. | ||
| **Buzzer Pasiv** | **Buzzer Pasiv** | ||
| - | Modulul buzzer pasiv este utilizat pentru a oferi feedback audio în timp real, îmbunătățind experiența de utilizare. Acesta permite generarea de frecvențe variabile, oferind posibilitatea de a programa sunete distincte pentru navigare, avertizări în cazul mutărilor incorecte și melodii de tip "8-bit" pentru finalul jocului, procesate prin semnale PWM. | + | Modulul buzzer pasiv este utilizat pentru a oferi feedback audio în timp real, imbunatatind experiența de utilizare. |
| - | **Suport de baterii (6xAA - 9V)** | + | **Suport de baterii (3xAA)** |
| - | Asigură alimentarea autonomă a consolei la o tensiune nominală de 9V, utilizând două suporturi de baterii conectate în serie. Această tensiune superioară este necesară pentru a menține luminozitatea constantă a ecranului TFT și pentru a asigura un curent stabil prin pinul VIN al plăcii de dezvoltare, oferind portabilitate și performanță sistemului pe durata utilizării. | + | Asigura alimentarea autonoma a consolei. Doar 3 baterii de aproximativ 1,6 V fiind suficiente. |
| ===== Hardware Design ===== | ===== Hardware Design ===== | ||
| - | {{:pm:prj2026:alexandru.jipa2803:schematicatictactoe.png?300|}} | ||
| - | Sistemul de afișare (Ecranul TFT) este conectat direct la magistrala SPI Hardware a microcontrolerului ATmega328P. Pinii SDA (Pin 11) și SCK (Pin 13) asigură o viteză maximă de transfer a datelor grafice către ecran. Pentru controlul stării, pinii CS (Pin 10), RESET (Pin 9) și A0/DC (Pin 8) gestionează activarea perifericului, inițializarea hardware și sortarea fluxului de date între comenzi și pixeli. Iluminarea de fundal (LED) și alimentarea logică (VCC) sunt legate la linia de 5V pentru stabilitate și luminozitate maximă. | + | {{:pm:prj2026:alexandru.jipa2803:schematicalast_tictactoe.png?300|}} |
| - | Interfața de control (Butoanele) este împărțită în două blocuri funcționale și folosește exclusiv configurația INPUT_PULLUP. Prin această metodă, pinii procesorului folosesc rezistențele interne de pull-up, iar butoanele doar închid circuitul către GND (masă). Acest lucru elimină rezistențele externe și riscul de scurtcircuit. | + | ^ Pin Arduino ^ Port Hardware (Mcu) ^ Componenta Periferica ^ Rol / Functie in Joc ^ |
| + | | **D3** | PD3 | Buton **SELECT** | Confirma selectia in meniu si pune piesa pe tabla | | ||
| + | | **D4** | PD4 | Buton **W** (Sus) | Navigare in sus pe grila / Schimba dimensiunea in meniu | | ||
| + | | **D5** | PD5 | Buton **S** (Jos) | Navigare in jos pe grila / Schimba dimensiunea in meniu | | ||
| + | | **D6** | PD6 | Buton **A** (Stanga) | Navigare la stanga pe grila de joc | | ||
| + | | **D7** | PD7 | Buton **D** (Dreapta) | Navigare la dreapta pe grila de joc | | ||
| + | | **D8** | PB0 | Ecran TFT **DC** (Data/Command) | Spune ecranului daca primeste pixeli sau comenzi | | ||
| + | | **D9** | PB1 | Ecran TFT **RST** (Reset) | Reseteaza ecranul la pornirea sistemului | | ||
| + | | **D10** | PB2 | Ecran TFT **CS** (Chip Select) | Activeaza/dezactiveaza comunicarea SPI cu ecranul | | ||
| + | | **D11** | PB3 (MOSI) | Ecran TFT **SDA** / **MOSI** | Linia principala de date prin care trimitem grafica | | ||
| + | | **D13** | PB5 (SCK) | Ecran TFT **SCL** / **SCK** | Semnalul de ceas (Clock) pentru sincronizarea SPI | | ||
| + | | **A5** | PC5 | **Buzzer Pasiv** | Generare audio low-level pentru efecte si alerte | | ||
| + | | **5V / VCC** | VCC | Ecran TFT **VCC** | Alimentarea cu energie a ecranului (Unde e conectat si suportul de baterii)| | ||
| + | | **GND** | GND | Ecran / Buzzer / Butoane | Masa comuna a intregului circuit electric | | ||
| - | Blocul de navigare (WASD) folosește pinii digitali directi PD4 (W), PD5 (S), PD6 (A) și PD7 (D) pentru preluarea rapidă a direcțiilor. | + | {{:pm:prj2026:alexandru.jipa2803:pozatictactoe.jpg?300|}} |
| + | ===== Software Design ===== | ||
| - | Blocul de sistem (Start și Select) este mapat pe pinii PD2 și PD3. Acești pini au fost aleși strategic deoarece sunt singurii care suportă întreruperi hardware externe (INT0 și INT1), permițând oprirea instantanee a codului sau trezirea plăcii din modurile de economisire a energiei. | + | ==== Mediu de dezvoltare, librarii si surse ==== |
| + | Proiectul este scris in **PlatformIO (in VS Code)** cu compilerul standard *avr-gcc*. Singura librarie din exterior pe care am folosit-o este **Adafruit_ST7735** (impreuna cu *Adafruit_GFX*), strict pentru a desena pe ecran. | ||
| - | Sistemul audio (Buzzerul) este conectat la pinul PC5. Pentru a proteja poarta logică a microcontrolerului, semnalul trece printr-o rezistență de limitare de 220Ω, care menține curentul absorbit sub pragul critic de 20mA în timpul generării bipurilor de feedback. | + | Restul functiilor (partea de SPI, citirea butoanelor, debouncing-ul, sunetele si timpii) sunt facute de noi de la zero, **fara librarii**, umbland direct in registrii de pe ATmega328P. |
| - | Alimentarea portabilă este realizată prin legarea în serie a două celule de baterie (BT1 și BT2). Polul pozitiv este conectat la pinul VIN, trimițând tensiunea brută direct în regulatorul intern al plăcii Xplained Mini. Acesta o coboară și o filtrează la un nivel fix de 5V, protejând componentele sensibile și asigurând independența proiectului față de cablul USB al calculatorului. | + | ==== Algoritmi si structuri de date ==== |
| - | {{:pm:prj2026:alexandru.jipa2803:pozatictactoe.jpg?300|}} | + | === 1. Masina de stari (State Machine) === |
| + | Codul se bazeaza pe o masina de stari simpla (folosind un ''enum StareJoc''): | ||
| + | * ''MENIU'': Ecranul de start unde alegem dimensiunea tablei ($3\times3$, $4\times4$, $5\times5$). | ||
| + | * ''IN_JOC'': Jocul propriu-zis, unde miscam cursorul, punem piese si scade timpul. | ||
| + | * ''GAME_OVER'': Afiseaza cine a castigat si asteapta sa apasam pe butonul de reset. | ||
| + | === 2. Reprezentarea tablei si Verificarea Castigului === | ||
| + | Tabla este salvata intr-o matrice de intregi ''int tabla[5][5]''. Logica este asa: ''0'' pentru patratel gol, ''1'' pentru Jucatorul X (Albastru) si ''2'' pentru Jucatorul O (Portocaliu). Pentru a vedea daca a castigat cineva, parcurgem matricea pe linii, coloane si diagonale cu o „fereastra” (Sliding Window) de 3 elemente vecine. Daca gasim 3 piese la fel, jocul se opreste. | ||
| - | ===== Software Design ===== | + | === 3. Periferice si Temporizare Hardware === |
| + | * **SPI Hardware Manual:** Ca sa mearga ecranul foarte rapid, am configurat manual modulul SPI din procesor. Setați din registrul ''DDRB'' pinii de MOSI (PB3), SCK (PB5) si CS (PB2) ca iesiri. Dupa, am pornit SPI-ul din registrul ''SPCR'' pe mod Master si am activat viteza maxima de 8MHz din registrul ''SPSR'' (folosind bitul ''SPI2X''). Asa ecranul se deseneaza instant. | ||
| + | * **Sistemul cu doua timere (Timer0 si Timer2):** Ca sa nu folosim functii blocante gen delay() care pun tot codul pe pauza, am impartit treaba pe doua timere interne: | ||
| + | * **Timer2 (Bara de timp):** L-am pus in mod Normal cu prescaler de 64. Ii dam valoarea ''TCNT2 = 6'' in functia de intrerupere ''ISR(TIMER2_OVF_vect)'' si asa primim o intrerupere fixa la fiecare 1 milisecunda. O folosim ca sa scadem timpul din tura (limita de 10 secunde). | ||
| + | * **Timer0 (Delay-uri pentru sunet si butoane):** Este pus tot pe prescaler de 64 (un pas inseamna 4 microsecunde). Citim direct registrii ''TCNT0'' si ''TIFR0'' (prin metoda de *polling* / verificare continua) ca sa facem pauze exacte pentru frecventele de la buzzer si debouncing. | ||
| + | ==== Surse si functii implementate ==== | ||
| - | <note tip> | + | === Control Hardware Low-Level & Audio === |
| - | Descrierea codului aplicaţiei (firmware): | + | * ''void initSPIHardware()'': Seteaza pinii de pe portul B si porneste modulul SPI din procesor. |
| - | * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) | + | * ''void initTimer0Delay()'': Porneste Timer0 ca sa il avem gata pentru functiile de delay. |
| - | * librării şi surse 3rd-party (e.g. Procyon AVRlib) | + | * ''void asteaptaMicrosecunde(unsigned int us)'' / ''void asteaptaMilsecunde(unsigned int ms)'': Functiile noastre de delay care asteapta dupa timerul hardware (se uita in registrul ''TCNT0'' si asteapta flag-ul ''TOV0''). |
| - | * algoritmi şi structuri pe care plănuiţi să le implementaţi | + | * ''void pulsHardware(int frecventaMicros, int durataMs)'': Misca rapid pinul PC5 (unde avem buzzerul) modificand registrul ''PORTC'' ca sa scoata sunete pe diferite frecvente. |
| - | * (etapa 3) surse şi funcţii implementate | + | * ''uint8_t citesteButoaneCuDebounce()'': Citeste pinii din registrul ''PIND'', asteapta 5ms si verifica din nou cu un XOR ca sa fie sigur ca apasarea e stabila si nu e doar zgomot (bounce). |
| - | </note> | + | * ''sunet[Eveniment]()'': Functii simple (ex: ''sunetCastig()'', ''sunetMiscare()'') care doar apeleaza ''pulsHardware'' cu valori diferite ca sa sune diferit. |
| - | ===== Rezultate Obţinute ===== | + | === Logica si Randare Vizuala === |
| + | * ''void calculeazaDimensiuni()'': Calculeaza in pixeli cat de mari sa fie patratelele in functie de modul ales ($3\times3$, $4\times4$ sau $5\times5$) ca grila sa stea pe centrul ecranului. | ||
| + | * ''void deseneazaMeniu()'' / ''void deseneazaGameOver()'': Coloreaza ecranele fixe si pune textul la coordonate fixe ca sa nu se incalece literele. | ||
| + | * ''void deseneazaGrila()'' / ''void deseneazaPiesa()'' / ''void deseneazaCursor()'': Deseneaza efectiv liniile tablei, cercurile/X-urile si patratul de cursor in timpul meciului. | ||
| + | * ''void updateTimerGrafic()'': Vede cat timp a trecut din secunda in secunda si redeseneaza bara colorata de sus (verde/rosie). Daca trec cele 10 secunde, schimba rândul automat. | ||
| - | <note tip> | + | ==== Functionalitati din laborator utilizate ==== |
| - | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | |
| - | </note> | + | * **SPI:** Configurat manual prin registrii hardware (''SPCR'', ''SPSR'', ''SPDR'') si pinii de pe Portul B. Trimitem octetii direct in siliciu la viteza maxima de 8MHz, fara functii gata facute. |
| + | * **GPIO:** Tot controlul pinilor (butoane, DC/RST ecran, buzzer) se face prin manipularea directa a registrelor de porturi (''DDRB'', ''PORTB'', ''PORTD'', ''PIND'', ''DDRC'', ''PORTC''). | ||
| + | * **Timere:** **Timer0** este folosit pentru delay-uri precise prin polling (numara pasi de 4 microsecunde pentru buzzer si debouncing), iar **Timer2** genereaza baza de timp pentru cronometrul jocului. | ||
| + | * **Intreruperi:** Am activat intreruperea de overflow pe **Timer2** (''TIMER2_OVF_vect'') pentru a scadea timpul la fiecare 1ms. Am facut asta ca sa nu avem operatii blocante in loop-ul principal, eliminand complet micro-lag-urile in timpul jocului. | ||
| + | ===== Rezultate Obtinute ===== | ||
| + | In urma testarii pe hardware, proiectul este 100% functional, aspect demonstrat si in clipul video (.mp4) atasat in arhiva. | ||
| + | |||
| + | Performantele obtinute: | ||
| + | * **Grafica fluida:** Ecranul se randeaza instant datorita SPI-ului. | ||
| + | * **Control fara lag:** Cursorul si meniurile raspund imediat la butoane, iar debouncing-ul elimina apasarile duble. | ||
| + | * **Audio stabil:** Buzzerul scoate sunete clare pentru mutari, selectii, victorii sau erori. | ||
| + | * **Timp precis:** Bara de 10 secunde scade uniform prin Timer2, schimband automat jucatorul la expirare fara sa inghete jocul. | ||
| ===== Concluzii ===== | ===== Concluzii ===== | ||
| + | In urma multor teste si incercari, proiectul a fost implementat cu succes, respectand toate functionalitatile din planul initial. Pe partea de dezvoltare am intampinat si probleme hardware specifice: am ars controllerul USB al unei placi de test si am reusit sa rup pinii unui buton de pe board (cel configurat initial pentru Start). Totusi in final am reusit sa ajung la ce mi-am propus. | ||
| + | |||
| ===== Download ===== | ===== Download ===== | ||
| + | {{:pm:prj2026:alexandru.jipa2803:archive.zip|}} | ||
| - | <note warning> | + | https://github.com/BurtescuEusebiu/TicTacToePM |
| - | 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 ===== | ||
| Line 84: | Line 118: | ||
| ===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
| + | {{:pm:prj2026:alexandru.jipa2803:xplainedmini.pdf|}} | ||
| - | <note> | + | {{:pm:prj2026:alexandru.jipa2803:st7735.pdf|}} |
| - | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. | + | |
| - | </note> | + | |
| - | + | ||
| - | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | + | |