Autorul poate fi contactat la adresa: Login pentru adresa
Proiectul va presupune implementarea unui joc de dexteritate numit “Race Car” utilizand o matrice de LED-uri. Obiectivul jucatorului este sa reziste cat mai mult fara sa intre in coliziune cu marginile sau alte obstacole formate din LED-uri.
Acest proiect evidentiaza metode de interactionare cu cu un microprocesor ATEMEGA si ajuta in aprofundarea notiunilor de programare pe o astfel de platforma.
Ideea de la care am pornit : https://www.youtube.com/watch?v=Tmk837avbVk
Interfata jocului va fi o matrice de LED-uri de dimesiune 8×8 dispuse pe o placa de test separata, iar input-ul va fi realizat prin intermediul a 2 butoane (pentru desplasare). Miscarea in spatiul jocului o reprezinta deplasarea caracterului (un LED la un anumit moment) in stanga sau dreapta.
In cazul in care caracterul intra in coliziune cu celelalte obiecte din jur, pe intreaga suparafata va aparea un semn in forma de X si jocul se va incheia. Insa daca utilizatorul reuseste sa evite obstacole pentru un numar predefinit de ture (setat in cod) pe suprafata matricei va apare un smiley face
Petru a porni un joc nou se apasa butonul reset de pe placa de baza apoi in decurs de 10 secunde butonul de deplasare stanga de pe placuta de test.
Schema este reprezentata prin 4 blocuri principale:
- Alimentare - se face prin USB B la 5V de la laptop
- Placa de baza cu ATEMEGA324
- Input butoane
- Display joc reprezentat printr-o matrice de LED-uri de dimensiune maxima de 8×8 (64 led-uri)
Microprocesorul genereaza traseul, va face verificarea de coliziuni si va asigura comunicarea corecta intre utilizator si joc.
Implemetare :
- “plusul” fiecarui led este conectat la toate celelalte plusuri conectate in linie
- “minusul” fiecarui led este conectat la toate celelate minusuri conectate in coloane
- liniile sunt conectate la pinii unui port al procesorului; la fel si coloanele (cu ajutorul baretelor de pini si cablurilor mama-mama)
- inainte de fiecare linie sunt prezente rezistente de 220 Ohm pentru a nu arde led-urile
- cele 2 seturi de grupari de tranzistoare ULN2003A conectate la fiecare coloana imi limiteaza curentul ce se intoarce pe pinii procesorului. Fiecare e conectat la Vcc si GND
Lista piese :
- componentele din setul de baza - 36 lei
- Placa de test 100×100 - conexelectronic - COD:13233 - 8 lei
- LED-uri 5mm rosu difuz - syscomelco - COD:EL333-2SURD/S53 - 3lei
- LED-uri 3mm verde difuz - syscomelco - COD:LED3GN2MA - 20 lei
- Rezistente 220 - syscomelco - COD:1/4W 220 OHM 5% CF - 3 lei
- 2 x ULN2003A - conexelectronic - COD:7492 - 2 lei
- PUSHBUTTON - comet - COD:TS-06E (TS-3) - 0.66 lei
- Fire conexiune 20CM mama-mama - conex - COD:01134 - 39 lei
- PIN HEADER-e 1×40 P - conex - COD:5239 - 3 lei
- Cablu USB 2.0 A-B, 1.8 m - EMAG - COD:AB2.0-CABLE-141HS - 3,3 lei
- Alte compoenente de rezerva - 70 lei
TOTAL UTIL : 120 lei
Mediu de dezvoltare :
WinAVR - suita de executabile open source pentru Atmel AVR . Include compilatorul GNU GCC pentru C si C++ - download link : [[pm:http://winavr.sourceforge.net/download.html]]
Sublime Text - editor
Windows cmd
HIDBootFlash - bootloader pentru a incarca programul
Biblioteci : avr/io.h, util/delay.h, <stdlib.h>
Code :
Am pornit de la solutia laboratorului 0. In main am facut initializarile necesare : - setare intrari (+ pull-up), iesiri - stingerea tuturor ledurilor - generarea unui numar pseudorandom folosit ca seed pentru a porni jocul de fiecare data de la o configuratie random - apelarea functiei care se ocupa de jocul efectiv Functia generate_game: - generare random a pozitiilor jucatorului si obstacolelor - verificare coliziuni - inaintare obstacole (progress_obstacle() ) - deplasare playerLED stanga-dreapta daca sunt apasate cele 2 butoane - apelarea functiilor de afisare in caz de succes sau esec (print_X_on_leds() si print_smiley_face() )
Pentru a genera un numar random am folosit o variabila pe post de counter care este initializata la RESET. In decurs de 10 secunde daca botunul stang este apasat, counter-ul este intrerupt din a se incrementa la fiecare milisecunda si astfel acea valoare obtinuta la apasarea butonului este folosita ca seed pentrun rand(). Daca nu este apasat butonul stang in acele 10 secunde, jocul va porni automat cu o configuratie standard a obiectelor.
Am realizat atat partea hardware cat si software.
Sunt multumit de rezultatele obtinute, desi nu arata ca in exemplul de pe youtube. Deocamdata m-am limitat prin a reprezenta obstacolele doar de dimensiunea unui led. Numarul de obstacole ce trebuie evitate sunt 3. In continuare as dori sa lucrez mai mult la partea software pentru a da o forma mai complexa obstacolelor, de exemplu dimensiuni mai mari si neregulate .
In continuare atasaez cateva poze cu proiectul final :
A fost o mare placere sa lucrez la acest proiect.
Partea dificila a fost cea in care a trebuit sa imi dau seama de ce componente am nevoie si cum se le potrivesc in schema electrica. A fost pentru prima data cand am lipit componente electronice inasa mi-a facut placere.
Am mai reimprospatat si invatat anumite notiuni legate de electronica.
Am dobandit cunostiinte legate de ce inseamna programarea cu un microcontroler megaAVR ce dispune de resurse limitate.
Acest proiect m-a ajutatat sa inteleg mai bine ce presupune proiectarea unui intreg sistem de calcul ce interactioneaza cu utilizatorii si sa apreciez mai mult pe cei care fac acest lucru. Consider important ca un inginer in calculatoare sa treaca macar o data prin astfel de proiecte.
Am atasat o arhiva .zip ce contine :
fisier sursa : proiectPM.c
Makefile
2 poze cu proiectul final
Schema electrica
README
ghita_cristian_alin_331cc_proiectpm2016i.zip
Fişierele se încarcă pe wiki folosind facilitatea Add Images or other files. Namespace-ul în care se încarcă fişierele este de tipul :pm:prj20??:c? sau :pm:prj20??:c?:nume_student (dacă este cazul). Exemplu: Dumitru Alin, 331CC → :pm:prj2016:avoinescu:dumitru_alin.
Resurse software : a fost suficient site-ul laboratorului de PM : http://cs.curs.pub.ro/wiki/pm/
Resurse hardware : magazinele http://www.conexelectronic.ro/ , http://www.syscomelco.ro/ , http://www.comet.srl.ro/ro/ , http://www.protehno.ro/ , http://ro.farnell.com/ , http://www.emag.ro/