Máquina Tragaperras

SEyTR_Mo_G11_2022-23

Introducción

Los motivos que nos llevaron a iniciar este proyecto fue la creación de una máquina que nos ofreciera diversión y nos permita desestresarnos de la vida académica. Por ello, decidimos hacer una máquina tragaperras.

La máquina tragaperras dispone de una pantalla que simulará el juego, un sensor que reconocerá monedas, leds, un buzzer de sonido, botones para iniciar el juego y un servo que abrirá la puerta al ganar el premio.

En los siguiente apartados describiremos con detalle las diferentes partes de nuestro proyecto. Como puntos a resaltar, el hardware, el software, los problemas encontrados durante el diseño y las soluciones que encontramos a estos. Por último expondremos algunas mejoras.

Implementación

Este diseño realizado en tinkercad refleja nuestro proyecto, usamos este esquema para que sea más claro. Tenemos diferentes componentes:

  • LCD I2C: Compone la interfaz gráfica de nuestro sistema y es usada para mostrar mensajes para guiar al usuario en el uso de nuestra máquina, además es la encargada de mostrar el funcionamiento del juego, haciendo uso de varios bucles simulamos una animación de transición entre números como si se tratara de una tragaperras real. También cabe destacar que esta pantalla LCD es un modelo en el cual los pines han sido soldados a un módulo que permite facilitar su uso ya que reduce los pines a 4 y nos permite ahorrarnos la inclusión de un potenciómetro para regular la pantalla.
  • PIR: Sensor infrarrojo encargado de la detección de las monedas.
  • Servomotor: Encargado de abrir la puerta de los premios en caso de que el usuario gane.
  • LEDs: Los leds sirven para notificar al usuario del resultado de la partida, si pierde se iluminará el rojo y si gana se iluminará el azul.
  • Buzzer: Cuando el jugador obtiene el premio, que ocurre cuando los tres números son iguales, la tragaperras emitirá un sonido de alerta para notificar al usuario de que ha ganado y de que puede recoger el premio.
  • Botón: Una vez introducida la moneda, nuestro sistema se quedará a la espera de la respuesta del botón para iniciar la partida.

Toda la implementación y el código está explicado con más detalle en el vídeo.

Código

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <Servo.h>

int LEDLose = 3; //LED  pin D3
int LEDWin = 5; //LED  pin D5

int SONIDO = 6; //Buzzer pin D8

int BOTON = 2; //Boton pin D2

int PIR = 4; //Sensor infrarrojos pin A4
int pirState = LOW; //Estado inicial del PIR

Servo servoMotor; //Servomotor

LiquidCrystal_I2C lcd(0x27,16,2); //Inicializacion pantalla 16X2

//Variables Maquina Tragaperras
int val;
int pos1;
int pos2;
int pos3;


byte corazon[8] = {
  0b00000000,
  0b00001010,
  0b00010101,
  0b00010001,
  0b00001010,
  0b00000100,
  0b00000000,
  0b00000000,
};

byte cereza[8] = {
  0b00000000,
  0b00000001,
  0b00001001,
  0b00001011,
  0b00011011,
  0b00011000,
  0b00000000,
  0b00000000,
};

byte diamante[8] = {
  0b00000000,
  0b00001110,
  0b00011011,
  0b00010101,
  0b00001010,
  0b00000100,
  0b00000000,
  0b00000000,
};

void winSong(int tonePin){
  	tone(tonePin, 987, 300);
  	delay(300);
	  tone(tonePin, 523, 300);
  	delay(300);
  	tone(tonePin, 987, 300);
    delay(500);
  	tone(tonePin, 523, 300);
  	delay(300);
  	tone(tonePin, 987, 300);

}


void setup() {
  // Inicializar el LCD
  lcd.init();
  lcd.backlight(); //Encender la luz de fondo

  //Declarar los elementos como INPUT y OUTPUT
  pinMode(LEDLose, OUTPUT);
  pinMode(LEDWin, OUTPUT);
  pinMode(PIR, INPUT);
  pinMode(BOTON, INPUT);

  //Semilla aleatoria
  randomSeed(analogRead(0));

  //Inicializar figuras
  lcd.createChar(0, corazon);
  lcd.createChar(1, cereza);
  lcd.createChar(2, diamante);

  //Servo pin D9
  servoMotor.attach(9);
}

