Fiind pasionat de jocuri care solicită creierul, dar și de programare și inginerie, m-am întrebat “Ce aș putea face cu informațiile acumulate până acum?” Răspunsul? Să le pun în practică realizând un proiect ce are la bază un joc pe care îl cunosc prea bine și căruia îi pot aduce îmbunătățiri, anume SUDOKU.
Sudoku este un joc de tip puzzle ce presupune completarea a 9 cadrane, fiecare cu câte 9 căsuțe, cu cifre de la 1 la 9, astfel încât pe linie, coloană și în cadran cifrele să nu se repete. Inițial cadranele nu sunt goale, fiind date câteva valori, iar în funcție de acestea trebuie completate restul de cifre lipsă.
În mod normal Sudoku se joacă pe hârtie, alături de un instrument de scris pentru completare, dar acest proiect vrea să ducă acest joc mai departe, anume în lumea digitală.
Consider că această nouă modalitate de a vedea acest joc îi va face pe cei care nu l-au încercat încă să îi dea o șansă, astfel ajungând să petreacă timpul liber într-un mod constructiv, stimulând logica, memoria și răbdarea. External Link
Listă componente în plus:
De ce nu sunt adăugate?
Datorită numărului mare de pini necesari pentru afișor și, respectiv, modulele de card SD care nu funcționau mereu sau incompatibilitatea bibliotecilor LCD-ului și cardului SD, am decis să nu mai adaug aceste componente în circuit. Probabil în viitor o să încerc să le adaug.
Circuit complet
Componentele vor fi legate în felul următor:
3.3V ------------- VCC_LCD 3.3V ------------- BLK_LCD (LED) GND ------------- GND_LCD 13 ---- 10k ---- CLK_LCD 11 ---- 10k ---- MOSI_LCD 10 ---- 10k ---- CS1_LCD 9 ---- 10k ---- DC_LCD 8 ---- 10k ---- RESET_LCD
CLK, MISO, MOSI și CS sunt necesare pentru a putea folosi protocolul SPI.
Intrările LCD-ului au nevoie de 3.3V, așa că am folosit rezistențe de 10k pentru a limita output-ul din Arduino.
5V ---------- POWER + GND ---------- POWER - GND ---------- INPUT G 6 ---------- INPUT R 6 ---------- INPUT L OUT R+ ---------- SPEAKER1+ OUT R- ---------- SPEAKER1- OUT L+ ---------- SPEAKER2+ OUT L- ---------- SPEAKER2-
Arduino va trimite pe pinul 6 semnalul audio către amplificator. Cu ajutorul potențiometrului poate fi modificat volumul, iar apoi acesta va fi redat pe cele 2 canale, altfel spus cele 2 speakere. Pentru că cele 2 speakere au nevoie de o putere destul de mare (3W), o să folosesc doar un singur speaker.
5V ---------- 5V_Joystick GND ---------- GND_Joystick A0 ---------- VRx_Joystick A1 ---------- VRy_Joystick
Arduino va primi de la joystick poziția acestuia prin pinii A0 și A1 (ADC), apoi în funcție de aceasta ne deplasăm în SUDOKU.
GND ----- 220 --+-- 220 --+-- 220 --+-- 5V | | | BTN_RESET BTN_INC BTN_DEC | | | A2 --+---------+---------+-- 220 -- GND GND ----- 220 --+-- 220 --+-- 220 --+-- 5V | | | BTN_NEXT BTN_PREV BTN_PLAY/STOP | | | A3 --+---------+---------+-- 220 -- GND
Fiecare buton are o cădere de tensiune diferită (divizoare de tensiune). Semnalul ajuns la A2/A3 v-a fi descifrat (ADC), iar în funcție de valoarea primită se va realiza o acțiune (descrise prin denumirile lor). Rezistențele din partea de jos a BTN_DEC/BTN_PLAY/STOP trag la masă voltajul când butoanele nu sunt apăsate.
Mediu de dezvoltare: Arduino IDE 2.3.2
Librării utilizate:
Jocul de SUDOKU este destul de simplu: pui cifre în căsuțe până când toate sunt completate și nu se repetă atât pe linie, coloană, cât și în cadranele mari. O rulare a codului ar trebui să aibă următorul comportament: * Afișare meniu principal * Afișare meniu selecție sudoku * Afișare sudoku ce urmează a fi rezolvat * Mișcarea joystick-ului te mută în sudoku * Apăsarea butoanelor RESET (R), INCREMENT (I) sau DECREMENT (D) aduce modificări asupra cifrei pe care ne aflăm * Apăsarea butoanelor NEXT (N), PREV (P), PLAY/STOP (P/S) aduce modificări asupra melodiilor redate prin speaker
Funcțiile necesare pentru realizarea proiectului ar fi: * funcție ce verifică dacă sudoku este rezolvat complet * funcție care redă melodie * funcție care afișează sudoku * funcție care analizează mișcarea joystick-ului și te mișcă în sudoku * funcție care analizează apăsarea butoanelor care modifică sudoku și execută comanda * funcție care analizează apăsarea butoanelor care modifică melodia și execută comanda * funcție care afișează timer pe LCD
Din lipsa timpului, nu am reușit să integrez și partea de timer, dar celelalte funționalități există.
Afișarea pe LCD
Butoanele și Joystick-ul
Verificarea completării Sudoku-lui
Dificultățile cele mai mari au fost datorate legăturilor hardware care ori mai aveau nevoie de ceva (LCD-ul lucrează pe 3v3, caz în care a trebuit să bag rezistențe) ori le-am pus unde nu trebuia (citire pin greșit).
În cazul software, la butoane verificam interval diferit de cel real, iar la LCD poziție greșită de afișare datorată calculului eronat.
Pentru a determina intervalele bune pentru butoane, dar și pozițiile joystick-ului, am folosit seriala, altfel spus am afișat mesaje cu valorile citite pe pini, pe care apoi le-am folosit în cod.
În cazul LCD-ului am stat și am numărat pixelii afișați încât să pot determina pozițiile bune.
Afișajul LCD-ului este unul viu colorat, cifrele se văd bine și îți dai seama unde te afli în Sudoku.
Muzica este o noutate, care te face să nu te simți singur, fiind un joc de o persoană.
Combinația dintre LCD, butoane și joystick au transformat jocul original într-o variantă asemănătoare cu cel de pe telefoanele noastre.
Proiectul a fost interesant din punctul de vedere că am putut să punem în practică ceea ce am făcut în cadrul laboratoarelor, dar mai ales că am putut și interacționa fizic cu componentele.
Împletirea dintre hardware și software a dus la crearea unui produs unicat care mi-a făcut plăcere să îl realizez, în ciuda timpului care a trecut foarte rapid.
Mi-am demonstrat că pot să fac ceva cu informațiile dobândite pe parcursul acestor ani de facultate.
Dificultățile cele mai mari au apărut datorită compatibilității pieselor, care are fiecare nevoie de anumiți pini, astfel reducând numărul acestora, dar și în software când librăriile nu voiau să lucreze împreună (cardul SD cu LCD-ul).
Totalizând, experiența a adus o nuanță de noutate, pe lângă majoritatea temelor care presupun doar să scrii cod.
Componentele au fost achiziționate de la:
Software: