Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pm:prj2024:ccontasel:matei.costescu [2024/05/24 20:38]
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: Schema electrica:
  
-{{:​pm:​prj2024:​ccontasel:​nim_schematic.png?​400|}}+{{:​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: Poza cu proiectul:
  
-{{:​pm:​prj2024:​ccontasel:​nim_irl_v1.png?​400|}}+{{:​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 proiectuluisurse, 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 66: 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>​
  
pm/prj2024/ccontasel/matei.costescu.1716572317.txt.gz · Last modified: 2024/05/24 20:38 by matei.costescu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0