Table of Contents

Slot Machine - Truta Robert

Descriere generală

Slot machine unde poti paria si castiga bile de sticla. Pentru a paria trebuie introdusa cel putin o bila si selectata una dintre cele 4 culori (rosu, verde, albastru sau mov). Una dintre culori va fi aleasa random si afisata pe un led ring. Daca culoarea aleasa este aceeasi cu cea pariata, sunt eliberate de 3 ori mai multe bile decat numarul introdus. Slot machine-ul emite si muzica cu ajutorul unui buzzer.

Link demo: https://www.youtube.com/watch?v=2sDv7H4uAIs

Componente

Schemă Bloc

Hardware Design

Schema Hardware

Implementare fizica

Pentru a putea realiza proiectul in forma fizica, pe langa piesele electronice am folosit si placaj MDF, carton, suruburi, aracet, carioci. Breadbord-ul este folosit doar pentru a alimenta piesele la 5V, inclusiv rezistentele, fiind lipite in serie direct de led-uri. Ii multumesc lui Florin pentru ajutorul acordat la lipit.

Software Design

Pe langa functiile standard loop si setup, proiectul contine inca 5 alte functii: color_leds, bet, sing, animation, countMarbles. Voi prezenta in continuare rolul si modul de functionare al acestora.

color_leds este responsabila pentru logica celor 4 butoane si celor 4 leduri folosite pentru a inregistra culoarea pe care jucatorul doreste sa parieze. Deoarece o singura culoare poate fi pariata la un moment de timp, apasarea unui buton este inregistrata doar pe frontul descrescator (HIGH → LOW) si va “sterge” apasarile anterioare. Acest lucru este realizat cu ajutorul a 3 vectori:

int but_state[5] = {HIGH, HIGH, HIGH, HIGH, HIGH};
int but_state_prev[5] = {HIGH, HIGH, HIGH, HIGH, HIGH};
int led_state[4] = {LOW, LOW, LOW, LOW};

Pentru a exclude din circuit necesitatea unor rezistente pentru butoane am folosit INPUT_PULLUP.

pinMode(but_pins[i], INPUT_PULLUP);

Butoanele aveau tendinta sa genereze “tranzitii false” dupa o apasare. Pentru a evita acest lucru am folosit tehnica de debounce, astfel verificarea unei apasari are loc o data la 100 ms, timp in care tensiunile parazite sunt disipate.

if(millis() - color_time > 100) {
   color_leds();
   color_time = millis();
}

bet este responsabila pentru logica pariului propriu-zis. Pariul are loc atunci cand butonul rosu este apasat. Un numar random intre 1 si 15 este ales, sead-ul pentru random fiind generat de citirea analogica a pinului 6.

randomSeed(analogRead(6));
int random_nr = random(ring_nr_leds);

In cazul in care pariul este castigator, servomotor-ul elibereaza un numar de bile de 3 ori mai mare decat cel introdus. Controlul motorului este realizat cu ajutorul bibliotecii PWMServo.h. La finalul oricarui pariu, numarul de bile introduse este resetat la 0.

animation este functia care genereaza animatia pentru inelul de leduri. Aceasta primeste numarul random ales in momentul pariului si simuleaza o rotire de ruleta. Pentru a controla inelul de leduri am folosit biblioteca Adafruit_NeoPixel.h

countMarbles numara bilele introduse de jucator. Este activata prin intrerupere externa pe pinul 3 generata de frontul crescator al unui senzor de atingere.

attachInterrupt(digitalPinToInterrupt(sensor_pin), countMarbles, RISING);

Si in cadrul acestei functii am folosit technica de debounce pentru a nu inregistra intreruperi false.

sing reproduce theme song-ul Super Mario cu ajutorul unui buzzer. Pentru a putea interpreta notele muzicale am folosit biblioteca pitches.h care poate fi gasita la adresa https://github.com/hibit-dev/buzzer/tree/master/lib. De asemenea, notele si durata lor au fost preluate de la adresa https://github.com/hibit-dev/buzzer/blob/master/src/games/mario_bros/mario_bros.ino

Probleme intampinate

Au fost atat de multe incat nici nu stiu de unde sa incep.

Concluzii

Resurse

truta_robert_cod.zip

Link demo: https://www.youtube.com/watch?v=2sDv7H4uAIs

Proiectul a fost inspirat dupa acest video https://www.youtube.com/watch?v=Gg9miQgFtiA