Proiectul permite rularea unui joc Sudoku 8×8 folosind culori in loc de cifre. Jocul are 3 nivele de dificultate si, de asemenea, se poate alege si grupul de 8 culori care vor fi plasate pe grid. In memorie sunt salvate 2 jocuri si 3 scheme de culori pentru fiecare nivel de dificultate.
Initial m-am gandit sa fac un proiect folosind LED-uri RGB, pentru ca mi s-a parut ca se pot obtine efecte spectaculoase cu destul de putin efort. Am vrut sa folosesc o matrice 8×8 de LED-uri RGB. Asistentul de laborator mi-a sugerat sa folosesc insa un ecran color, Nokia 6100, pentru ca este mai usor de controlat, in final ramanand pe aceasta varianta.
Partea hardware este alcatuita din 3 placute:
Mod de interactiune:
LCD-ul de Nokia l-am cumparat de la un service GSM (se poate da comanda destul de usor). Pentru ordinea si functionalitatea exacta a pinilor se pot consulta referintele. Cei mai importanti pini, pe langa VCC si GND, sunt cei pentru SPI (RESET, DATA, CLK si CS) si VLED+ si VLED-; la VLED+ trebuie minim 6V, iar VLED- se conecteaza la masa. Pentru a furniza acei 6V, am legat 4 baterii X 1.5V in serie. Semnalele de la microcontroller pot avea valori intre 0 si 5V, insa ecranul nu poate primi decat semnale intre 0 si 3,3V. Conversia din logica pe 5V in logica pe 3,3V pentru pinii RESET, DATA, CLK si CS ai ecranului se face folosind divizoare de tensiune, cu rezistente de 1,8 si 3,3 KOhmi. Butoanele sunt prevazute fiecare cu cate o rezistenta de pull-up (cele din microcontroller se considera a fi insuficiente) si un condensator pentru uniformizarea semnalului de la buton.
Am ales sa fac circuitele folosind placute imprimate. Pentru simularea proiectului si realizarea circuitelor pentru PCB am folosit Proteus ISIS si Ares.
Am gasit un modul pentru simularea unui ecran Nokia 6100 in Proteus ISIS. Simularea difera insa destul de mult de ceea ce s-a obtinut efectiv, practic. Cu toate acestea, este utila pentru a stabili ordinea in care se dau comenzile de initializare si a vedea daca functioneaza primitivele de desenare.
In Proteus nu exista butoane care sa aiba si schema pentru PCB, astfel ca am ales sa pun in locul lor un grup de 6 pini, estimand dimensiunile unui buton. Cand am obtinut placuta efectiv, am vazut ca nu estimasem prea bine (a trebuit sa mai apropii pinii butonului ca sa ii fixez pe placa), dar in final am reusit sa plasez si butoanele.
Am dezvoltat partea soft a proiectului folosind AVR Studio 5 si folosind functii din 2 API-uri (vezi Bibliografie/Resurse): - unul pentru partea de comunicare cu LCD-ul (simulare SPI, comenzi de initializare) - celalalt pentru partea de desenare efectiva pe ecran (am imprumutat matricea de font-uri si functiile de desenare caracter si desenare sir de caractere).
Comunicarea cu LCD-ul se realizeaza folosind SPI pe 9 biti, simulat software deoarece SPI-ul de pe microcontroller este pe 8 biti. API-ul mi-e furniza primitive de trimitere comenzi si trimitere date. Folosind datasheet-ul controller-ului Philips al LCD-ului, am folosit comenzi de initializare si de scriere potrivite aplicatiei.
Pentru partea de afisare pe ecran, am definit o primitiva de desenare dreptunghi (doar conturul unui dreptunghi sau un dreptunghi umplut cu o culoare). De asemenea, am preluat din API primitivele de desenare caractere. Pe baza acestora am construit functii specifice aplicatiei:
Aplicatia afiseaza pe ecran mai multe imagini, acestea reprezentand meniuri sau jocuri. In segmentul de date se retine efectiv numai o matrice 8×8 cu cifre de la 1 la 8, fiecare avand o culoare corespondenta. Imaginile se creeaza dinamic si se transmit pixel cu pixel. Nu se retransmite imaginea daca este nevoie doar de o mica modificare in ea (exemplu: deplasarea cursorului), ci se modifica (se retransmite) doar o portiune mica din imagine (ex. zona in care e desenat cursorul) - controller-ul Philips permite acest lucru, prin specificaea adreselor de inceput si sfarsit linie sau coloana.
La inceput, pe ecran apare meniul principal, cu 3 optiuni: Start game, Difficulty si Choose Color Scheme. Folosind butoanele UP si DOWN, jucatorul poate naviga prin meniu si poate alege dificultatea jocului si schema de culori folosita. Pentru inceperea jocului, se va apasa ENTER in dreptul optiunii Start Game. Dupa aceasta, pe ecran se va afisa grid-ul jocului, cu cursorul de selectie a casutelor in dreptul primeia. Folsind butoanele UP, DOWN, LEFT, RIGHT, jucatorul poate deplasa cursorul pe grid. Dupa ce a ales o casuta pe care sa o completeze, jucatorul apasa RESET pentru a accesa meniul GAME OPTIONS. De aici poate alege sa restarteze jocul, sa iasa din joc intorcandu-se in meniul principal sau sa aleaga o culoare pentru a completa casuta de pe grid. O data aleasa o culoare, afisajul se intoarce la grid-ul jocului, jucatorul putand plasa culoarea respectiva intr-o casuta apasand ENTER.
Partea de logica efectiva a jocului urmeaza schema unui automat finit. Sunt trei stari principale: REGULAR_MENU, GAME_STATE si CHOOSE_COLOR. In fiecare stare se verifica input-ul de la butoane (cele care ar trebui sa fie active in acea stare) si, daca a fost apasat un buton, atunci programul realizeaza actiunile corespunzatoare. De exemplu, in starea REGULAR_MENU_STATE, daca s-a apasat ENTER, atunci se verifica ce optiune a fost selectata si se trece ori in alt meniu, ori la afisare joc, ori se modifica anumiti parametri ai programului.
Proiectul este functional, am obtinut un joc distractiv si frumos colorat. Trebuie avut grija cum se apasa pe butoane (microcontroller-ul este sensibil si daca se tine mai mult timp apasat un buton, atunci se va naviga prea rapid prin meniuri sau pe grid). Comunicarea cu LCD-ul a fost realizata cu succes, desi uneori nu se vede bine pe ecran sau nu se deseneaza corect primitivele (cazuri rare). Caracterele nu sunt desenate prea frumos, probabil trebuie schimbata matricea de font-uri.
Proiectul a fost unul interesant, aparent simplu. Am invatat cum sa interfatez un ecran color Nokia 6100, atat hardware, cat si software si am obtinut un joc distractiv.
In principiu circuitul a fost bine proiectat. Mi-a luat mult sa verific conexinile intre placute (daca sunt legati intre ei pinii care trebuie).
La partea de software debugging-ul a durat ceva mai mult.