La RuleTrago
Proyecto del Grupo 6 (Juan de Carlos López, Raúl Llona Cabeza e Iker Suarez Amutxastegi) de la asignatura de Diseño de Sistemas Empotrados de la Universidad Rey Juan Carlos, curso 2021/22.
En este proyecto de Arduino se va a crear una máquina para jugar por turnos a diversos juegos en grupo (mediante botones y LEDs), cuyo resultado causa que se dispensen chupitos (utilizando una bomba de agua).
Reglas del juego
En cada turno, al jugador que le toque pulsa el botón situado en la parte superior izquierda, que activa la ruleta de LEDs de colores situada en la parte superior, la cual gira hasta detenerse aleatoriamente en uno de los 5 LEDs. Cada color indica que se debe hacer:
LED Verde: (1 jugador) No ocurre nada, se pasa al siguiente jugador.
LED Rojo: (1 jugador) La máquina dispensa un chupito que el jugador debe tomar.
LED Azul: (1 jugador) Se inicia una secuencia de memoria en los LEDs azules de la parte inferior de la máquina, el jugador debe memorizar la secuencia y pulsar en orden los botones a los que corresponden cada LED. Hay 2 resultados posibles:
- Falla la secuencia: se enciende un LED Rojo, y la máquina dispensa un chupito.
- Acierta la secuencia: se enciende un LED Verde, y el jugador no bebe.
LED Amarillo: (2 jugadores) El jugador que ha tirado de la ruleta debe pulsar uno de los tres botones; posteriormente tiene que retar a un segundo jugador, el cual tiene que adivinar que botón ha sido presionado y pulsarlo también. Hay 2 resultados posibles:
- Falla el botón: se enciende un LED Rojo junto a un LED azul para indicar que botón era el correcto; y la máquina sirve un chupito que el jugador 2 debe beber.
- Acierta el botón: se enciende un LED Verde; y la máquina sirve un chupito que el jugador 1 debe beber.
LED Morado: (2 jugadores) Al igual que en el caso anterior, el jugador que ha tirado de la ruleta reta a otro. Este caso es un juego de reacción, cada jugador escoge 1 botón (izquierdo o derecho) y espera a que se iluminen los LEDs azules; en cuanto esto ocurra, ambos jugadores deben tratar de pulsar su botón lo antes posible. La máquina iluminará el LED del ganador. La máquina sirve un chupito que el perdedor debe beber.
Video Explicativo
Componentes
Nombre del Componente | Unidades | Precio |
Arduino UNO | 1 | Provista por la URJC |
Bomba de Agua | 1 | 3,50€ |
Batería 9v | 1 | 2,50€ |
Acoplador de Batería 9v | 1 | 0,40€ |
Relé de 5v | 1 | 3,50€ |
Pulsador | 4 | 0,40€ |
Placa de Prototipado | 1 | 2,50€ |
Diodos LED de Colores | 10 | 0,10 – 0,50€ Depende del Color |
Cables Puente | ~40 | 3,10€ |
Resistencias | 10 | 0,15€ |
Tubo de Plástico | 1 | 0,30 – 0,80€ |
Tablas de Madera | 2 | 10€ |
Hardware
La implementación hardware del proyecto se divide en tres partes: conexiones de LEDs, conexiones de botones y conexión de la bomba de agua.
Para el correcto funcionamiento de la bomba de agua es necesaria la utilización de un relé y una batería de 9v. El relé es el encargado de abrir y cortar la señal sobre la bomba de agua, mientras que la batería aporta la energía necesaria para ponerla en marcha.
Esquema de Conexiones
Montaje
Todo el proyecto se ha construido sobre una caja de madera montada a medida para encajar todos los elementos que necesita la máquina. En la parte frontal de la caja se encuentran dispuestos todos los botones y leds para jugar:
En la parte posterior, se encuentra el recipiente de donde se extrae la bebida a servir, en dicho recipiente se encuentra la bomba que está conectada a la batería y al relé. A su vez, en la boca de la bomba está puesto el tubo de plástico por donde fluye la bebida hasta el vaso de chupito.
En el interior de la caja se encuentran todos los componentes electrónicos y todas las conexiones. De tal forma que quedan aislados de posibles vertimientos de la bebida.
Código
//Leds Ruleta int led1 = A0; int led2 = A1; int led3 = 11; int led4 = 10; int led5 = 5; int leds[] = {led1, led2, led3, led4, led5}; //Leds botones int ledB0 = 2; int ledB1 = 3; int ledB2 = 4; int ledsB[] = {ledB0, ledB1, ledB2}; //Leds Acierto / Error int ledV = 12; int ledR = 13; //Botones int botonInicio = A5; int boton0 = A4; int boton1 = A3; int boton2 = A2; int boton[] = {boton0, boton1, boton2}; //Variables para guardar el estado de los botones int botonEstadoInicio = 0; int botonEstado0 = 0; int botonEstado1 = 0; int botonEstado2 = 0; int botonEstado[] = {botonEstado0, botonEstado1, botonEstado2}; //Variables juego reto int botonEstado0a = 0; int botonEstado1a = 0; int botonEstado2a = 0; //Variables juego memoria int turno; int numTurnos = 5; int orden[5]; boolean parar; //Variables juego reaccion int tiempoReaccion; //Estado general int estado = 0; int juego = 0; //Variables int t; int c; int j; int aux; //Variables para controlar los tiempos de ejecución unsigned long tiempoAnterior; unsigned long tiempo; //Valor aleatorio int num; //Relay int relay = 9; void setup() { Serial.begin(9600); randomSeed(analogRead(6)); pinMode(led1, OUTPUT); pinMode(led2, OUTPUT); pinMode(led3, OUTPUT); pinMode(led4, OUTPUT); pinMode(led5, OUTPUT); pinMode(ledB0, OUTPUT); pinMode(ledB1, OUTPUT); pinMode(ledB2, OUTPUT); pinMode(ledV, OUTPUT); pinMode(ledR, OUTPUT); pinMode(botonInicio, INPUT); pinMode(boton0, INPUT); pinMode(boton1, INPUT); pinMode(boton2, INPUT); pinMode(relay, OUTPUT); digitalWrite(relay, HIGH); } void loop() { botonEstadoInicio = digitalRead(botonInicio); if (botonEstadoInicio == HIGH) { estado = 1; } switch (estado) { case 1: num = random(25, 50); t = 100; Serial.println(num); digitalWrite(leds[0], LOW); digitalWrite(leds[1], LOW); digitalWrite(leds[2], LOW); digitalWrite(leds[3], LOW); digitalWrite(leds[4], LOW); for (int i = 0; i < num; i++) { digitalWrite(leds[i % 5], HIGH); if ((num - i) < 8) { t = t + 100; } delay(t); if (i != (num - 1)) { digitalWrite(leds[i % 5], LOW); } } switch ((num - 1) % 5) { case 0: //no bebe estado = 0; break; case 1: //bebe dispensar(); delay(500); estado = 0; break; case 2: //juego memoria estado = 2; break; case 3: //reto a alguien estado = 3; break; case 4: //juego reacción estado = 4; break; default: break; } break; case 3: //Juego reto esperarBotones(); leerBotones(); esperarBotones(); botonEstado0a = digitalRead(boton0); botonEstado1a = digitalRead(boton1); botonEstado2a = digitalRead(boton2); Serial.println(botonEstado0a); Serial.println(botonEstado1a); Serial.println(botonEstado2a); delay(500); for (int i = 0; i < 3; i++) { if (botonEstado[i] == 1) { aux = i; } } if (botonEstado[0] == botonEstado0a && botonEstado[1] == botonEstado1a && botonEstado[2] == botonEstado2a) { luzVerde(); } else { luzRoja(); } for (int j = 0; j < 3; j++) { delay(400); digitalWrite(ledsB[aux], HIGH); delay (400); digitalWrite(ledsB[aux], LOW); } delay(1000); dispensar(); estado = 0; break; case 2: //Juego memoria digitalWrite(ledsB[0], HIGH); digitalWrite(ledsB[1], HIGH); digitalWrite(ledsB[2], HIGH); delay(3000); digitalWrite(ledsB[0], LOW); digitalWrite(ledsB[1], LOW); digitalWrite(ledsB[2], LOW); turno = 0; parar = false; for (int i = 0; i < numTurnos; i++) { //Se genera la secuencia a memorizar orden[i] = random(0, 3); digitalWrite(ledsB[orden[i]], HIGH); delay(1000); digitalWrite(ledsB[orden[i]], LOW); delay(200); } while (turno < numTurnos && !parar) { Serial.println(parar); esperarBotones(); leerBotones(); j = 0; while (j < 3 && !parar) { if (botonEstado[j] == 1) { if (orden[turno] == j) { luzVerde(); } else { parar = true; } } j++; } turno++; } delay (1000); if (!parar) { for (int j = 0; j < 5; j++) { delay(200); digitalWrite(ledV, HIGH); delay (200); digitalWrite(ledV, LOW); } } else { for (int j = 0; j < 5; j++) { delay(200); digitalWrite(ledR, HIGH); delay (200); digitalWrite(ledR, LOW); } dispensar(); } estado = 0; break; case 4: //juego reacción parar = false; digitalWrite(ledsB[0], HIGH); digitalWrite(ledsB[2], HIGH); delay(5000); digitalWrite(ledsB[0], LOW); digitalWrite(ledsB[2], LOW); tiempoReaccion = (random(2000, 12000)); tiempo = millis(); tiempoAnterior = tiempo; while (tiempo - tiempoAnterior < tiempoReaccion && !parar) { tiempo = millis(); botonEstado[0] = digitalRead(boton0); botonEstado[2] = digitalRead(boton2); for (int i = 0; i < 3; i++) { botonEstado[i] = digitalRead(boton[i]); if (botonEstado[i] == 1) { digitalWrite(ledsB[i], HIGH); parar = true; aux = i; } } } if (!parar) { for (int i = 0; i < 3; i++) { digitalWrite(ledsB[i], HIGH); } esperarBotones(); leerBotones(); for (int i = 0; i < 3; i++) { digitalWrite(ledsB[i], LOW); } if (botonEstado[0] == 1) { digitalWrite(ledsB[0], HIGH); for (int j = 0; j < 5; j++) { delay(200); digitalWrite(ledV, HIGH); delay (200); digitalWrite(ledV, LOW); } delay(500); digitalWrite(ledsB[0], LOW); } else { digitalWrite(ledsB[2], HIGH); for (int j = 0; j < 5; j++) { delay(200); digitalWrite(ledV, HIGH); delay (200); digitalWrite(ledV, LOW); } delay(500); digitalWrite(ledsB[2], LOW); } } else { for (int j = 0; j < 5; j++) { delay(200); digitalWrite(ledR, HIGH); delay (200); digitalWrite(ledR, LOW); } delay(500); digitalWrite(ledsB[aux], LOW); } estado = 0; dispensar(); break; default: break; } } void esperarBotones() { while (digitalRead(boton0) == digitalRead(boton1) && digitalRead(boton0) == digitalRead(boton2)) { } } void leerBotones() { botonEstado0 = digitalRead(boton0); botonEstado1 = digitalRead(boton1); botonEstado2 = digitalRead(boton2); botonEstado[0] = digitalRead(boton0); botonEstado[1] = digitalRead(boton1); botonEstado[2] = digitalRead(boton2); Serial.println(botonEstado[0]); Serial.println(botonEstado[1]); Serial.println(botonEstado[2]); delay(500); } void luzVerde() { digitalWrite(ledV, HIGH); delay(1000); digitalWrite(ledV, LOW); } void luzRoja() { digitalWrite(ledR, HIGH); delay(1000); digitalWrite(ledR, LOW); } void dispensar() { digitalWrite(relay, LOW); delay(800); digitalWrite(relay, HIGH); delay(500); }