This shows you the differences between two versions of the page.
pm:prj2023:adarmaz:utictactoe [2023/05/26 15:36] mihai_cosmin.rosu |
pm:prj2023:adarmaz:utictactoe [2023/05/27 18:17] (current) mihai_cosmin.rosu |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== Ultimate Tic-Tac-Toe - Roșu Mihai Cosmin - 333CA ====== | ====== Ultimate Tic-Tac-Toe - Roșu Mihai Cosmin - 333CA ====== | ||
+ | |||
+ | ===== Demo ===== | ||
+ | |||
+ | <html> | ||
+ | <iframe | ||
+ | src="https://www.youtube.com/embed/XRYpv7-YvOo" | ||
+ | title="YouTube video player" | ||
+ | frameborder="0" | ||
+ | allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" | ||
+ | allowfullscreen | ||
+ | style="aspect-ratio: 16/9; width: 100%;" | ||
+ | ></iframe> | ||
+ | </html> | ||
===== Introducere ===== | ===== Introducere ===== | ||
Line 57: | Line 70: | ||
* Pentru dezvoltarea proiectului am folosit **Arduino IDE**, în cadrul căruia am importat următoarele biblioteci: | * Pentru dezvoltarea proiectului am folosit **Arduino IDE**, în cadrul căruia am importat următoarele biblioteci: | ||
- **Adafruit GFX**, bibliotecă ce se poate importa direct din IDE, necesară pentru a desena/scrie pe ecran | - **Adafruit GFX**, bibliotecă ce se poate importa direct din IDE, necesară pentru a desena/scrie pe ecran | ||
- | - **Arduino ST7789 Fast**, bibliotecă externă, folosită pentru a comunica cu ecranul, folosește **Adafruit GFX** | + | - **Arduino ST7789 Fast**, bibliotecă externă, folosită pentru a comunica cu ecranul prin **SPI**, folosește **Adafruit GFX** și **SPI.h** |
* În cadrul implementării am folosit și operații cu registre pentru: | * În cadrul implementării am folosit și operații cu registre pentru: | ||
- **ADC**: Am ales să configurez și să folosesc ADC astfel, fiindcă am avut nevoie să controlez prescalerul folosit de acesta. Acest lucru era necesar fiindcă pentru o citire de ADC, de fapt au loc 100 de citiri, pentru a reduce noise-ul. | - **ADC**: Am ales să configurez și să folosesc ADC astfel, fiindcă am avut nevoie să controlez prescalerul folosit de acesta. Acest lucru era necesar fiindcă pentru o citire de ADC, de fapt au loc 100 de citiri, pentru a reduce noise-ul. | ||
- **PWM**: Pentru a trimite un semnal PWM buzzer-ului, am ales să folosesc registre pentru a configura **Timer1** în modul **FastPWM**. De asemenea, pentru a determina când trebuie oprit semnalul PWM, folosesc întreruperea de overflow a timer-ului. | - **PWM**: Pentru a trimite un semnal PWM buzzer-ului, am ales să folosesc registre pentru a configura **Timer1** în modul **FastPWM**. De asemenea, pentru a determina când trebuie oprit semnalul PWM, folosesc întreruperea de overflow a timer-ului. | ||
- | - **Întreruperi**: Pentru întreruperile externe **INT0**, **INT1** și **TIMER1_OVF**. | + | - **Întreruperi**: Pentru întreruperile externe **INT0**, **INT1** și întreruperea de timer **TIMER1_OVF**. |
==== Implementare generală ==== | ==== Implementare generală ==== | ||
Line 106: | Line 119: | ||
* **5.** Altfel | * **5.** Altfel | ||
* **Ordinea** priorităților nu este întâmplătoare, întrucât este important în ce ordine sunt verificate posibilele priorități. Acest lucru este datorat faptului că necesitățile unor priorități sunt îndeplinite și de altele, care adaugă restricții suplimentare. | * **Ordinea** priorităților nu este întâmplătoare, întrucât este important în ce ordine sunt verificate posibilele priorități. Acest lucru este datorat faptului că necesitățile unor priorități sunt îndeplinite și de altele, care adaugă restricții suplimentare. | ||
+ | |||
+ | ===== Rezultate obținute ===== | ||
+ | |||
+ | ==== Părere personală ==== | ||
+ | |||
+ | Rezultatul obținut mi-a depășit cu mult așteptările. Acesta fiind **primul proiect** pe care l-am făcut folosind **Arduino**, mă așteptam ca din ce mi-am propus inițial să trebuiască să renunț la unele funcționalități. | ||
+ | |||
+ | Din fericire, nu a fost nevoie, deoarece, deși m-am lovit de diferite dificultăți pe parcursul implementării proiectului, am reușit să rezolv problemele, astfel încat proiectul să funcționeze în modul în care mi-l imaginasem la început. | ||
+ | |||
+ | ==== Imagini proiect ==== | ||
+ | |||
+ | {{ :pm:prj2023:adarmaz:utictactoe_meniu.jpg?700 |}} | ||
+ | |||
+ | {{ :pm:prj2023:adarmaz:utictactoe_img1.jpg?700 |}} | ||
+ | |||
+ | {{ :pm:prj2023:adarmaz:utictactoe_img2.jpg?700 |}} | ||
+ | |||
+ | ===== Concluzii ===== | ||
+ | |||
+ | În primul rand, personal **mă bucur că am avut de făcut acest proiect**, procesul de implementare fiind complet diferit față de o temă obișnuită. Datorită acestuia, acum consider că am văzut măcar o parte din câte lucruri se pot face folosint o simplă placuță Arduino și sper să nu fie ultima dată când interacționez cu una. | ||
+ | |||
+ | În al doilea rând, aș vrea să menționez câteva probleme ale proiectului: | ||
+ | * Deoarece ecranul are nevoie de un timp scurt, dar care nu este neglijabil, pentru a desena ceva, este posibil ca atunci când jocul se termina să se apese un buton, care te duce înapoi în meniu, înainte ca textul "X WINS" sau "0 WINS" să se afișeze, ceea ce duce programul în starea de meniu, deși pe ecran este afișat textul de sfârșit de joc. | ||
+ | * Uneori, o singură apăsare de buton declanșează de două ori întreruperea. Acest lucru poate fi observat ușor încercând o mutare invalidă, fiindcă se va auzi buzzer-ul de două ori. | ||
+ | * Pe dificultatea Hard, la începutul jocului, când tabla este în mare parte goală, o mutare a AI-ului durează aproximativ 10 secunde, ceea ce este mult. Deși nu este o problemă la fel de gravă ca celelalte două, este deranjant pentru utilizator. Timpul poate fi redus prin eficientizarea codului. | ||
+ | |||
+ | ===== Download ===== | ||
+ | <note important>**Codul sursă, biblioteca Arduino_ST7789_Fast, schemele și imaginile din această documentație pot fi găsite în următoarea arhivă: {{:pm:prj2023:adarmaz:pm_rosu_mihai_cosmin_333ca_2023.zip|}}.** | ||
+ | |||
+ | **De asemenea, proiectul poate fi găsit și pe GitHub: [[https://github.com/mehigh8/UltimateTicTacToePM|Ultimate Tic-Tac-Toe]]**</note> | ||
+ | |||
+ | ===== Bibliografie/Resurse ===== | ||
+ | |||
+ | ==== Resurse documentație ==== | ||
+ | * [[https://miro.com/index/|Tool folosit la realizarea schemei bloc]] | ||
+ | * [[https://fritzing.org/|Tool folosit la realizarea schemei circuitului]] | ||
+ | |||
+ | ==== Resurse hardware și software ==== | ||
+ | * [[https://ocw.cs.pub.ro/courses/_media/pm/atmel-7810-automotive-microcontrollers-atmega328p_datasheet.pdf|Documentație ATMega328P]] | ||
+ | * [[https://docs.arduino.cc/built-in-examples/digital/Button|Tutorial conectare buton Arduino]] | ||
+ | * [[https://www.youtube.com/watch?v=-nECx4DOE84|Tutorial folosire ecran ST7789]] | ||
+ | * [[https://docs.arduino.cc/tutorials/generic/secrets-of-arduino-pwm|Tutorial PWM cu registre]] | ||
+ | * [[https://github.com/cbm80amiga/Arduino_ST7789_Fast|Biblioteca Arduino_ST7789_Fast]] | ||
+ | * [[pp:22:teme:prolog-ultimate-ttt|Sursă inspirație pentru prioritățile folosite în modul Singleplayer]] | ||
+ | |||
<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> | ||