Sudoku
Introducere
Proiectul propune implementarea jocului Sudoku pe un microcontroller Arduino, redat pe un display LCD. Jucatorul se va putea misca intre celule folosind un joystick, iar cifrele vor fi introduse folosind o tastatura numerica.
Scopul proiectului este de a imbina cunostinte hardware si software, dar si de a crea un joc lejer, de tip puzzle care iti testeaza abilitatile logice.
Descriere generală
Jocul de Sudoku, in forma clasica, are urmatoarele reguli:
Tabla de joc este o grila de 9×9 celule, impartita in subgrile de 3×3.
O celula poate tine o cifra de la 1 la 9.
Toate cifrele dintr-o subgrila trebuie sa fie distincte.
Toate cifrele de pe un rand trebuie sa fie distincte.
Toate cifrele de pe o coloana trebuie sa fie distincte.
Initial, jocul pleaca de la o grila completata partial (anumite celule contin deja cifre) iar jucatorul nu le poate schimba pe acestea.
Un Sudoku este considerat complet atunci cand toate celulele contin cate o cifra si toate regulile jocului sunt respectate.
Jucatorul va naviga intre celule folosind joystick-ul si le va scrie o cifra in celula folosind tastatura numerica. Pe ecranul LCD se va afisa grila jocului.
Hardware Design
Lista de piese
Microcontroller Arduino Nano (ATmega328P).
Ecran 1.8” LCD (128×160).
Joystick.
Tastatura numerica 4×4.
Breadboard, rezistori, fire.
Schema electrica
Decizii luate
Pentru ecranul LCD, am ales sa pun VCC la 5V pentru alimentare, iar pe LED l-am pus la pinul D6 pentru a regla luminozitatea ecranului folosind PWM. Am conectat restul pinilor conform datasheet-ului ecranului.
Pentru VRX si VRY ale joystick-ului, puteam sa aleg oricare doi pini analogici, si le-am legat la A0 si A1, ground la ground si VCC la 5V.
Pentru tastatura, la fel, aveam de ales oricare 4 pini digitali si 4 pini analogici.
Imagini
Software Design
Diagrama de Flux
Implementare
Ca mediu de dezvoltare, am lucrat in Arduino IDE.
Pentru a controla mai usor functionalitatile perifericelor, am folosit bibliotecile 3rd-party TFT.h, SPI.h pentru ecranul LCD si Keypad.h pentru tastatura numerica.
Pentru a reda grafici pe ecran, am scris functiile draw_start_menu, draw_grid, draw_subgrids, draw_cursor care deseneaza meniul de start, grila principala de 3×3, celulele si respectiv cursorul.
Functia select_board copiaza in tabla activa, o tabla dintr-o lista predefinita. Am ales sa pun si o tabla suplimentara care are doar doua celule libere, pentru a testa functiile scrise.
Functia read_joystick citeste valorile trimise de joystick si muta cursorul in directia specificata cat timp nu iese din tabla de joc.
Functia write_digit scrie in tabla de joc activa cifra care a fost introdusa de jucator. Tasta '0' sterge o cifra dintr-o celula care nu este fixa.
In final, check_board verifica daca tabla de joc activa este completa si respecta toate regulile jocului.
Pentru a cronometra timpul de la inceputul jocului si pana la castigarea acestuia, am folosit timer-ul intern al microcontroller-ului. Prin functia millis am calculat diferenta de timp intre fiecare executie a functiei loop iar la final am scazut momentul de start din momentul curent, pentru a calcula durata totala.
Rezultate Obţinute
Rezultatul proiectului este un dispozitiv hand-held pe care se poate juca Sudoku.
Concluzii
Proiectul a fost interesant de realizat, am invatat sa lucrez cu functiile din bibliotecile pentru LCD si keypad, dar si cum sa aranjez componentele astfel incat la final sa am un produs functional si util. Pe partea de software, provocarea a fost sa scriu cod care ocupa cat mai putin spatiu, dar in acelasi timp sa fie calitatativ si lizibil.
Download
Jurnal
22/04/2024 - Alegerea proiectului, aprobare.
23/04/2024 - Comandarea componentelor.
29/04/2024 - Pagina de wiki initiala.
09/05/2024 - Hardware design.
16/05/2024 - Software design.
18/05/2024 - Finalizare pagina.
Bibliografie/Resurse