Gire, Fume & Beba

Realizado por Grupo 10. Jon Mazcuñan Hernández, Marcos Álvarez Mansilla y Robert Gabriel Mihai.
Introducción
En este proyecto de la asignatura de Sistemas Empotrados y de Tiempo Real hemos diseñado e implementado una ruleta física controlada por un sistema embebido basado en Arduino, que ofrece cuatro posibles resultados: cigarros, chupitos, acumulador o nada. La motivación principal detrás de este trabajo surgió del deseo de preparar algo original y divertido para las previas de las fiestas con nuestros amigos. Queríamos unir lo aprendido en clase con una experiencia interactiva que pudiera disfrutarse en grupo, mezclando diversión con ingeniería. Esto nos llevó a integrar conocimientos de mecánica, electrónica y software de tiempo real para crear una experiencia práctica, original y segura.
Objetivos
1.- Diseñar la estructura general del sistema, incluyendo tanto la base mecánica como la disposición de los componentes.
2.- Seleccionar adecuadamente los componentes electrónicos necesarios: motor paso a paso, servo motor y bomba de agua.
3.- Implementar el hardware correspondiente a los tres mecanismos principales del proyecto: giro de la ruleta, dispensado automático de chupitos y despliegue automático de cigarrillos.
3.- Programar la lógica de control utilizando la plataforma Arduino, integrando temporización, sensores y actuadores.
5.- Realizar pruebas funcionales que validen la estabilidad y fiabilidad del sistema.
6.- Elaborar la documentación técnica, así como la presentación final y el blog divulgativo del proyecto.
Implementación
Hardware
La implementación del sistema físico se ha dividido en cuatro partes fundamentales: el giro de la ruleta, el dispensador de chupitos, el sistema de despliegue de cigarros y la integración de todos los componentes en una caja de madera personalizada.
- Giro de la ruleta: para simular la ruleta se ha empleado un motor paso a paso al que se ha acoplado una placa de madera resistente y ligera que actúa como la propia ruleta. Este motor ha sido programado para activarse mediante un pulsador: al presionar el botón, la ruleta gira durante un tiempo aleatorio y se detiene automáticamente. Gracias a las divisiones visibles en la placa de madera, es posible identificar en qué una de las cuatro opciones ha caído el resultado del giro: chupito, cigarro, acumulador o nada.
- Dispensador de chupitos: el sistema de dispensación se ha construido utilizando una botella de plástico rellenable con el líquido deseado. A través de un relé, se activa una bomba de agua que extrae el líquido desde la botella, lo conduce por una red de tubos de plástico y lo vierte en un vaso de chupito. Se ha marcado un nivel máximo en la botella para facilitar su llenado y asegurar un funcionamiento óptimo.
- Despliegue del cigarro: para esta función se ha diseñado una estructura funcional con piezas de LEGO, que simula un brazo mecánico. Dentro de esta estructura se ha incorporado un servo motor, el cual mueve el brazo para empujar un cigarro hacia el exterior y luego retorna a su posición inicial. Esta solución permite un despliegue controlado y repetible de los cigarros con un diseño compacto y accesible.
- Caja de madera: todos los componentes anteriores han sido integrados en una caja de madera hecha a medida. Esta caja, con apertura mediante bisagras, permite acceder fácilmente al interior para realizar ajustes o mantenimiento. Se han realizado tres cortes específicos en la estructura: uno para mostrar la ruleta exterior, otro para permitir la salida de los cigarros, y un tercero para guiar el tubo por el que se vierte el líquido en el vaso. Todos los elementos internos (incluyendo cables, tubos, motores y la botella) se encuentran firmemente sujetos, garantizando seguridad, estabilidad y ausencia de fugas en el sistema hidráulico.
Software
La lógica del sistema ha sido implementada utilizando Arduino, con un enfoque modular y eficiente para controlar los distintos componentes físicos: el motor de la ruleta, el servo del dispensador de cigarros, y el relé del sistema de chupitos. El código ha sido desarrollado para ofrecer una experiencia interactiva, donde un único botón activa toda la secuencia de funcionamiento.
- Inicialización del sistema: en la función setup(), se configuran los pines de entrada y salida, se establece la velocidad del motor paso a paso y se inicializan los componentes necesarios: el servo, el relé y la comunicación serial. También se utiliza una lectura analógica para alimentar el generador de números aleatorios, permitiendo que la ruleta tenga un comportamiento impredecible en cada activación.
- Lógica de interacción: El sistema espera la pulsación de un botón, conectado con resistencia de pull-up interna. Al detectar una pulsación, se inicia el giro de la ruleta mediante la función spinRoulette(), que hace girar el motor un número aleatorio de pasos dentro de un rango determinado. Esto genera el efecto visual de la ruleta y determina cuál de las cuatro opciones ha tocado.
- Determinación del resultado: una vez finalizado el giro, se calcula en qué sector ha caído la ruleta dividiendo el número de pasos realizados (esta lógica se implementa en la función executeOption()). Existen cuatro posibles resultados:
- Nada: el jugador pierde y se reinicia el contador acumulado.
- Cigarro: se dispensan automáticamente uno o más cigarros, dependiendo del acumulado.
- Acumulador: se incrementa en uno el número de premios a recibir en la próxima tirada.
- Chupito: se sirven uno o más chupitos, en función del acumulado actual.
- Control de dispositivos: cada una de las acciones físicas está encapsulada en funciones específicas:
- servoOn(): controla el servo motor para dispensar un cigarro.
- relayOn(): activa el relé y la bomba de agua para servir un chupito.

