This shows you the differences between two versions of the page.
pm:prj2024:ccontasel:matei.costescu [2024/05/23 18:51] matei.costescu [Hardware Design] |
pm:prj2024:ccontasel:matei.costescu [2024/05/25 22:49] (current) matei.costescu [Descriere generală] |
||
---|---|---|---|
Line 12: | Line 12: | ||
{{:pm:prj2024:ccontasel:nim_schema_bloc.png?800|}} | {{:pm:prj2024:ccontasel:nim_schema_bloc.png?800|}} | ||
+ | |||
+ | <note tip> | ||
+ | |||
+ | Concepte folosite: | ||
+ | * **GPIO** - Majoritatea proiectului afiseaza tot ce se intampla cu ajutorul matricei de LED-uri | ||
+ | * **Întreruperi** - Sunt folosite pentru toate apasariile de buton. | ||
+ | * **ADC** - Folosit la citirea input-urilor de pe joystick. | ||
+ | * **SPI** - Biblioteca LedControl transimite matricei de LED-uri pe interfata SPI | ||
+ | |||
+ | </note> | ||
===== Hardware Design ===== | ===== Hardware Design ===== | ||
Schema circuit: | Schema circuit: | ||
- | {{:pm:prj2024:ccontasel:nim_schema_electrica.png?400|}} | + | {{:pm:prj2024:ccontasel:nim_schema_electrica.png?800|}} |
+ | Schema electrica: | ||
+ | |||
+ | {{:pm:prj2024:ccontasel:nim_schematic.png?800|}} | ||
Lista de componente: | Lista de componente: | ||
- | <note tip> | + | <note> |
* Arduino Leonardo | * Arduino Leonardo | ||
* Breadboard | * Breadboard | ||
- | * Matrice LED-uri 8x8 | + | * Matrice LED-uri 8x8 MAX7219 |
* Modul Joy-stick | * Modul Joy-stick | ||
* Buton | * Buton | ||
* Fire de legatura | * Fire de legatura | ||
</note> | </note> | ||
+ | |||
+ | Modul de utilizare al componentelor: | ||
+ | <note> | ||
+ | Arduino Leonardo | ||
+ | Microcontroller care proceseaza codul, are rolul de a lega toate functionalitatiile fiecarei componente. El se ocupa de citirea input-urilor de la joystick si buton, procesarea lor pentru a calcula starea de joc (sau starea in meniu)si afisarea unui rezultat pentru utilizator pe matricea de led-uri | ||
+ | </note> | ||
+ | |||
+ | <note> | ||
+ | Matrice LED-uri 8x8 MAX7219 | ||
+ | |||
+ | Acesta este folosit pentru afisarea jocului si pentru testarea functionarii corecte a programului. | ||
+ | |||
+ | Matricea are 5 pini care sunt conectati astfel: | ||
+ | |||
+ | * VCC - conectat la pinul de 5V de la Arduino | ||
+ | * GND - conectat la toate celelalte GND | ||
+ | * DIN - conectat la pinul digital ~11 (MOSI) | ||
+ | * CS - conectat la pinul digital ~10 (SS) | ||
+ | * CLK - conectat la pinul digital ~13 (SCK) | ||
+ | |||
+ | </note> | ||
+ | |||
+ | <note> | ||
+ | Modul Joystick | ||
+ | |||
+ | Acesta este folosit pentru citirea input-ului jucator. | ||
+ | |||
+ | Modulul are 5 pini care sunt conectati astfel: | ||
+ | |||
+ | * GND - conectat la toate celelalte GND | ||
+ | * VCC - conectat la pinul de 5V de la Arduino | ||
+ | * VRx- conectat la pinul analog A1, citeste input-urile pe axa Ox | ||
+ | * VRy - conectat la pinul analog A0, citeste input-urile pe axa Oy | ||
+ | * SW - este pinul pentru butonul de pe joystick dar nu este utilizat | ||
+ | |||
+ | </note> | ||
+ | |||
+ | <note> | ||
+ | Buton | ||
+ | |||
+ | Acesta este folosit pentru citirea input-ului jucator. | ||
+ | |||
+ | Butonul are 2 pini: | ||
+ | |||
+ | * GND - conectat la toate celelalte GND | ||
+ | * BTN - conectat la pinul digital 2, citeste daca butonul e apasat | ||
+ | |||
+ | </note> | ||
+ | |||
+ | |||
+ | Poza cu proiectul: | ||
+ | |||
+ | {{:pm:prj2024:ccontasel:nim_irl_v1.png?800|}} | ||
+ | |||
+ | [[https://www.youtube.com/watch?v=nsFfOQ_iH50|Demo]] | ||
===== Software Design ===== | ===== Software Design ===== | ||
- | <note tip> | + | <note> |
Descrierea codului aplicaţiei (firmware): | Descrierea codului aplicaţiei (firmware): | ||
- | * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) | + | * mediu de dezvoltare: ArduinoIDE |
- | * librării şi surse 3rd-party (e.g. Procyon AVRlib) | + | * librării: LedControl.h |
- | * algoritmi şi structuri pe care plănuiţi să le implementaţi | + | ** Github: ** [[https://github.com/plapusk/NIM-Game|Nim Game]] |
- | * (etapa 3) surse şi funcţii implementate | + | |
</note> | </note> | ||
- | ===== Rezultate Obţinute ===== | ||
- | <note tip> | + | ==Biblioteci si Constante== |
- | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | |
- | </note> | + | |
+ | <code wrap> | ||
+ | #include <LedControl.h> | ||
+ | |||
+ | #define NEUTRAL 510 | ||
+ | #define MAX 1023 | ||
+ | #define ERR 10 | ||
+ | #define SWITCH_PLAYER 3 | ||
+ | #define RANDOM 3 | ||
+ | #define NUM_MAPS 4 | ||
+ | #define MAP_SIZE 6 | ||
+ | #define DEBOUNCE_DELAY 300 | ||
+ | #define CPU_MOVE 300 | ||
+ | #define G2P 2 | ||
+ | #define GCPU 1 | ||
+ | #define HARD 2 | ||
+ | #define RESET_TIME 120000 | ||
+ | </code> | ||
+ | |||
+ | Biblioteca LedControl este utilizata pentru a controla matricea de LED-uri prin intermediul interfetei SPI. | ||
+ | |||
+ | ==Definitii de pini== | ||
+ | |||
+ | <code wrap> | ||
+ | int DIN = 11; // Pinul pentru date | ||
+ | int CS = 10; // Pinul pentru selectarea cipului | ||
+ | int CLK = 13; // Pinul pentru ceas | ||
+ | LedControl lc = LedControl(DIN, CLK, CS, 0); | ||
+ | |||
+ | int xPin = A0; | ||
+ | int yPin = A1; | ||
+ | int buttonPin = 2; | ||
+ | </code> | ||
+ | |||
+ | ==Imagini pentru afisare== | ||
+ | |||
+ | <code wrap> | ||
+ | byte DIFFICULTY[3][8] = { ... }; | ||
+ | byte WIN[2][8] = { ... }; | ||
+ | byte EMPTY[8] = { ... }; | ||
+ | byte P2[8] = { ... }; | ||
+ | byte P1[8] = { ... }; | ||
+ | byte QUESTION_MARK[8] = { ... }; | ||
+ | byte NUM_PLAY[8][3]; | ||
+ | byte Disp[8]; | ||
+ | </code> | ||
+ | |||
+ | Tabele reprezentand diferite stari ale afisajului: niveluri de dificultate, ecrane de castig, indicatori de jucatori, etc. | ||
+ | |||
+ | ==Configuratiile hartii== | ||
+ | |||
+ | <code wrap> | ||
+ | int map_layout[3][6] = { ... }; | ||
+ | int current_map[6]; | ||
+ | </code> | ||
+ | |||
+ | Definirea configuratiilor stariilor initiale de joc si o variabila pentru a tine harta curenta. | ||
+ | |||
+ | ==Functii ale jocului== | ||
+ | |||
+ | * **reset_game()**: Reseteaza variabilele jocului la starile lor initiale. | ||
+ | |||
+ | * **setup()**: Initializeaza pinii, comunicarea seriala, matricea LED si configureaza intreruperea pentru buton. | ||
+ | |||
+ | * **show_display()**: Actualizeaza matricea LED cu datele actuale ale afisajului. | ||
+ | |||
+ | * **difficulty_select()**: Gestioneaza intrarea de la joystick pentru selectarea nivelului de dificultate. | ||
+ | |||
+ | * **menu_org()**: Gestioneaza meniul principal pentru selectarea numarului de jucatori. | ||
+ | |||
+ | * **convert_map_to_disp()**: Convertește un array de harta in formatul de afisare. | ||
+ | |||
+ | * **random_map()**: Genereaza o configuratie aleatorie a hartii. | ||
+ | |||
+ | * **reset_cursor()**: Reseteaza pozitia cursorului la prima coloana nevida. | ||
+ | |||
+ | * **map_select()**: Gestioneaza selectarea unei configuratii de harta. | ||
+ | |||
+ | * **player_move()**: Gestioneaza miscarea jucatorului bazata pe intrarea de la joystick. | ||
+ | |||
+ | * **make_move()**: Efectueaza o mutare in joc a CPU-ului. | ||
+ | |||
+ | * **CPU_h_move()**: Logica pentru mutarile CPU pe modurile HARD si MEDIUM. | ||
+ | |||
+ | * **CPU_e_move()**: Logica pentru mutarile CPU pe modul EASY. | ||
+ | |||
+ | * **win_game()**: Verifica daca jocul a fost castigat si afiseaza animatia de castig. | ||
+ | |||
+ | * **game_manager()**: Gestioneaza logica generala a jocului si alterneaza intre mutarile jucatorilor si cele ale CPU-ului. | ||
+ | |||
+ | ==Main loop== | ||
+ | |||
+ | <code wrap> | ||
+ | void loop() { | ||
+ | if (menu > 0) { | ||
+ | menu_org(); | ||
+ | } else { | ||
+ | game_manager(); | ||
+ | } | ||
+ | show_display(); | ||
+ | for (int i = 0; i < 8; i++) Disp[i] = EMPTY[i]; | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | Bucla principala care comuta intre meniu și modurile de joc si actualizeaza afisajul. | ||
+ | ===== Rezultate Obţinute ===== | ||
+ | |||
+ | Implementarea acestui proiect a dus la crearea unui joc complet funcțional pe o matrice de LED-uri, controlat printr-un joystick și un buton. Am reușit să gestionăm corect intrările analogice și digitale, să implementăm o logică de joc pentru două jucătoare și să integrăm un oponent CPU cu diferite niveluri de dificultate. Proiectul a demonstrat capacitatea de a utiliza biblioteca LedControl pentru a controla o matrice LED 8x8, de a debuga și testa eficient codul pentru a elimina erorile și de a crea o experiență interactivă de joc. Acest proiect a oferit o bază solidă pentru dezvoltarea unor proiecte mai complexe, implicând automatizarea și controlul hardware-ului prin programare. | ||
===== Concluzii ===== | ===== Concluzii ===== | ||
+ | Implementarea acestui proiect a implicat gestionarea intrărilor analogice și digitale, cum ar fi joystick-ul și butonul, pentru a controla jocul. De-a lungul procesului de dezvoltare, s-au întâlnit diverse erori și probleme, necesitând testare și depanare constantă pentru asigurarea funcționării corecte a codului. Cu toate acestea am obținut o introducere în crearea unui proiect folosind automatizările și cred că acum sunt pregătit să întâmpin proiecte și mai dificile. | ||
===== Download ===== | ===== Download ===== | ||
- | <note warning> | + | <note tip> |
- | 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ă ;-). | + | ZIP cu proiectul: |
- | 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**. | + | {{:pm:prj2024:ccontasel:nim-game.zip|}} |
</note> | </note> | ||
Line 59: | Line 231: | ||
<note tip> | <note tip> | ||
- | Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. | + | * 05/05/2024 - Creare pagină wiki. |
+ | * 13/05/2024 - 14/05/2024 - Construire prima versiune de circuit. | ||
+ | * 16/05/2024 - Inlocuire Joystick defect | ||
+ | * 23/05/2024 - 24/05/2024 - Implementare Software | ||
+ | * 25/05/2024 - Update final documentatie | ||
</note> | </note> | ||
+ | {{:pm:prj2024:ccontasel:nim_jurnal.png?800|}} | ||
===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
<note> | <note> | ||
- | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. | + | [[https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/|Guide intreruperi Arduino]] |
+ | |||
+ | [[https://docs.arduino.cc/resources/pinouts/A000057-full-pinout.pdf/|Datasheet Arduino Leonardo]] | ||
+ | |||
+ | [[https://projecthub.arduino.cc/mdraber/controlling-8x8-dot-matrix-with-max7219-and-arduino-0c417a|Guide Max7219 Matrice 8x8]] | ||
+ | |||
+ | [[https://microcontrollerelectronics.com/arduino-leonardo-and-spi-communications/| Guide folosit pentru conectarea corecta a pinilor la matrice]] | ||
</note> | </note> | ||