This is an old revision of the document!


AVR Slot Machine

Introducere

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.

Descriere generală

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:

Hardware Design

Lista de piese

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.

Software Design

Mediu de dezvoltare

Proiectul a fost dezvoltat folosind:

  • PlatformIO (extensie VSCode) — compilare, upload, monitor serial
  • Framework Arduino pe board Arduino Uno R3
  • avr-gcc (toolchain-atmelavr) — compilator C/C++ pentru AVR

Librarii si surse 3rd-party

  • Adafruit ST7735 and ST7789 Library — driver display TFT color ST7735S
  • Adafruit GFX Library — librarie grafica de baza (text, forme, culori)
  • DFRobotDFPlayerMini — control modul audio DFPlayer Mini prin UART
  • SoftwareSerial (inclusa in framework Arduino) — UART software pe pinii D6/D7
  • avr/eeprom.h (librarie AVR standard) — citire/scriere EEPROM intern

Structura codului

Codul este organizat modular in 4 perechi de fisiere header/sursa:

  • buttons.h / buttons.cpp — citire butoane cu debounce non-blocant bazat pe millis(). Implementeaza o masina de stari per buton cu flaguri de edge (falling edge = apasare unica). Foloseste registrele AVR DDRD, PORTD, PIND direct.
  • dfplayer.h / dfplayer.cpp — control modul audio DFPlayer Mini prin SoftwareSerial la 9600 baud. Include flag de disponibilitate (df_ok) care permite jocului sa continue si fara sunet.
  • display.h / display.cpp — driver complet pentru TFT ST7735S in mod landscape (160x128px). Deseneaza simboluri grafice (7, BAR, stea, cirese, diamant) pixel cu pixel folosind primitive Adafruit GFX. Fiecare ecran al jocului are o functie dedicata.
  • game.h / game.cpp — logica completa a jocului implementata ca masina de stari finita (FSM) cu 7 stari: START, IDLE, SPINNING, RESULT, REDBLACK, GAMEOVER, STATS.

Algoritmi implementati

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):

  • 7 = 1/20 (5%)
  • BAR = 3/20 (15%)
  • STAR = 4/20 (20%)
  • CHERRY = 6/20 (30%)
  • DIAMOND = 6/20 (30%)

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

Periferice AVR utilizate

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

Rezultate Obtinute

Proiectul a fost realizat complet si functional. Au fost atinse urmatoarele rezultate:

  • Jocul de tip slot machine functioneaza corect cu animatii fluide pe display-ul TFT color
  • Sunetele sunt redate realist prin modulul DFPlayer Mini la fiecare eveniment (spinning, castig, pierdere, jackpot)
  • Cele 4 butoane arcade raspund corect datorita debounce-ului non-blocant implementat
  • Mini-jocul Red or Black functioneaza corect dupa fiecare castig
  • Creditele si statisticile sunt salvate persistent in EEPROM si supravietuiesc deconectarii
  • Ecranul de statistici este accesibil prin tinerea apasata a butonului BLACK 2 secunde

Concluzii

Proiectul a demonstrat integrarea mai multor periferice AVR intr-un produs interactiv functional. Principalele provocari intalnite au fost:

  • Debounce-ul butoanelor mecanice arcade care generau apasari multiple
  • Initializarea corecta a modulului DFPlayer Mini cu delay suficient la pornire
  • Lipirea headerului de pini pe display-ul TFT
  • Configurarea corecta a mediului PlatformIO pentru Arduino Uno

Proiectul poate fi extins cu iluminarea butoanelor arcade (necesita sursa de 12V separata), un ecran mai mare sau un modul Bluetooth pentru control wireless.

Download

O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-).

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.

Jurnal

Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului.

Bibliografie/Resurse

Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe Resurse Software şi Resurse Hardware.

Export to PDF

pm/prj2026/florin.stancu/andrei.toader2407.1779623993.txt.gz · Last modified: 2026/05/24 14:59 by andrei.toader2407
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0