Differences

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

Link to this comparison view

pm:prj2024:ccontasel:costin.didoaca [2024/05/25 22:40]
costin.didoaca [Software Design]
pm:prj2024:ccontasel:costin.didoaca [2024/05/26 11:03] (current)
costin.didoaca
Line 39: Line 39:
  
 </​note>​ </​note>​
 +
 +
 Schema electrica: Schema electrica:
  
-Mentionez ca este realizata in TinkerCad; pentru a inlocui componenta FC-16 inexistenta in acest mediu de simulare, am inlocuit pinii acesteia cu un Pin Extender ​de 8 pini (Folosind primii 4 in urmatoarea ordine: CLK, CS, DIN, GND, VCC)+Mentionez ca este realizata in TinkerCad; pentru a inlocui componenta FC-16 inexistenta in acest mediu de simulare, am inlocuit pinii acesteia cu un Pin Header ​de 8 pini (Folosind primii 4 in urmatoarea ordine: CLK, CS, DIN, GND, VCC)
  
 {{:​pm:​prj2024:​ccontasel:​schema_electrica_2306.jpg?​650|}} {{:​pm:​prj2024:​ccontasel:​schema_electrica_2306.jpg?​650|}}
 +
 +<note tip>
 +In implementarea circuitului am lipit cele 4 module MAX7219 cu Dot Matrix atasate pin la pin folosind pin-headere duble a cate 5 pini(pini: CLK, CS, D IN/OUT, GND, VCC) si un header in L pentru directionarea inputului(cabluri mama-tata) cu fludor. Am alimentat separat modulele cu 5V DC prin intermediul unui transformator de telefon si un cablu USB sectionat si izolat, atasand firele de VCC si GND pe un breadboard separat.
 +</​note>​
 +
 +DEMO circuit:
 +
 +{{:​pm:​prj2024:​ccontasel:​tetris_demo.jpeg?​650|}}
 +
 ===== Software Design ===== ===== Software Design =====
  
Line 50: Line 61:
 Descrierea codului aplicaţiei (firmware): Descrierea codului aplicaţiei (firmware):
   * mediu de dezvoltare: ArduinoIDE, VSCode, PyCharm - surse: *.cpp, *.ino, *.py    * mediu de dezvoltare: ArduinoIDE, VSCode, PyCharm - surse: *.cpp, *.ino, *.py 
-  * librării ​şi surse 3rd-party: MD_MAX72xx+  * biblioteci ​şi surse 3rd-party: MD_MAX72xx
   * reproducerea jocului Tetris (folosirea deplasarii matriceale)   * reproducerea jocului Tetris (folosirea deplasarii matriceale)
  
Line 64: Line 75:
 Explicatia generala a codului: Explicatia generala a codului:
  
-Common.h: are doar bibliotecile din arduino si o posibilitate de a face debug pe cod, decomentand macro-ul DEBUG(pe Arduino UNO nu functioneaza debugger-ul)+1. **Common.h**: are doar bibliotecile din arduino si o posibilitate de a face debug pe cod, decomentand macro-ul DEBUG(pe Arduino UNO nu functioneaza debugger-ul)
  
-CommandReader : citeste comanda din serial port(serial_display.py) deoarece programul poate functiona si prin introducerea inputului de la tastatura si mai apoi transpunerea lui pe display.+2.**CommandReader** : citeste comanda din serial port(serial_display.py) deoarece programul poate functiona si prin introducerea inputului de la tastatura si mai apoi transpunerea lui pe display.
  
-Board : primeste ca input in constructor,​ numarul de linii si de coloane disponibile (in cazul meu, 32x8) si proceseaza comenzile date ca input: LEFT, RIGHT, ROTATE, DOWN. Trateaza si cazul cand o linie este plina(toate led-urile sunt aprinse) si actualizeaza scorul jucatorului. Adauga o noua forma geometrica(TETRIMINO) compusa din 4 leduri aprinse, iar in momentul cand forma, deplasandu-se pe verticala automat la fiecare secunda, atinge partea de jos a display-ului (ultima matrice), dezactiveaza miscarea formei Tetrimino generate si adauga alta. Pentru a deplasa forma, se apeleaza metoda moveTm care primeste ca parametrii directia pe axele x si y codata prin 0, 1, -1.(ex: deplasare la stanga: moveLeft: moveTm(0, -1)). Recunoasterea tetrimino-ului pe matrice se face prin trecerea de pe 0 pe 1 a pozitiei. ​+3. **Board** : primeste ca input in constructor,​ numarul de linii si de coloane disponibile (in cazul meu, 32x8) si proceseaza comenzile date ca input: LEFT, RIGHT, ROTATE, DOWN. Trateaza si cazul cand o linie este plina(toate led-urile sunt aprinse) si actualizeaza scorul jucatorului. Adauga o noua forma geometrica(TETRIMINO) compusa din 4 leduri aprinse, iar in momentul cand forma, deplasandu-se pe verticala automat la fiecare secunda, atinge partea de jos a display-ului (ultima matrice), dezactiveaza miscarea formei Tetrimino generate si adauga alta. Pentru a deplasa forma, se apeleaza metoda moveTm care primeste ca parametrii directia pe axele x si y codata prin 0, 1, -1.(ex: deplasare la stanga: moveLeft: moveTm(0, -1)). Recunoasterea tetrimino-ului pe matrice se face prin trecerea de pe 0 pe 1 a pozitiei. ​
  
-KeypadReader:​ seteaza pinii LEFT, RIGHT,DOWN, ROTATE atribuiti butoanelor. ​+4. **KeypadReader** : seteaza pinii LEFT, RIGHT,DOWN, ROTATE atribuiti butoanelor. ​
  
