Autorul poate fi contactat la adresa: Login pentru adresa
Proiectul consta in implementarea jocului single-player Minesweeper. Acesta va fi afisat pe LCD si va fi controlat prin butoane, ambele componente aflandu-se pe o placuta de test.
Scopul jocului este reprezentat de selectarea casutelor care nu contin bombe(fie sunt goale, fie contin un anumit punctaj).
La selectarea unei bombe, difuzorul va scoate un zgomot specific, iar scorul va fi afisat utilizatorului. De asemenea se va incerca un afisaj cu LED-uri pentru scor. Vor exista mai multe nivele, dificulatatea fiind diferita in functie de numarul de bombe ascunse.
Am ales sa implementez acest joc pentru ca mi-a placut tare mult in timpul copilariei, iar lucrul depus pe pacursul semestrului as vrea sa insemne un punct de start pentru mine in acest domeniu.
1. Pe LCD se va afisa starea jocului
2. Cele 6 butoane pe care utilizatorul le are la dispozitie se vor folosi astfel: 4 butoane pentru deplasare stanga, dreapta, sus, jos, 1 buton pentru a marca o casuta care se considera ca ascunde bomba, 1 buton pentru a vizualiza casuta dorita
3. Difuzorul va reda un sunet specific la finalul jocului
4. Afisaj cu LED-uri pentru scor
Componente | Canritate |
---|---|
Placa de baza ATMEGA324 | 1 |
Placa de test pentru motarea LED-urilor si butoanelor | 1 |
Modul LCD ST7735 | 1 |
Difuzor de 1 W | 1 |
Butoane | 6 |
Afisaj cu LED Rosu de 4 Cifre cu Catod Comun de 0.36'' 3641AS | 1 |
Modul cu Stabilizator de 3.3 V | 1 |
Pentru programare s-a folosit mediul de dezvoltare Atmel Studio 7, pentru scrierea codului propriu-zis, si AVRDude pentru a scrie fisierul .hex in memoria microcontrollerului.
Implementarea Afisaj cu LED Rosu de 4 Cifre cu Catod Comun se afla in 7seg.c. Cum acest display are 12 pini, 4 pentru cifre si 8 pentru segmente. La un moment dat se poate afisa doar 1 cifra, asa ca pentru a aparea un scor mai mare pe ecran, se afiseaza cifrele secvential, rapid, fara delay intre ele, de suficient de multe ori (~500, pentru a persista pe afisaj).
Implementare joc minesweeper se afla in minesweeper.c si foloseste bibliotecile si functiile din laboratorul 5. Am folosit intensiv functiile de formatare a unui dreptunghi (casutele jocului), a unui cerc (cursorul) si de scriere pe ecran. Initial, jocul afiseaza numele si grupa, apoi urmeaza speaker-ul, care ofera o melodie asemanatoare celei din tetris, pentru ca mi s-a parut mai ritmata. Dupa ce melodia se termina, jucatorul trebuie sa apese butonul de start. Pentru a accesa mai usor o celula, am construit o structura Cell, ce contine coordonata x, coordonata y, 1 daca ascunde bomba (0 altfel), nr = numar de puncte (-1 altfel, adica casuta este goala) si culoarea (0 negru, 1 albastru, 2 galben). Tabla de joc este retinuta intr-o matrice de Cell-uri.
Exista mai multe niveluri de joc, dificultatea constand in numarul de bombe generate aleator. La primul nivel exista 10. De asemenea, punctele ascunse in patratele sunt generate aleator si exista si patratele goale. Cercul mic, desenat de fiecare data in centrul patratelei pe care se afla jucatorul este cursorul, pentru a afla coordonatele curente. La miscarea cursorului, se redeseneaza cerculetul pe celula noua si se sterge de pe celula veche. La apasarea butonului de flag, se coloreaza celula in galben (acesta buton functioneaza ca un hint pentru jucator, informandu-l ca acolo poate fi bomba). La apasarea butonului de select, se verifica ca celula ascunde bomba, caz in care se afiseaza toate bombele, dufuzorul genereaza un alt sunet, se afiseaza un mesaj cu “You lost” si se reia jocul de la capat. Scorul trebuie sa fie afisat pe 7 Segment Display, insa cum s-a ars in ultima zi, l-am afisatdoar pe LCD.
Daca jocul este terminat cu succes, acesta trece la nivelul urmator, crescand numarul de bombe cu 2, distribuite aleator din nou. Am folosit si un stabilizator, care converteste o tensiunde de 5v la una de 3.3v, insa a realizat pe parcurs ca nu am nevoie de el, intrucat nu se vedeau culorile intens pe LCD-ul cu SPI si Controller, ST7735.
Proiectul este unul functional, cu mentiunea ca in ultima zi s-a ars afisajul cu LED rosu de 4 cifre cu catod comun, insa am ajuns sa il pot controla, dupa cum se vede in poza. Jocul are toate functiile care se gasesc si in proiectarea initiala: punerea de flag-uri in celulele in care se crede ca ar fi o bomba, afisarea tuturor bombelor atunci cand este selectata una, generare de numere random si casute goale, la fiecare nivel.
A fost un proiect tare interesant, care m-a invatat sa implementez atat partea de hardware cat si partea de software pentru un produs nou. Desi initial parea destul de neintuitiva conectarea perifericelor, la final s-a dovedit doar o chestie de timp si cercetare, din care am invatat cu placere.
A fost primul proiect construit de la zero care mi-a adus destul de multe satisfactii, avand in vedere ca, pana si nepotul meu se joaca cu el. }
20 aprilie 2018 Research facut inainte de a alege tema proiectului.
21 aprilie 2018 Deadline Milestone1, stabilirea temei proiectului, aprobată de asistent.
27 aprilie 2018 Hardware placa de baza, realizata si acasa, pentru ca nu am apucat sa termin la laborator.
4 mai 2018 Deadline Milestone2, completare sectiunii Hardware cu componentele si cantitatile necesare.
5 mai 2018 Deadline Milestone3, schema proiect realizata in easyEDA si validarea ei de catre asistent.
7 mai - 20 mai 2018 Hardware placuta de test, lipire periferice, realizare conexiuni. Am intampinat probleme la lipirea afisajului pentru scor si la conectarea LCD-ului.
21 mai - 25 mai 2018 Implementare software si documentatia finala. Am intampinat dificultati in a gasit bibliotecile potrivite tipului meu de LCD, insa am folosit ulterior cod din laboratorul 5.
25 mai 2018 Afisajul pentru scor s-a ars. :(