Reparto de tareas
Durante el desarrollo del proyecto, combinamos la implementación del software con el montaje del hardware de forma simultánea. Nos turnamos para trabajar tanto en la programación del código como en el montaje general del sistema, asegurándonos de avanzar de forma equilibrada en ambas áreas.
El ensamblaje de las estructuras físicas fue liderado principalmente por Marcos, el cual se encargó de gran parte del brazo dispensador de cigarros y la estructura de la caja de madera. Su trabajo fue clave para lograr una integración robusta.
Problemas encontrados
- Pila de la bomba de agua: inicialmente, se pensó en utilizar la pila incluida en el kit de Arduino para alimentar la bomba de agua. Sin embargo, anticipamos que se descargaría rápidamente debido a las numerosas pruebas necesarias. Por ello, decidimos utilizar un cable USB a USB conectado al ordenador para asegurar una fuente de alimentación más estable y duradera durante el desarrollo.
- Encontrar punto de caída en la ruleta: uno de los principales desafíos fue determinar con precisión en qué opción se detenía la ruleta. Consideramos varias soluciones: usar un sensor de color con etiquetas diferenciadas debajo de cada sector, o un sensor de distancia con objetos de distintos tamaños que permitieran identificar la posición. Finalmente, optamos por una solución más simple y eficaz: calcular el resultado mediante una operación de módulo basada en el número de pasos realizados por el motor paso a paso.
- Presión del agua: al llenar el depósito hasta su capacidad máxima, observamos que la presión del líquido hacía que el dispensador expulsara más de lo deseado, derramando el contenido. Para resolverlo, marcamos un límite de llenado en el depósito, evitando así sobrepasar la cantidad óptima y controlando el flujo de salida.
- Punto de inicio del motor paso por paso: dado que la opción seleccionada dependía del número de pasos realizados desde el punto de partida, era esencial que el motor comenzara siempre desde la misma posición. Para garantizarlo, implementamos un sistema en el que, tras cada giro, el motor deshacía los pasos dados y regresaba a su punto neutro, asegurando así la repetibilidad del funcionamiento.
- Pines fundidos: durante el montaje, experimentamos varios problemas de hardware, como pines quemados y cables dañados, especialmente en el servomotor. Estos inconvenientes se solucionaron mediante nuevas soldaduras, restaurando así la conectividad y el correcto funcionamiento de los componentes afectados.
Materiales
Para la realización de este proyecto se ha utilizado el kit de Arduino que nos ha proporcionado la universidad y además, algunos materiales que hemos tenido que comprar.
Material | Coste |
Kit bomba de agua, tubos y relé | 9,99€ |
Cables macho hembra | 5,90€ |
Caja madera estructura | 20,00€ |
Cable USB a USB | 1,50€ |
Cajetilla tabaco | 4,40€ |
Total | 41,79€ |
Código
#include <Stepper.h>
#include <Servo.h>
Servo servo; // Crea el objeto servo
Stepper motor(2048, 8, 10, 9, 11); // Motor unipolar 5 hilos
int relayPin = 7;
int servoPin = 3;
int buttonPin = 4; // Pin del botón
int accumulated = 1;
void setup() {
randomSeed(analogRead(0));
Serial.begin(9600);
motor.setSpeed(15);
servo.attach(servoPin);
servo.write(180);
pinMode(relayPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP); // Activamos resistencia pull-up interna
digitalWrite(relayPin, HIGH);
}
void servoOn() { // Dispensador de cigarros
servo.write(0);
delay(500);
for (int angulo = 0; angulo <= 180; angulo++) {
servo.write(angulo);
delay(10);
}
}
void relayOn() { // Dispensador de chupitos
digitalWrite(relayPin, LOW);
delay(1000);
digitalWrite(relayPin, HIGH);
}
int spinRoulette() {
int degreesToRun = random(2048, 6144);
motor.step(degreesToRun);
return degreesToRun;
}
void executeOption(int steps) {
int position = steps % 2048;
int sector = position / (2048 / 4);
switch (sector) {
case 0:
Serial.println("No te ha tocado nada y se pierde el acumulado");
accumulated = 1;
break;
case 1:
Serial.println("Se está dispensando " + String(accumulated) + " cigarro");
for (int i = 0; i < accumulated; i++) {
delay(2000);
servoOn();
}
accumulated = 1;
break;
case 2:
Serial.println("+1 para el siguiente | " + String(accumulated) + "+1");
accumulated += 1;
break;
case 3:
Serial.println("Se está sirviendo " + String(accumulated) + " chupito");
for (int i = 0; i < accumulated; i++) {
delay(2000);
relayOn();
}
accumulated = 1;
break;
}
delay(3000);
motor.step(-position);
}
void loop() {
// Botón pulsado = LOW (porque usamos INPUT_PULLUP)
if (digitalRead(buttonPin) == LOW) {
delay(50); // Anti-rebote simple
while (digitalRead(buttonPin) == LOW); // Espera a que se suelte el botón
executeOption(spinRoulette());
// Desactivar bobinas del motor
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
}
}
Casos de uso
Toca chupito
Toca cigarrillo
Toca acumulador
Toca nada
Vista del brazo mecánico para el despliegue del cigarro