Table of Contents

Minichess

Introducere

Proiectul își propune realizarea unei variante simplificate a unui joc de sah, minichess 4×5.

Descriere generală

  • Jocul va fi afișat pe display-ul OLED, care va comunica cu microcontroller-ul prin protocolul I2C.
  • Jucătorul se va putea juca prin intermediul butoanelor
  • Butoanele vor fi conectate la un singur pin, și multiplexate folosind convertorul analog-digital și rezistențe
  • Modulul FT232RL va fi folosit pentru programarea microcontroller-ului

Hardware Design

Listă de piese:

  • Microcontroller ATmega328p
  • Display OLED 0.96” 128x64px
  • Modul Convertor USB Serial FT232RL
  • Oscilator cu Quartz 16Mhz
  • Butoane
  • Rezistențe
  • Condensatori

Schema electrică:

Implementare fizică:

Software Design

Link Github:
https://github.com/andreiboieriu/Minichess

Mediu de dezvoltare:
Visual Studio Code + avr-g++ / avrdude pentru compilare / uploadare cod pe microcontroller

Biblioteci și surse 3rd party:
- https://github.com/monoclecat/avr-millis-function pentru funcția millis()
- laboratoarele de UART, ADC si I2C

Descrierea implementării:
Codul a fost scris în C++, folosind următoarele clase pentru componentele importante:

  • Folosit pentru debugging
  • Conține funcții pentru trimiterea prin uart a unui caracter/șir de caractere și a unui număr de tip uint8_t/uint16_t

  • Folosit pentru comunicarea cu display-ul
  • Conține funcții pentru pornirea comunicării i2c, scrierea unui octet și oprirea comunicării.
  • De asemenea conține și o funcție pentru găsirea adreselor modulelor i2c conectate, folosită pentru găsirea adresei display-ului

  • Folosit pentru citirea apăsării butoanelor
  • Conține o funcție pentru citirea valorii de pe un pin

  • Conține o reprezentare internă pe biți a display-ului, folosind un array de 1024 de octeți (128 * 64 / 8)
  • Expune funcții pentru afișare, golirea ecranului, desenarea unui pixel și schimbarea unui octet din buffer-ul intern
  • Pentru inițializare, se trimit prin I2C valori conform datasheetului pentru configurarea și aprinderea display-ului
  • Pentru afișare se trimit prin I2C pe rând la adresa 0x40 toți cei 1024 de octeți din buffer-ul intern

  • Conține o funcție care returnează butonul apăsat

  • Conține funcții pentru afișarea pe display a unui caracter/șir de caractere
  • Caracterele sunt de 8×8 pixeli

  • Jocul în sine, conține funcția run(), care pornește loop-ul principal

  • Conține reprezentarea internă a tablei de șah și expune funcții pentru interacțiunea cu aceasta

Jocul este structurat sub forma unui state machine, cu următoarele stări:

Din meniul principal la apăsarea butonului de start, se va începe jocul, trecând în starea SELECTING_PIECE. Jucătorul selectează apoi o piesă folosind cele 4 butoane din stânga ecranului pentru a naviga prin ele și butonul de start pentru a efectua selecția, trecând în starea SELECTING_MOVE. În această stare jucătorul poate naviga prin mutările posibile și selecta o mutare, sau se poate întoarce în starea anterioara, pentru a selecta altă piesă. După efectuarea unei mutări, jocul trece în starea SELECTING_PIECE, de data aceasta pentru celălalt jucător. Când se ajunge la un șah mat sau o egalitate, jocul trece în starea END_SCREEN, unde este afișat rezultatul jocului.

Rezultate Obţinute

Youtube: https://www.youtube.com/watch?v=fld-aEfBZQY

Concluzii

Download

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ă ;-).

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.

Bibliografie/Resurse

Export to PDF