Color Sudoku

Introducere

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.

Descriere generală

Partea hardware este alcatuita din 3 placute:

  1. Placuta de baza, cu microcontroller-ul ATMega16, realizata in etapa I
  2. Placuta de interfatare cu ecranul Nokia 6100, care cuprinde:
    • divizoare de tensiune pentru logica pe 3,3V (necesara pinilor de SPI pentru LCD)
    • stabilizator de tensiune pentru asigurarea tensiunii de alimentare de 3,3V
    • 6 butoane de interactiune cu ceea ce este afisat pe ecran:
      • 4 butoane pentru directie : UP, DOWN, LEFT, RIGHT
      • buton de RESET
      • buton ENTER
  3. Placuta cu LCD-ul color Nokia6100, legata numai de placuta de interfatare
    • De aceasta placuta sunt legate si 4 baterii de 1.5V, pentru alimentarea circuitului de backlight al LCD_ului (altfel nu se aprinde ecranul).

Mod de interactiune:

  • Semnalele de comanda de la microcontroller (logica pe 5V)catre LCD trec prin placuta de interfatare.
  • Input-ul de la jucator se ia prin intermediul celor 6 butoane. Microcontroller-ul interpreteaza semnalele primite de la butoane si trimite LCD-ului comenzile corespunzatoare pentru modificarea afisajului pe ecran, daca este cazul.

Hardware Design

Lista de piese

  • LCD Nokia 6100 132×132 cu controller Philips
  • Pentru alimentare LCD:
    • stabilizator de tensiune LM1117
    • condensator 100nF
    • condensator 10 uF
    • 4 baterii de 1,5V
  • Pentru logica pe 3,3V:
    • 4 rezistente de 1,8 KOhmi
    • 4 rezistente de 3,3 KOhmi
  • Pentru partea de interactiune cu jucatorul:
    • 6 push buttons
    • 6 condensatoare de 1nF
    • 6 rezistente de 10 KOhmi
  • 22 de fire de legatura si mufele aferente

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.

Schema folosita pentru simulare:

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.

Schema din care s-a obtinut circuitul pentru PCB:

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.

Software Design

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:

  • desenare linie
  • desenare background
  • desenare grid
  • desenare meniuri

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.

Logica jocului

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.

Rezultate Obţinute

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.

Concluzii

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.

Hardware

In principiu circuitul a fost bine proiectat. Mi-a luat mult sa verific conexinile intre placute (daca sunt legati intre ei pinii care trebuie).

  • Initial legasem VLED+ la 5V, in speranta ca poate si asa se vor aprinde backlights; dupa ce am constatat ca nu se aprinde ecranul am incercat sa il leg la 6 V si a mers.
  • Pinii LCD-ului sunt FOARTE fini, fiind nevoie mai intai de montarea unui conector special (de la un service GSM) ca apoi sa fie montat pe placuta. Concluzie: interfatarea unui display de Nokia 6100 ESTE posibiila, dar dificila; mai degraba se apeleleaza direct la un specialist sau se da comanda de un display gata montat pe placuta (Sparkfun).
Software

La partea de software debugging-ul a durat ceva mai mult.

  • Delay-ul dintre comenzi. Initial nu lasasem destul delay si display-ul nu avea timp sa proceseze comanda pana cand primea comanda urmatoare. Prin urmare, nu se aprindea deloc (eram gata sa trag concluzia ca display-ul e ars). Introducerea unui delay intre comenzi (10 ms) a rezolvat aceasta problema.
  • Partea de SPI. Am incercat sa fac comunicarea prin SPI ca in laborator (folosind facilitatile microcontroller-ului), insa pe simulare nu a mers astfel. Prin urmare am preferat varianta din API, in care sunt simulate ceasul si shiftarea bitilor. De mentionat ca Philips controller suporta un SPI pe 9 biti, adica trebuie specificat daca i se trimite o comanda sau doar date prin primul bit (0 pentru pentru comanda, 1 pentru date).
  • E greu cu orientarea axelor; primitivele de desenare nu mergeau bine din aceasta cauza, dar pana la urma am “potrivit” coordonarea logica, in program, a jocului cu coordonarea pe ecran (ca pozitii in spatiul 2D).
  • Segmentul de date nu e foarte mare. Din aceasta cauza, tabela care descria caracterele nu incapea in acel segment. A trebuit sa o mut in segmentul program si sa folosesc memcpy_P ca sa am acces la date.

Download

Simularea si schema pentru PCB:

placuta.zip

Proiectul in AVRStudio:

colorsudoku.zip

Jurnal

Bibliografie/Resurse

pm/prj2012/abostan/7.txt · Last modified: 2021/04/14 17:07 (external edit)
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