-IMPORTANT: In implementarea schemei electrice am folosit caracteristica pin-ului 2 digital din Arduino deoarece doar doi pini sunt capabili sa genereze intreruperi. M-am folosit de interfatarea celor 4 butoane prin intermediul diodelor pentru a le atasa si multiplexa la un singur pin care genereaza intreruperi. Prin acest mod am reusit sa diferentiez butonul care genereaza intreruperea si sa il introduc ca input in cod, folosind metoda digitalPinToInterrupt(2)! In ISR doar capturez butonul care a fost apasat si il atribui uneia dintre variabilele de control (lft, rgt, dwn, rot).+**IMPORTANT: In implementarea schemei electrice am folosit caracteristica pin-ului 2 digital din Arduino deoarece doar doi pini sunt capabili sa genereze intreruperi. M-am folosit de interfatarea celor 4 butoane prin intermediul diodelor pentru a le atasa si multiplexa la un singur pin care genereaza intreruperi. Prin acest mod am reusit sa diferentiez butonul care genereaza intreruperea si sa il introduc ca input in cod, folosind metoda digitalPinToInterrupt(2)! In ISR doar capturez butonul care a fost apasat si il atribui uneia dintre variabilele de control (lft, rgt, dwn, rot).**
  
-Nota:+**Nota**:
 Evidenta LED-urilor aprinse pe display se realizeaza prin crearea unui vector bidimensional de dimensiune reglabila printr-un apel in constructorul clasei Board(ex: Board(8, 8): creeaza un vector bidimensional de dimensiune 8x8) care retine valorile booleene ale fiecarui LED(true: ON; false: OFF). Evidenta LED-urilor aprinse pe display se realizeaza prin crearea unui vector bidimensional de dimensiune reglabila printr-un apel in constructorul clasei Board(ex: Board(8, 8): creeaza un vector bidimensional de dimensiune 8x8) care retine valorile booleene ale fiecarui LED(true: ON; false: OFF).
  
-DotMatrixBoard:​ pana acum, implementarea a fost realizata la nivel conceptual, virtual(software). Aceasta clasa primeste ca input matricea generata(Board) si actualizeaza LED-urile in functie de comenzile date pe modulele fizice.(pini:​ DataInput, ChipSelect si CLK). In metoda print, preia matricea generata in display-ul virtual si o afiseaza pe display-ul fizic(format din 4 module cu chip MAX7219 de Matrice+5. **DotMatrixBoard** : pana acum, implementarea a fost realizata la nivel conceptual, virtual(software). Aceasta clasa primeste ca input matricea generata(Board) si actualizeaza LED-urile in functie de comenzile date pe modulele fizice.(pini:​ DataInput, ChipSelect si CLK). In metoda print, preia matricea generata in display-ul virtual si o afiseaza pe display-ul fizic(format din 4 module cu chip MAX7219 de Matrice
 unicolore).Biblioteca MD_MAX72xx ofera acest output simplificat:​ afisarea unei matrice generate virtual(ex: b[i][j]) pe cele 4 module MAX7219. unicolore).Biblioteca MD_MAX72xx ofera acest output simplificat:​ afisarea unei matrice generate virtual(ex: b[i][j]) pe cele 4 module MAX7219.
  
Line 88: Line 99:
  
 <note tip> <note tip>
-Care au fost rezultatele obţinute în urma realizării proiectului vostru.+Video cu cablajul si gameplay: <​link>​ </​link>​ 
 + 
 +Video cu varianta finala: <​link>​ </​link>​
 </​note>​ </​note>​
  
 ===== Concluzii ===== ===== Concluzii =====
  
 +Prin implementarea acestui proiect am reusit sa inglobez dezvoltarea software in hardware. La inceput axandu-ma pe implementarea software a popularului joc "​Tetris",​ am putut sa creez un device care expune acest joc in mediul fizic, real. 
 +Acest model are posibilitatea sa fie imbunatatit foarte usor prin adaugarea unui difuzor(sau buzzer), unui DISPLAY LED/OLED pentru afisarea scorului(parte care este deja implementata in cod, trebuie doar conectat display-ul fizic si transmis output-ul).
 ===== Download ===== ===== Download =====
  
-<note warning>​ +Codul sursa complet, organizarea claselor si o imagine ​cu cablajul:
-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ă ;-).+
  
-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:tetris_game_arduino_source.zip|}} ​
-</​note>​+
  
 ===== Jurnal ===== ===== Jurnal =====
Line 116: Line 129:
  
 <​note>​ <​note>​
-Listă cu documente, datasheet-uri,​ resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. +Listă cu documente, datasheet-uri,​ resurse Internet folosite:
-</​note>​ +
- +
-Resurse:+
  
 [[https://​www.youtube.com/​watch?​v=XuL_Dmm5V4Y&​list=WL&​index=2&​t=1220s| Coding Tetris in Arduino Explained]] [[https://​www.youtube.com/​watch?​v=XuL_Dmm5V4Y&​list=WL&​index=2&​t=1220s| Coding Tetris in Arduino Explained]]
 [[https://​www.hackster.io/​sherwinchiu89/​tetris-shield-on-an-arduino-mega-9e3a24| Inspo Tetris Project]] [[https://​www.hackster.io/​sherwinchiu89/​tetris-shield-on-an-arduino-mega-9e3a24| Inspo Tetris Project]]
 [[https://​www.youtube.com/​watch?​v=BnVyMB8orBs| Interface Multiple Buttons in 1 ARDUINO Input]] [[https://​www.youtube.com/​watch?​v=BnVyMB8orBs| Interface Multiple Buttons in 1 ARDUINO Input]]
 +</​note>​
 +
 +
  
 <​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>​
  
pm/prj2024/ccontasel/costin.didoaca.1716666032.txt.gz · Last modified: 2024/05/25 22:40 by costin.didoaca
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