Barajador y Repartidor automático
Contenidos:
–INFORMACIÓN SOBRE EL PROYECTO
–IMPLEMENTACIÓN
–PASOS DADOS
–REPARTO DE TAREAS
–PRESUPUESTO
–CASOS DE USO
–PROBLEMAS Y SOLUCIONES ENCONTRADAS
–PROTOTIPO
–VIDEO EXPLICATIVO Y DEMO
–CÓDIGO
–AUTORES
INFORMACIÓN SOBRE EL PROYECTO
Este proyecto consiste en un barajador y repartidor de cartas automático realizado con Arduino. Primero mezclará dos montones de cartas mediante el uso de dos motores cc que las irá juntando en un espacio entre ambos intercalando las cartas de los grupos. Después de esperar un tiempo prudencial comenzará a repartir, esto se conseguirá gracias al uso de un servomotor y un motor cc.
IMPLEMENTACIÓN
La entrada de datos (jugadores y cartas) entrarán mediante el uso de botones, El usuario sabrá cuantos jugadores y cartas está introduciendo gracias a un visualizador de 7 segmentos, primero se tendrá que elegir el número de jugadores, después de confirmar la elección se enviará un feedback a través del punto del siete segmento para confirmar de que ya se ha guardado el número de jugadores y que ahora tiene que seleccionar el número de cartas por jugador.
Una vez insertados los datos correspondientes, empezará a barajar las cartas situadas en sus correspondientes lugares, tras mezclarse las cartas, empezará a repartirlas a los jugadores(esto se realizará gracias al uso de 3 motores CC que activan unas ruedas que empujarán las cartas y un servomotor que rotará la estructura).
PASOS DADOS
1. Fase de diseño: proponer ideas del funcionamiento y como será la interacción
2. Diseño de la forma del barajador: primero se creará un prototipo con cartón para realizar las pruebas con el circuito y posteriormente uno de cartón pluma para el resultado final.
3. Diseño del circuito correspondiente al barajador:
3.1. Giro Motores: hacer que dos motores giren simultáneamente tras pulsar el botón
4. Diseño del circuito correspondiente al repartidor:
4.1. Giro Motor CC: hacer que el motor CC gire cada vez que tenga que repartir una carta
4.2. Giro Servomotor: hacer que el servo gire en función del número de jugadores
4.3. Coordinación de motores: hacer que ambos motores se coordinen de forma que se reparta el número de cartas indicado al número de jugadores indicados.
5. Implementación del contador y los botones.
6. Montaje final: Juntar los circuitos al cartón pluma.
7. Pruebas: Realizar pruebas para asegurarse de que funciona como debería
REPARTO DE TAREAS
Las tareas correspondientes al trabajo se han realizado por el grupo en conjunto en todo momento.
PRESUPUESTO
Materiales | Uso | Precio |
3 láminas Cartón Pluma(A3) | Estructura del barajador y del repartidor | 14€ |
3 motores cc | Girar las ruedas que mueven las cartas tanto para barajar como para repartir | 7,29€ |
12 barras de silicona | Pegar las diferentes partes | 1,50€ |
8 ruedas de plástico | mover las cartas para barajar y repartir | 15,90€ |
1 servomotor | girar el repartidor mientras se reparten las cartas | 3,04€ |
Palillos | Unir las ruedas a los motores | 1€ |
3 Transistores | Dirigir señales de los pines activando los motores | 2,52€ |
2 botones | Configurar número de personas y cartas | 0,65€ |
20 m de cable unipolar(10 naranja y 10 negro) | conectar motores con la protoboard y la placa de arduino | 7,14€ |
Protoboard | Conexión entre elementos y placa | 3,64 |
Miniboard,cables,transistores,display 7 segmentos pilas 9V. | ——————————————- | Proporcionado por la universidad/propio(1,09+3+2,52+0,69+5 si hay que comprarlo) |
Total: | ——————————————- | 56,68€(68,98) |
CASOS DE USO
El único caso de uso que tiene es el de primero barajar y luego repartir cartas:
Una vez iniciado con el botón derecho. La entrada de datos(jugadores y cartas) entrarán mediante el uso de botones, el botón derecho inicia el diseño, pasa a número de cartas y empieza el proceso(para pasar de uno a otro hay que pulsar el botón),mientras que el izquierdo sirve para insertar el número de jugadores y cartas(cada vez que se pulse el botón se sumará uno al número actual).
Una vez se pulse el botón, empezará a barajar las cartas situadas en sus correspondientes lugares, al mezclarse las cartas(mediante el uso de dos motores empleados simultáneamente que girarán dos ruedas que a su vez empujarán las cartas hacia la zona donde esperan para repartir), empezará a repartirlas a los jugadores (empujándolas igual que pasa en el barajador con un motor, y girando con el uso de un servomotor).
PROBLEMAS Y SOLUCIONES ENCONTRADAS
7-segment display: El principal problema que hemos encontrado es la conexión del 7-segment display a la placa. Intentamos conectarlo con cables macho hembra, pero no se terminaban de conectar otra opción que podríamos haber intentado era soldar os pines con los cables pero al no disponer de un soldador tuvimos que descartarlo. La opción que implementamos al final, fue el uso de una miniboard auxiliar donde unir los cable y el display.
Esconder cables: Otro problemas que nos hemos visto a solventar eran los cables, para ello hemos realizado falsos fondos en algunas paredes para pasar los cables por allí.
Coordinación de los motores: Para coordinar los motores hemos empleado delays.
Posicionamiento de las cartas: Las cartas necesitaban estar en una posición especifica tanto al repartir como al barajar para que los motores puedan moverlas por lo que tuvimos que emplear cinta y gomas para dirigirlas a las posiciones.
PROTOTIPO:
Primero nos centramos en la parte del barajador de cartas, para ello empleamos 2 motores cc, un botón,2 transistores, una pila de 9V, cables, la protoboard y la placa de Arduino.
En el vídeo se puede ver el funcionamiento de los motores que barajarán las cartas.
A continuación nos centramos en la parte de repartir, para la cual emplearemos un servomotor, otro motor cc y otro transistor sumado a los componentes mencionados anteriormente.
Por último utilizamos implementamos el contador y los botones para configurar el numero de jugadores y cartas, tras esto usamos, el cartón pluma para crear el diseño final juntando barajador y mezclador.
VIDEO EXPLICATIVO Y DEMO
CÓDIGO
#include <Servo.h>
const int pinesSegmentos[] = {2, 3, 4, 5 , 6, 7, 8};
const int pinPuntoSegmento = 13;
const int pinMotor1 = 12;
const int pinMotor2 = 10;
const int pinMotor3 = 11;
Servo miServo;
const int pinBotonEmpezar = A0;
const int pinBotonContador = A1;
bool estadoBotonEmpezar = false;
bool ultimoEstadoBotonEmpezar = false;
bool estadoBotonContador = false;
bool ultimoEstadoBotonContador = false;
int contador = 0;
int estadoActual = 0;
int numeroJugadores = 1;
int numeroCartasJugador = 1;
const byte numbers[7] = {
0b01000001, // 1
0b00111011, // 2
0b01101011, // 3
0b01001101, // 4
0b01101110, // 5
0b01111110, // 6
0b01000011, // 7
};
void setup() {
for (int i = 0; i < 7; i++) {
pinMode(pinesSegmentos[i], OUTPUT);
}
pinMode (pinPuntoSegmento, OUTPUT);
pinMode(pinMotor1, OUTPUT);
pinMode(pinMotor2, OUTPUT);
pinMode(pinMotor3, OUTPUT);
miServo.attach(9);
pinMode(pinBotonContador, INPUT_PULLUP);
pinMode(pinBotonEmpezar, INPUT_PULLUP);
Serial.begin(9600);
}
void loop() {
verEstadoBotonEmpezar();
switch (estadoActual) {
case 0:
analogWrite(pinMotor1, 0);
analogWrite(pinMotor2, 0);
analogWrite(pinMotor3, 0);
break;
case 1:
reset();
getJugadores();
reset();
for (int i = 0; i < 7; i++) {
digitalWrite(pinesSegmentos[i], LOW);
}
digitalWrite(pinPuntoSegmento, HIGH);
getCartasJugador();
delay(1000);
delay(1000);
barajear(250);
repartir(numeroJugadores, numeroCartasJugador);
resetTotal();
break;
}
}
void reset()
{
estadoActual = 0;
estadoBotonContador = false;
ultimoEstadoBotonContador = false;
}
void resetTotal(){
estadoBotonEmpezar = false;
ultimoEstadoBotonEmpezar = false;
estadoBotonContador = false;
ultimoEstadoBotonContador = false;
contador = 0;
estadoActual = 0;
numeroJugadores = 1;
numeroCartasJugador = 1;
digitalWrite(13,LOW);
for (int i = 0; i < 7; i++) {
digitalWrite(pinesSegmentos[i], LOW);
}
}
void getCartasJugador()
{
while((estadoActual == 0)){
mostrarNumero(numeroCartasJugador - 1);
estadoBotonContador = digitalRead(pinBotonContador);
mostrarNumero(numeroCartasJugador - 1);
if (estadoBotonContador == LOW && ultimoEstadoBotonContador == HIGH) {
numeroCartasJugador++;
if (numeroCartasJugador > 7) numeroCartasJugador = 1;
mostrarNumero(numeroCartasJugador - 1);
}
ultimoEstadoBotonContador = estadoBotonContador;
verEstadoBotonEmpezar();
Serial.println("Numero de jugadores seleccionados" );
Serial.println(numeroCartasJugador );
}
}
void getJugadores()
{
while((estadoActual == 0)){
mostrarNumero(numeroJugadores - 1);
estadoBotonContador = digitalRead(pinBotonContador);
mostrarNumero(numeroJugadores - 1);
if (estadoBotonContador == LOW && ultimoEstadoBotonContador == HIGH) {
numeroJugadores++;
if (numeroJugadores > 7) numeroJugadores = 1;
mostrarNumero(numeroJugadores - 1);
}
ultimoEstadoBotonContador = estadoBotonContador;
verEstadoBotonEmpezar();
Serial.println("Numero de jugadores seleccionados" );
Serial.println(numeroJugadores );
}
}
void repartir(int jugadores, int cartasJugador)
{
int gradoJugador = 140 / jugadores;
while ((estadoActual == 1) && (cartasJugador != 0)){
verEstadoBotonEmpezar();
for(int i=0; i<jugadores; i++){ // i = numero de jugadores
miServo.write(i * gradoJugador);
delay(500);
analogWrite(pinMotor3, 250); // Velocidad moderada en el motor 3
delay(200);
analogWrite(pinMotor3, 0); // Velocidad moderada en el motor 3
delay(1000);
}
cartasJugador--;
}
}
void barajear(int ms)
{
digitalWrite(pinMotor1, HIGH);
delay(250);
digitalWrite(pinMotor2, HIGH);
delay (5000);
digitalWrite(pinMotor1, 0);
digitalWrite(pinMotor2, 0);
}
void verEstadoBotonEmpezar()
{
estadoBotonEmpezar = !digitalRead(pinBotonEmpezar); // Invertimos porque INPUT_PULLUP devuelve LOW cuando se presiona
if (estadoBotonEmpezar && !ultimoEstadoBotonEmpezar) {
estadoActual = (estadoActual + 1) % 2; // Cambiar al siguiente estado, hay 2 estados: 0, 1
}
ultimoEstadoBotonEmpezar = estadoBotonEmpezar;
}
void mostrarNumero(int numero) {
byte segmentos = numbers[numero];
for (int i = 0; i < 7; i++) {
digitalWrite(pinesSegmentos[i], (segmentos >> i) & 0x01);
}
}
Autores:G09
-David Pelado Peña
-Ariabod Fatehi
-Guillermo Lara Salazar