Autorul poate fi contactat la adresa: Login pentru adresa
Proiectul reprezintă versiunea electronică a jocului “Nu te supara, frate!” cu 2 jucatori, cu mici modificari.
Vor exista 2 jucatori: RED si GREEN. Cei patru pioni ai fiecarui jucator vor fi simulati prin led-uri in culorea specifica (rosu sau verde). Aruncarea zarului va fi simulata la apasarea unui buton si numarul generat va fi afisat pe display.
La inceput, in dreptul fiecarui jucator se vor lumina 3 led-uri in cercurile colţului “B” (cele 4 led-uri separate de restul matricii) şi un led în cercul “A” (led-ul cel mai din stanga pe prima coloana). Scopul jocului este de a înconjura planşa de joc cu cei patru pioni pentru a ajunge cu toţi pionii în cerculeţele “1”, “2”, “3”, “4” ale culorii corespunzatoare jucatorului.
Cele 4 cercuri finale nu sunt asezate conform jocului original, pozitionarea lor este ca in imaginea de mai jos. Datorita acestei modficari, in cadrul jocului a aparut urmatoarea regula:
Nume piesa | Numar piese | Obs |
---|---|---|
Placa de bază cu ATMega324A-PU | 1 | |
LED 7 SEGMENTE | 1 | https://electroniclight.ro/lsd056aue-101b-afisaj-led-7-segmente-142mm-rosie-11mcd-catod-comun/7859.htm |
Rezistente | 14 x 470 (led-uri) , 8 x 1k ( led 7 segmente ) | |
LED | 40 | https://www.optimusdigital.ro/ro/optoelectronice-led-uri/483-led-rgb-catod-comun.html?search_query=led+rgb&results=65 |
Butoane | 11 | https://electroniclight.ro/mf4308-push-buton-6x6x7mm/1722.htm |
Shift Register | 3 | http://ro.farnell.com/nexperia/74hc595d/ic-74hc-cmos-smd-74hc595-soic16/dp/1201269?st=shift%20register |
Fiecare jucator se va pozitiona pe tabla de joc folosind cele 4 butoane: UP, DOWN, LEFT, RIGHT. Dupa alegerea unui pion, il va selecta folosind butonul SELECT corespunzator. Simularea zarului se face la apasarea butonului DICE, iar numarul va fi afisat pe display.
Pentru ca numarul de porturi necesare controlarii ledurilor a fost de departe insuficient, catodurile comune ale ledurilor RGB de pe aceeasi linie au fost legate intre ele, iar anodurile corespunzatoare fiecarei culori au fost legate pe coloane. Numarul de porturi disponibile fiind in continuare prea mic, am folosit registre de deplasare 74HC595 astfel:
Functia ludo() este cea care simuleaza rularea jocului: se verifica butonul apasat si jucatorul se va muta pe tabla in vederea selectiei pionului sau se apeleaza functiile corespunzatoare:
int digitArray[7] = {0b00000000, 0b10000100, 0b11010011, 0b11010110, 0b10110100, 0b01110110, 0b01110111}; void roll_the_dice(void) { dice = rand() % 6 + 1; PORTC = digitArray[dice]; }
Mai jos se gasesc functiile de manipulare a matricei de led-uri folosind registrele de deplasare:
void load_bit_to_register_1(unsigned int bit) { /* Set bit */ if (bit == 1) PORTA |= (1 << PA2); else PORTA &= ~(1 << PA2); _delay_us(10); /* Load bit - clk front crescator */ PORTA |= (1 << PA0); _delay_us(10); /* Reset clk */ PORTA &= ~(1 << PA0); }
/* Incarca in registru cei doi biti * corespunzatori aprinderii unui led */ void load_color_of_led(unsigned int R, unsigned int G) { load_bit_to_register_1(G); load_bit_to_register_1(R); }
/* Incarcare coloana curenta */ void load_LEDS_column_colors_for_given_row(int row) { int i = 6; /* Dezactivare latch */ PORTA &= ~(1 << PA1); /* Incarcare coloana in registru de deplasare */ while (i > -1) { int color = mat[row][i]; if (color == RED) { load_color_of_led(1, 0); } else if (color == GREEN) { load_color_of_led(0, 1); } else if (color == YELLOW) { load_color_of_led(1, 1); } else { load_color_of_led(0, 0); } i--; } /* Activare latch */ PORTA |= (1 << PA1); }
/* Afisare matrice */ void print_game_matrix(void) { int i; /* Incarcare linii si coloane * corespunzatoare fiecarei linii */ for (i = 0; i < 7; i++) { PORTA &= ~(1 << PA4); int j = 6; while (j > -1) { if (j == i) { load_bit_to_register_2(0); } else { load_bit_to_register_2(1); } j--; } load_LEDS_column_colors_for_given_row(i); PORTA |= (1 << PA4); } }
Lipirea tuturor pieselor a necesitat mult mai mult timp si atentie decat am crezut initial. Am petrecut peste 16h pentru a termina partea de hardware, cu tot cu ajutorul de care am avut nevoie pentru lipirea firelor. Partea de software a durat si ea destul de mult timp, a trebuit sa ma joc putin cu aprinderea ledurilor pentru a-mi da seama cum folosesc registrele de deplasare inainte de a scrie implementarea propriu-zisa.
Proiectul este final si indeplineste toate cerintele specificate.