Differences

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

Link to this comparison view

pm:prj2023:ncaroi:tabla-de-sah [2023/05/03 11:44]
radu_ioan.pascale [Bibliografie/Resurse] Deleted note block. Added to do header.
pm:prj2023:ncaroi:tabla-de-sah [2023/06/02 18:58] (current)
radu_ioan.pascale [Rezultate Obţinute si concluzii]
Line 1: Line 1:
-====== ​Tabla de C.I.A.C ======+====== C.I.A.C ​- (Li)Chess Interface with Arduino Control ​======
 ===== Introducere ===== ===== Introducere =====
 +{{:​pm:​prj2023:​ncaroi:​cutie_finala_lichess.jpeg?​600}}
  
 Proiectul presupune realizarea unei table de șah care poate fi conectată printr-un port USB la calculator pentru a juca meciuri online sau OTB(over the board) cu un prieten folosind API-ul oferit de [[https://​lichess.org/​api|Lichess]]. Proiectul presupune realizarea unei table de șah care poate fi conectată printr-un port USB la calculator pentru a juca meciuri online sau OTB(over the board) cu un prieten folosind API-ul oferit de [[https://​lichess.org/​api|Lichess]].
Line 11: Line 12:
 {{:​pm:​prj2023:​ncaroi:​schema_bloc_ciac.jpg?​600}} {{:​pm:​prj2023:​ncaroi:​schema_bloc_ciac.jpg?​600}}
  
-Una din funcționalitățile principale ale tablei este detectarea pieselor folosind **senzori magnetici** și transmiterea datelor de la Arduino la calculator pentru procesarea mutărilor. Sub fiecare pătrat al tablei de șah se află un **senzor hall A3144** așezat pe o bucată mică de metal, mai exact o moneda de 10 bani. În momentul în care o piesă este așezată pe tablă, magnetul de la baza ei magnetizează moneda, activând astfel senzorul.+Una din funcționalitățile principale ale tablei este detectarea pieselor folosind **senzori magnetici** și transmiterea datelor de la Arduino la calculator pentru procesarea mutărilor. Sub fiecare pătrat al tablei de șah se află un **senzor hall A3144** așezat pe o bucată mică de metal, mai exact <del>o moneda de 10 bani</​del>​ o piulita. În momentul în care o piesă este așezată pe tablă, magnetul de la baza ei magnetizează moneda, activând astfel senzorul.
 Citirea tablei se realizează prin activarea pe rând a fiecărei coloane cu un **shift register** și citirea datelor de pe fiecare linie cu un **multiplexor** (vezi **schematic**). Citirea tablei se realizează prin activarea pe rând a fiecărei coloane cu un **shift register** și citirea datelor de pe fiecare linie cu un **multiplexor** (vezi **schematic**).
  
Line 20: Line 21:
     - În cazul în care mutarea efectuată de un jucător nu este legală, se va afișa configurația anterioară a tablei     - În cazul în care mutarea efectuată de un jucător nu este legală, se va afișa configurația anterioară a tablei
 ===== Hardware Design ===== ===== Hardware Design =====
-==== TO DO: ADD Schematic ====+==== Hardware ​Schematic ==== 
 +{{:​pm:​prj2023:​ncaroi:​schematic_ciac.png?​800}}
  
 ==== Materiale folosite ==== ==== Materiale folosite ====
Line 33: Line 35:
   * [[https://​www.optimusdigital.ro/​en/​wires-without-connectors/​3299-200-m-green-wire-mini-roll-05-mm-external-diameter-x-025-mm-internal-diameter.html?​search_query=200+m+Green+Wire+Mini+Roll+&​results=3 | Cablu]]   * [[https://​www.optimusdigital.ro/​en/​wires-without-connectors/​3299-200-m-green-wire-mini-roll-05-mm-external-diameter-x-025-mm-internal-diameter.html?​search_query=200+m+Green+Wire+Mini+Roll+&​results=3 | Cablu]]
   * Condensatoare,​ rezistente, etc.   * Condensatoare,​ rezistente, etc.
 +  * 8 tranzistoare BC337
  
 ===== Software Design ===== ===== Software Design =====
 +Toata partea de dezvoltare software pentru Arduino a fost facuta in Visual Studio Code folosind extensia [[https://​platformio.org/​install/​ide?​install=vscode | PlatformIO]],​ iar pentru partea de comunicare cu serverul de Lichess am folosit Python intr-un environment de Conda.
  
-==== TO DO ==== +==== Biblioteci folosite pe Arduino ​==== 
-===== Rezultate Obţinute ​===== +  * [[https://​github.com/​adafruit/​Adafruit-GFX-Library | Adafruit_GFX]] 
-===== Concluzii ​=====+  * [[https://​github.com/​PaulStoffregen/​SPI | SPI]] 
 +  * [[https://​github.com/​adafruit/​Adafruit_ILI9341 | Adafruit_ILI9341]] 
 +  * [[https://​github.com/​olikraus/​ucglib | UCGLIB]] 
 + 
 +==== Module folosite in script-ul de Python ​==== 
 +<code python>​ 
 +  python==3.11.3 
 +  ​berserk==0.12.4 
 +  CairoSVG==2.7.0 
 +  chess==1.9.4 
 +  ipython==8.13.2 
 +  opencv_python==4.7.0.72 
 +  Pillow==9.5.0 
 +  pyserial==3.5 
 +</​code>​ 
 + 
 +==== Functionalitati implementate pe Arduino ==== 
 +Am incercat sa impart logica programului in cat mai multe fisiere sursa ca sa am un program cat de cat modular. Deoarece am scris aproape 1000 de linii de cod(si INCA nu e gata), din respect pentru timpul persoanei care va citi asta si din ratiuni de economie pentru timpul meu, o sa ofer mai jos doar un overview asupra functionalitatilor implementate in fiecare fisier sursa, fara sa detaliez explicit fiecare functie. 
 +  * <code c++> mux.cpp </​code>​ 
 +    * Initializeaza multiplexorul. 
 +    * Defineste functii necesare activarii si citirii intrarilor. 
 +  * <code c++> shift_reg.cpp </​code>​ 
 +    * Initializeaza shift register-ul. 
 +    * Defineste functii necesare setarii de valori in registrele interne ale modului si scoaterii de date la output pe latch. 
 +  * <code c++> timer.cpp </​code>​ 
 +    * Initializeaza timerul 1 pentru a activa intreruperi o data la 1s. 
 +    * Defineste logica de intrerupere si o functie se updateaza timpul jucatorilor. 
 +  * <code c++> tft.cpp </​code>​ 
 +    * Implementeaza metodele definite in clasa numita TFT si initializeaza display-ul 
 +    * Realizeaza afisarea ultimei mutari pe ecran in format **UCI** 
 +    * Afiseaza tabla de sah asa cum apare ea pe Lichess folosind in loc de imagini caractere(P,​N,​B,​ etc.). Ca o mica paranteza, am incercat sa afisez bitmap-uri ca sa arate totul mai frumos doar ca dureaza cam mult si am vrut sa pastrez afisarea cat de cat //​instantanee//​ (dar cu ocazia asta am aflat ce face **PROGMEM** si cum se iau datele din memoria Flash). 
 +    * Defineste functii pentru afisarea timpului ramas 
 +  * <code c++> serial.cpp </​code>​ 
 +    * Aici am definit niste functii ajutatoare pentru citirea de date de pe interfata seriala si pentru trimiterea de *pachete* catre calculator. 
 +  * <code c++> main.cpp </​code>​ 
 +      * Defineste si initializeaza toate variabilele globale folosite in program(flag-uri,​ pini, array-ul cu tabla de sah, buffere, etc.) 
 +      * Parseaza si apeleaza functiile necesare in urma citirii datelor de pe interfata seriala. Fiecare mesaj este identificat printr-un byte de start care descrie ce actiune trebuie sa aiba loc(de exemplu, un mesaj care incepe cu **B** va contine noua configuratie a tablei ce trebuie afisata pe Arduino). Comenzile sunt delimitate folosind '​\n'​. 
 +      * In urma apasarii unui buton, citeste si trimite configuratia tablei fizice catre script-ul de Python. 
 + 
 +==== Functionalitati implementate in script-ul de Python ==== 
 +  * <code python> class Reader(threading.Thread) </​code>​ 
 +      * Primeste si trimite date catre Arduino 
 +      * In momentul de fata, deoarece nu am reusit sa fac modulul cu touchscreen XPT2046 sa functioneze,​ singurele mesaje pe care le poate primi de la Arduino sunt cele cu configuratia tablei fizice. 
 +      * Defineste functiile necesare pentru validarea mutarilor (rocada, **en passant**, mutare catre un spatiu gol, mutare care promoveaza un pion, luarea de piese). De mentionat aici este faptul ca, din cauza naturii imprevizibile a senzorilor magnetici, am luat decizia de a nu citi tabla decat la apasarea unui buton, drept urmare ar fi existat unele cazuri in care mi-ar fi fost imposibil sa determin ce piesa a fost luata de pe tabla. Solutia ideala ar fi fost sa citesc in mod constant tabla si sa ma folosesc de 2 stari pentru a determina ce piesa a disparut. Solutia simpla si realista, care merge in 100% de cazuri, a fost sa adaug o noua regula in conduita nescrisa a sahului: //Atunci cand un jucator vrea sa ia o alta piesa, acesta trebuie sa ridice ambele piese de pe tabla si sa apese pe buton.// 
 +      * Afiseaza mesaje de logging pentru debug (mutare invalida, ce senzori s-au citit, etc.) 
 +      * Defineste functii prin care se trimit date la Arduino(ultima mutare, pozitia curenta a tablei, timpul jucatorilor,​ etc.) 
 +    * <code python> class Game(threading.Thread) </​code>​ 
 +        * Defineste functiile necesare handle-ului minimal de evenimente care pot aparea intr-un meci de Lichess (opponent moved, game ended, game aborted,  
 +        * Foloseste o referinta la un obiect de tip Reader pentru a comunica cu Arduino-ul. Tot aici se realizeaza si trimiterea mutarilor dupa validare la Lichess. 
 +    * <code python> Main Thread </​code>​ 
 +        * La incepului rularii scriptului se creeaza clientul, numit in continuare **ciac_bot**, ​ si un thread Reader care ruleaza ca **daemon**. 
 +        * Se asculta eventuri de tip new challenge sau gameStart si se creeaza threaduri noi de tip Game in functie de gamemode-ul selectat. Gamemode-ul default e online, dar pot juca si doua persoane simultan pe aceeasi tabla, caz in care se creeaza un challenge intre **ciac_bot** si **ciac_bot_friend** in care se inregistreaza meciul pentru a fi analizat ulterior pe calculator. 
 +===== Rezultate Obţinute si concluzii ===== 
 + 
 +<​note>​[[https://​www.youtube.com/​embed/​O1Tlt5GdJaM|Link catre varianta prezentata la PM fair.]]</​note>​ 
 + 
 +Am invatat ca de multe ori ceea ce pare usor pe hartie se dovedeste a fi un chin in realitate. Pe parcursul proiectului,​ a trebuit sa-mi schimb de multe ori abordarea pentru ca de multe ori am descoperit ca ideile mele nu functioneaza asa cum m-as fi asteptat. Am improvizat mult si am fost nevoit sa renunt la multe lucruri pe care as fi vrut sa le adaug la proiect din cauza lipsei de timp. 
 + 
 +Cele mai multe probleme le-am avut cu senzorii magnetici pentru ca uneori citeau prost, iar alteori nu citeau deloc. De asta, am fost nevoit sa schimb o parte din ei si sa improvizez un capac din carton pentru tabla pentru ca nu reuseam sa citesc intr-un mod consecvent senzorii prin materiale putin mai groase. 
 + 
 +In final, desi am avut parte de multe dezamagiri de-alungul proiectului,​ ma simt foarte bine ca am reusit sa-l duc la capat. Satisfactia de a realiza ceva functional cu mainile tale e un lucru greu de echivalat.
  
 ===== Download ===== ===== Download =====
-==== TO DO ====+  * [[https://​github.com/​radupascale/​pm/​tree/​main/​proiect | Link Repo]] 
 ===== Jurnal ===== ===== Jurnal =====
-==== TO DO ==== +  * 29-04-2023: Am testat logica de citire a senzorilor pe un breadboard cu cativa senzori. 
-===== Bibliografie/​Resurse ===== +  * 30-04-2023: Am inceput sa lucrez la capacul pentru tabla de sah si m-am taiat atat de tare cu un cutter de la Dexter incat am ajuns la urgente. todo: de adaugat betadina la lista de materiale. 
-==== TO DO ====+{{:​pm:​prj2023:​ncaroi:​tabla_lipita.jpeg?​400}} 
 +  * 02-05-2023 - 05-05-2023: Am terminat de realizat cablajul pentru senzori si am invatat sa lipesc. 
 +{{:​pm:​prj2023:​ncaroi:​senzori_fata.jpeg?​400}} 
 +{{:​pm:​prj2023:​ncaroi:​senzori_spate.jpeg?​400}} 
 +  * 16-05-2023: Am mai facut niste DIY ca sa bag magnetii in piese azi si am inlocuit toate monezile cu niste piulite. Uneori se prindeau piesele intre 2 banuti, asa ca a trebuit sa caut o alternativa cu o suprafata mai mica. 
 +{{:​pm:​prj2023:​ncaroi:​magnet_piesa.jpeg?​400}} 
 +  * 19-05-2023: Am terminat de realizat partea de hardware dupa mult debuggind la senzori: 
 +{{:​pm:​prj2023:​ncaroi:​ciac_schelet.jpg?​400}} 
 +{{:​pm:​prj2023:​ncaroi:​ciac_capac.jpg?​400}} 
 +  * 21-05-2023 - 24-05-2023: Am facut comunicarea cu serverul de Lichess si afisarea pe ecranul TFT. 
 +{{:​pm:​prj2023:​ncaroi:​cablaj_complet.jpeg?​400}} 
 +{{:​pm:​prj2023:​ncaroi:​ecran_tft.jpeg?​400}} 
 +  * 29-05-2023: Nu puteam citi toti senzorii prin tabla de sah pe care voiam sa o folosesc initial, asa ca a trebuit sa-mi confectionez alta cutie. Astazi marchez sfarsitul lucratului la tabla de sah. 
 +{{:​pm:​prj2023:​ncaroi:​cutie_finala.png?​400}} 
 +{{:​pm:​prj2023:​ncaroi:​cutie_finala2.jpeg?​400}} 
 + 
 +===== Resurse =====
 ==== Resurse Software ==== ==== Resurse Software ====
   * [[https://​docs.arduino.cc/​tutorials/​communication/​guide-to-shift-out | tutorial 74HC595]]   * [[https://​docs.arduino.cc/​tutorials/​communication/​guide-to-shift-out | tutorial 74HC595]]
   * [[https://​learn.sparkfun.com/​tutorials/​multiplexer-breakout-hookup-guide | tutorial MUX sparkfun]]   * [[https://​learn.sparkfun.com/​tutorials/​multiplexer-breakout-hookup-guide | tutorial MUX sparkfun]]
 +  * [[https://​lichess.org/​api | Lichess API documentation]]
 +  * [[https://​python-chess.readthedocs.io/​en/​latest/​| Python chess documentation]]
 +  * [[https://​berserk.readthedocs.io/​en/​master/​ | Berserk documentation]]
 +==== Resurse Hardware ====
 +  * [[http://​cdn.sparkfun.com/​assets/​learn_tutorials/​5/​5/​3/​74HC_HCT4051.pdf | datasheet mux]]
 +  * [[https://​docs.wokwi.com/​parts/​wokwi-74hc165 | Documentatie 74HC595]]
 +  * [[https://​www.elecrow.com/​download/​A3141-2-3-4-Datasheet.pdf | Datasheet senzori Hall Effect A3144]]
 <​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/prj2023/ncaroi/tabla-de-sah.1683103463.txt.gz · Last modified: 2023/05/03 11:44 by radu_ioan.pascale
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