Nume: Olaru Alexandru Grupa: 336CA
Schema electrica:
Matrice Led:
Modul Joystick:
Buzzer:
Potentiometer:
Structura codului arată astfel:
void setup() { initialize(); display_snake_message(message_snake); }
void loop() { /* Generate food on the display */ generate_food(); /* Scan joystick input and move the snake */ scan_input(); /* Snake movement */ move_snake(); /* Check and handle game over situation */ check_game_over(); }
Implementare:
Citirea input-ului de la joystick (valorile X si Y) este făcută folosind ADC:
uint8_t adc_read(uint8_t pin) { /* Select ADC channel (pin) for conversion */ ADMUX = (ADMUX & 0xF0) | (pin & 0x0F); /* Start the conversion */ ADCSRA |= (1 << ADSC); /* Wait for the conversion to complete */ while (ADCSRA & (1 << ADSC)); /* Return the result */ return ADCH; }
Pentru a aprinde și a stinge led-urile matricei, am folosit funcții din biblioteca https://github.com/wayoda/LedControl, după mai multe încercări de a implementa această funcționalitate ”de mână”, folosind SPI (Serial Peripheral Interface), care este de asemenea folosit și în funcțiile bibliotecii, într-o modalitate asemanătoare cu cea prezentată mai jos:
void send_data(uint8_t address, uint8_t value) { digitalWrite(CS, LOW); /* Send address */ SPI.transfer(address); /* Send value */ SPI.transfer(value); /* Finish transfer */ digitalWrite(CS, HIGH); }
Astfel, pinul Chip-Select (CS) este configurat, trimițându-se mai apoi prin SPI adresa registrului lui MAX7219 al matricei de leduri, precum și valoarea dorită. Dacă se dorește aprinderea sau stingerea led-urilor, conform specificațiilor din datasheet (https://www.analog.com/media/en/technical-documentation/data-sheets/max7219-max7221.pdf), adresa va fi un număr de la 1 la 8, reprezentând linia din matrice pe care se vor aplica modificări, iar valoarea un număr de la 0 la 255, indicând ce led-uri vor fi aprinse, respectiv stinse.
UPDATE: Versiunea finală a proiectului o puteți observa în următorul demo: https://www.youtube.com/watch?v=qB7Kzn-Cgeg&t=4s&ab_channel=AlexandruOlaru
În concluzie, am reușit sa creez ceva asemanator unei mini-console portabile mai vechi cu manetă, pe care se poate juca doar jocul Snake. Viteza de joc, adică de deplasare a șarpelui, poate fi setată cu ajutorul rotiței potențiometrului, în acest sens putând fi schimbata dificultatea jocului. Este un proiect care va putea fi folosit și în viitorul îndepărtat, atunci când ți se face dor sa rejoci unul din jocurile alături de care ai copilărit.
Resurse Hardware:
Resurse Software: