This is an old revision of the document!
Proiectul consta in implementarea unui slot machine functional pe placa de dezvoltare ATmega328P Xplained Mini. Ideea a pornit de la dorinta de a crea un joc interactiv care sa semene cat mai mult cu aparatele de tip pacanea din viata reala, folosind componente hardware accesibile si microcontrollerul AVR pe 8 biti.
Proiectul afiseaza animatii de spinning cu simboluri colorate pe un ecran TFT color de 1.8 inch, reda sunete realiste prin un modul MP3 dedicat (DFPlayer Mini) si ofera feedback vizual prin butoane arcade iluminate. Jucatorul poate alege miza, poate roti rolele si poate participa la un mini-joc de tip “Red or Black” dupa fiecare castig, exact ca la aparatele reale.
Scopul proiectului este sa demonstreze utilizarea eficienta a perifericelor microcontrollerului ATmega328P (SPI, UART, GPIO, Timere, PWM, EEPROM) intr-un produs fizic interactiv si atractiv vizual.
Proiectul este util ca exemplu de integrare hardware-software pentru aplicatii embedded cu interfata grafica, sunet si interactiune cu utilizatorul.
Proiectul este structurat in mai multe module hardware si software care interactioneaza intre ele:
Modulul de afisare - Display TFT color 1.8 inch (ST7735S) conectat prin interfata SPI. Afiseaza simbolurile rolelor, animatia de spinning, creditele curente, miza selectata si mesajele de castig/pierdere.
Modulul de sunet - Modul DFPlayer Mini conectat prin UART (TX/RX). Citeste fisiere MP3 de pe un card microSD si le reda printr-un difuzor de 8 ohmi. Produce sunete diferite pentru spinning, castig, pierdere si jackpot.
Modulul de control - 4 butoane arcade iluminate (2 galbene, 2 verzi) conectate pe pinii GPIO ai microcontrollerului. Butoanele SPIN si BET+ sunt folosite in jocul principal, iar butoanele RED si BLACK sunt folosite in mini-jocul “Double or Nothing”.
Modulul de logica a jocului - Implementat in software pe ATmega328P. Gestioneaza starea jocului, genereaza numere aleatoare pentru simboluri, calculeaza castigurile si coordoneaza toate celelalte module.
Modulul de stocare persistenta - Memoria EEPROM interna a ATmega328P salveaza creditele curente si statisticile jocului (total spinuri, cel mai mare castig) chiar si dupa deconectarea alimentarii.
Schema bloc a interactiunii dintre module:
| Componenta | Cantitate | Rol in proiect |
|---|---|---|
| ATmega328P Xplained Mini | 1 | Microcontroller principal |
| Display TFT color 1.8” ST7735S | 1 | Afisarea jocului si animatiilor |
| Modul DFPlayer Mini (TF-16P) | 1 | Redare sunete MP3 realiste |
| Difuzor ultra-slim 40mm 8 ohm 0.5W | 1 | Iesire audio |
| Card microSD (8GB) | 1 | Stocare fisiere audio MP3 |
| Buton arcade 24mm galben | 2 | Butoane RED si BLACK (mini-joc Double or Nothing) |
| Buton arcade 24mm verde | 2 | Butoane SPIN si BET+ (joc principal) |
| Breadboard 830 puncte + fire dupont | 1 | Conexiuni hardware prototip |
| Rezistenta 1K ohm | 1 | Protectie pin RX DFPlayer Mini |
Nota: LED-urile integrate in butoanele arcade necesita DC 12V si nu sunt folosite in acest proiect.
Proiectul a fost dezvoltat folosind:
Codul este organizat modular in 4 perechi de fisiere header/sursa:
Debounce non-blocant: Fiecare buton are o structura proprie cu timestamp-ul ultimei schimbari de stare. La fiecare apel buttons_update() se verifica daca au trecut 40ms de la ultima schimbare — daca da, starea e considerata stabila. Flagul de edge e setat o singura data per apasare si consumat de game_run().
Masina de stari FSM: Jocul trece prin stari definite in enum GameState. Fiecare stare raspunde doar la evenimentele relevante ei, eliminand comportamente nedorite. Tranzitiile sunt clare si loggate prin Serial pentru debug.
Generator de numere pseudo-aleatoare: Seed-ul este generat la pornire din zgomotul analogic al pinului A0 (flotant) XOR cu micros() XOR cu creditele din EEPROM, pentru a asigura secvente diferite la fiecare pornire.
Probabilitati simboluri (din 20):
Animatie spinning cu decelerare: Primele SPIN_FRAMES-5 cadre ruleaza la interval constant (55ms). Ultimele 5 cadre incetinesc progresiv cu +35ms per cadru, simuland decelerarea rolelor reale.
Persistenta EEPROM: Creditele, numarul total de spinuri si cel mai mare castig sunt salvate in EEPROM la fiecare spin. La pornire se verifica un magic number (0xABCD) pentru a detecta primul boot si a initializa valorile default.
Tabel de castiguri:
| Combinatie | Multiplicator | Castig la miza 5 |
|---|---|---|
| 7 - 7 - 7 | x20 (JACKPOT) | 100 credite |
| BAR - BAR - BAR | x10 | 50 credite |
| STAR - STAR - STAR | x5 | 25 credite |
| 3x acelasi simbol | x3 | 15 credite |
| 2x acelasi simbol | x1 | recuperezi miza |
| Nimic | x0 | pierzi miza |
| Periferic | Utilizare |
|---|---|
| GPIO (PORTD) | Citire butoane arcade cu pull-up intern |
| SPI hardware (PORTB) | Comunicatie cu display TFT ST7735S |
| UART software (SoftwareSerial) | Comunicatie cu DFPlayer Mini |
| EEPROM intern | Salvare persistenta credite si statistici |
| ADC (A0) | Generare seed aleator din zgomot analogic |
| Timer (millis) | Debounce non-blocant si animatii |
Proiectul a fost realizat complet si functional. Au fost atinse urmatoarele rezultate:
Proiectul a demonstrat integrarea mai multor periferice AVR intr-un produs interactiv functional. Principalele provocari intalnite au fost:
Proiectul poate fi extins cu iluminarea butoanelor arcade (necesita sursa de 12V separata), un ecran mai mare sau un modul Bluetooth pentru control wireless.
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:prj2009:cc:dumitru_alin.