void loop() {
  servoMotor.write(0); //Posicion inicial servo.
  lcd.setCursor(0, 0);
  lcd.print("Inserte Moneda");

  if(digitalRead(PIR) == HIGH){ //Si el sensor Detecta moneda 
    lcd.clear();
    lcd.print("Pulse Boton");
    while(digitalRead(BOTON) == HIGH){}//Esperar a que el usuario pulse el boton.

    //Inicializar el funcionamiento de la tragaperras
    pos1 = random(10);
    pos2 = random(10);
    pos3 = random(10);

    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("   X   X   X    ");

    //animacion de la maquina
    for(int columna = 0; columna < 3; columna++){
      for(int retardo = 1; retardo < 4; retardo++){
        for(int i = 0; i < 10; i++){
          lcd.setCursor(3 + (columna * 4), 0);
          int numero = random(10);
          switch(numero){
            case 6:
              lcd.write((byte)0);
              break;
            case 8:
              lcd.write((byte)1);
              break;
            case 9:
              lcd.write((byte)2);
              break;
            default:
              lcd.print(numero);
          }
          delay(50 + (retardo * 100));
        }
      }

      // colocar el numero obtenido en la posicion
      lcd.setCursor(3 + (columna * 4), 0);
      switch(columna){
        case 0:
          val = pos1;
          break;
        case 1:
          val = pos2;
          break;
        case 2:
          val = pos3;
          break;
      }

      switch(val){
        case 6:
          lcd.write((byte)0);
          break;
        case 8:
          lcd.write((byte)1);
          break;
        case 9:
          lcd.write((byte)2);
          break;
        default:
          lcd.print(val);
      }
    }

    //Premios
    lcd.setCursor(0, 1);
    if((pos1 == pos2) && (pos1 == pos3)){
      lcd.print("Premio Gordo");
      analogWrite(LEDWin, 255);
      winSong(SONIDO);
      servoMotor.write(90);
      delay(20000);
      analogWrite(LEDWin, 0);
      servoMotor.write(0); //Posicion inicial servo.
      delay(5000);
    } else{
      lcd.print("Sigue jugando");
      analogWrite(LEDLose, 255);
      delay(3000);
      analogWrite(LEDLose, 0);
    }
    lcd.clear();

    //colocar el estado del sensro PIR en LOW para que pueda detectar otra moneda
    if (pirState == LOW){
      pirState = HIGH;
    }
  }
}

Casos de uso

A continuación se presentan los casos de uso de la máquina tragaperras:

  • Insertar moneda: El jugador podrá insertar una moneda. La máquina se encargará de detectar dicha moneda usando un sensor PIR.
  • Empezar partida: Una vez insertada la moneda, se podrá empezar la partida pulsando el botón.
  • Gestionar partida: La máquina se encargará de generar tres números random y hacer las comprobaciones pertinentes.
  • Leds al acabar la partida: Una vez acabada la partida, si se pierde, se encenderá un led rojo. Y si se gana, se encenderá un led azul.
  • Sonido al ganar la partida: el buzzer emitirá un sonido al ganar.
  • Abrir la puerta al ganar: Al ganar la partida, el servo abrirá la puerta de las monedas.

Materiales y costes

MaterialPrecio (€)
1 x Arduino UNOIncluido en el material de la URJC
1 x ProtoboardIncluido en el material de la URJC
1 x led azulIncluido en el material de la URJC
1 x led rojoIncluido en el material de la URJC
1 x botónIncluido en el material de la URJC
2 x res 220Incluido en el material de la URJC
1 x res 10kIncluido en el material de la URJC
1 x buzzerIncluido en el material de la URJC
1 x PIR8,99€
1 x servomotor9,99€
1 x LCD I2C 16×212,99€
Total31.97€

Problemas y soluciones

Durante la realización del proyecto nos encontramos con diversos problemas:

Parte física

Problemas con la construcción del proyecto: Tuvimos problemas montando la parte física de la máquina tragaperras. La caja, al ser de cartón nos dió bastantes problemas. Aunque el problema más resaltable fue la puerta que abre el compartimento de las monedas, ya que el servo muy a menudo la despegaba.

Problemas con el lcd: el lcd nos dió bastantes problemas, aunque el más resaltable fue que nuestra protoboard no conducía suficiente corriente en la parte superior al conectar demasiados componentes, esto hacía que el lcd se encendiera pero no mostrase nada.  Este problema nos confundió bastante, ya que no sabíamos qué era lo que ocurría. La solución fue conectar la placa en la parte más baja del protoboard.

Parte código

Problemas con las librerías: En concreto la librería del lcd dió bastantes problemas ya que había que meterla a mano.

Problemas con el buzzer: La idea inicial era producir un sonido complejo al ganar el premio usando el buzzer, pero el buzzer distorsionaba sonidos demasiado complejos. La solución fue optar por tonos más simples.

Problemas con el LCD: el LCD dió problemas con las direcciones que este necesita, al principio asignamos una dirección menor al tamaño de nuestra pantalla y eso produjo un brillo menor. 

Posibles mejoras

A continuación se presentan algunas posibles mejoras para nuestra máquina tragaperras:

1. Implementar una matriz: nuestra pantalla consta de un único lcd que simula una única fila, una posible mejora podría ser utilizar 3 lcds y así simular una matriz 3×3.

2. Mejora estética: otra mejora podría ser mejorar estéticamente nuestro diseño.

3. Hacer un sistema de retorno de la moneda: Si se ha introducido una moneda pero no se desea iniciar el juego, poder devolver la moneda pulsando un botón.

4. Introducir más premios: como mejora se podría plantear un segundo premio que devuelva lo gastado.

5. Incorporar varios minijuegos: podríamos plantear la introducción de otros minijuegos.

6. Sustitución del botón de inicio de juego por una palanca.

7. Sustituir el sistema de entrega del premio por un cajetín que contenga dichas monedas.

8. Optimizar el sistema de introducción de la moneda para iniciar el juego.

Para concluir, aunque estamos conformes con el diseño de nuestra práctica, existen muchas mejoras que se pueden realizar para hacer más placentera la experiencia de los usuarios.

Video Explicativo

También te podría gustar...

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *