REPARTIDOR DE CARTAS

INFORMACIÓN SOBRE EL PROYECTO

Este proyecto consiste en un repartidor de cartas automático realizado con una placa Arduino UNO, en el que el usuario selecciona el número de jugadores y de cartas y el sistema realiza el reparto.

IMPLEMENTACIÓN

La entrada de datos por parte del usuario se ha realizado usando un sensor de infrarrojos y un mando. Para el envío de información, el usuario introduce primero el número de jugadores y seguidamente el de cartas. En este proceso el usuario podrá saber el estado del procesamiento de su petición con la ayuda de dos LEDs para indicar el estado del sistema (procesando, idle, etcétera). La parte más importante de la implementación es el reparto de cartas, esto se ha realizado poniendo un soporte de cartas sobre un motor de paso.

El soporte gira para repartir a cada jugador una carta y se activa en cada jugador un motor que está en el soporte, que acciona un par de ruedas que lanzan la carta.

LOS PASOS DADOS

1.- Fase de diseño: descripción de lo que se quiere hacer. En esta fase delineamos la funcionalidad general y cómo vamos a hacer que se interactúe 

2.- Giro del motor: calibrar el step motor para que divida la vuelta entre el número de jugadores.

3.- Giro del motor auxiliar: hacer que el motor continuo gire cuando el step motor se detiene.

4.- Adición de la componente infrarroja: calibrado del mando en el código y asegurarse que las señales se reciben y procesan adecuadamente.

5.- Adición del repartidor al step motor: vincular la estructura de repartición de cartas con el step motor sin montar la estructura completamente. Esto nos permite cerciorarnos de que el motor es capaz de hacer girar a la estructura superior.

6.- Adición de diodos led que muestra la respuesta del sistema al recibir cada una de las señales.

7.- Realización de la caja dedicada a ocultar los cables. También se realiza una abertura para poder extraer los diodos y el receptor de infrarrojos.

REPARTO DE TAREAS

Todas las tareas realizadas se han hecho en grupo y ninguno ha tenido momentos en el que avanzase en el trabajo sin supervisión y/o ayuda de otro compañero.

PRESUPUESTO

El único material que hemos comprado es el cartón pluma y la silicona. El soporte para las cartas ha sido reciclado, por lo que vamos a estimar su coste. Además, vamos a incluir también los materiales proporcionados por la universidad:

  • Arduino UNO ELEGOO + cables => 19,49€
  • Stepper Motor => 2,60 €
  • DC Motor => 1,00 €
  • IR Receptor => 1,40 €
  • Cartón Pluma => 5,00 €
  • Silicona => 1,00 €
  • Protoboard, diodos y cables => 3,00 €
  • Estimación soporte de cartas => 4,00 €

TOTAL: 37,49 €

Para reducir costes sería sencillo cambiar la marca de la placa Arduino, que se pueden encontrar a precios como 3€.

CASOS DE USO

Describimos el único caso de uso, repartir las cartas:El prototipo empieza a recibir alimentación. Como consecuencia de ello, se enciende el diodo verde que indica que estamos a la espera de recibir el número de jugadores.El jugador introduce el número de jugadores al sistema. Para indicar que cada número se ha recibido correctamente, un diodo rojo se enciende. Una vez este diodo se apaga, se puede o bien seguir introduciendo otro número (por ejemplo, el cero si se tienen 10 jugadores) o bien fijar la información (con el botón de Play/Pause).Una vez se fija la información, el diodo verde parpadeará y volverá a encenderse para indicar que se está a la espera del número de cartas para cada jugador.Se introduce la información relativa al número de cartas siguiendo la misma técnica que para el número de jugadores.

PROBLEMAS Y SOLUCIONES ENCONTRADAS

El problema más inmediato ha sido la gestión de los cables. Encerrando los cables en una caja, evitamos que el usuario pueda desconectar los cables y comprometer el funcionamiento del sistema.

Esto creaba a su vez el problema de que los infrarrojos lanzados por el mando podrían no atravesar la caja y, por otro lado, que los diodos utilizados para representar el estado del sistema no se pudiesen ver. Haciendo una abertura en la caja para poder extraer ambos componentes resolvimos este problema.

Otro problema que hemos tenido ha sido el rozamiento del sistema de repartición de cartas con la base de la caja que contendría los cables. La solución ha pasado por independizar la sección de la caja que incluye los cables de la sección que incluye el mecanismo lanzador de la caja, utilizando el step motor como único nexo de unión.

Para evitar que con el giro del prototipo los cables se enrosquen, hemos hecho que el sistema haga cada vez una vuelta en cada sentido.Por último, el problema al que más tiempo hemos dedicado ha sido el de asegurar que a cada jugador se le reparte una carta en cada giro. Tras intentar calibrar un tiempo adecuado de giro para el prototipo, concluimos que había una componente de aleatoriedad que no podíamos ignorar dado el montaje que se realizó.

Probablemente el problema se podría haber atacado realizando el giro desde la parte superior del taco de cartas. De tal forma, podríamos asegurar que la presión aplicada al mazo es la adecuada en todo momento. Por otro lado, el uso de un step motor adicional podría haber evitado que tras lanzar una carta otra quedase a mitad de camino al producir un breve retroceso tras cada lanzamiento.

VIDEO EXPLICATIVO Y DEMO

EL CÓDIGO

#include <IRremote.h>
#define IN1 8
#define IN2 9
#define IN3 10
#define IN4 11

int Paso [ 8 ][ 4 ] =
{ {1, 0, 0, 0},
{1, 1, 0, 0},
{0, 1, 0, 0},
{0, 1, 1, 0},
{0, 0, 1, 0},
{0, 0, 1, 1},
{0, 0, 0, 1},
{1, 0, 0, 1}
};

const int vuelta = 4095;
int steps_left = 0;
boolean Direction = true;
int Steps = 0;    // Define el paso actual de la secuencia
int motorPin = 12;
int led2Pin = 5;
int ledPin = 13;
const long KEY_0 = 16738455;
const long KEY_1 = 16724175;
const long KEY_2 = 16718055;
const long KEY_3 = 16743045;
const long KEY_4 = 16716015;
const long KEY_5 = 16726215;
const long KEY_6 = 16734885;
const long KEY_7 = 16728765;
const long KEY_8 = 16730805;
const long KEY_9 = 16732845;
const long KEY_PLAY = 16712445;
const long KEY_STOP = 16769565;
const long KEY_REPEAT = 4294967295;

const int RECV_PIN = 7;


IRrecv irrecv(RECV_PIN);
decode_results results;

void setup()
{
    Serial.begin(9600);
    pinMode(IN1, OUTPUT);
    pinMode(IN2, OUTPUT);
    pinMode(IN3, OUTPUT);
    pinMode(IN4, OUTPUT);
    pinMode(motorPin, OUTPUT);
    pinMode(ledPin, OUTPUT);
    pinMode(led2Pin,OUTPUT);
    irrecv.enableIRIn();
}

int getNumeroPulsado(long codigoInfrarrojo) { // Traducción del código infrarrojo a un código
    switch(codigoInfrarrojo) {
        case KEY_0: {
            return 0;
        }
        case KEY_1: {
            return 1;
        }
        case KEY_2: {
            return 2;
        }
        case KEY_3: {
            return 3;
        }
        case KEY_4: {
            return 4;
        }
        case KEY_5: {
            return 5;
        }
        case KEY_6: {
            return 6;
        }
        case KEY_7: {
            return 7;
        }
        case KEY_8: {
            return 8;
        }
        case KEY_9: {
            return 9;
        }
        case KEY_PLAY: {
            return -1;
        }
        case KEY_STOP: {
            return -2;
        }
        default: {
            return -3;
        }
    }
}

int numeroJugadores() {

}

void loop()
{
    digitalWrite(ledPin, LOW);
    digitalWrite(led2Pin, LOW);
    int numeroJugadores = 0;
    int numeroCartas = 0;
    int numeroPulsado = 0;
    Serial.println("SELECCIONAR NÚMERO DE JUGADORES");
    digitalWrite(ledPin, HIGH);
    while(numeroPulsado != -1) {// get número de jugadores
        if (irrecv.decode(&results))
        {
            numeroPulsado = getNumeroPulsado(results.value);
            irrecv.resume();
            if (numeroPulsado < 0) continue;
            numeroJugadores = numeroJugadores * 10 + getNumeroPulsado(results.value);
            digitalWrite(led2Pin, HIGH);
            delay(500);
            digitalWrite(led2Pin, LOW);
            Serial.println(numeroJugadores);
        }
    }
    digitalWrite(ledPin, LOW);
    delay(500);

    Serial.println("SELECCIONAR NUMERO DE CARTAS");
    digitalWrite(ledPin, HIGH);

    numeroPulsado = 0;
    while(numeroPulsado != -1) { // get número de jugadores
        if (irrecv.decode(&results))
        {
            numeroPulsado = getNumeroPulsado(results.value);
            irrecv.resume();
            if (numeroPulsado < 0) continue;
            numeroCartas = numeroCartas * 10 + getNumeroPulsado(results.value);
            digitalWrite(led2Pin, HIGH);
            delay(500);
            digitalWrite(led2Pin, LOW);
            Serial.println(numeroCartas);
        }
    }

    digitalWrite(ledPin, LOW);

    Serial.println("Número de jugadores escogido");
    Serial.println(numeroJugadores);
    Serial.println("Número de cartas");
    Serial.println(numeroCartas);

    // Calcular lo de las vueltas o algo así
    int tini = 79;
    int cont = 0;
    for(int i = 0; i < numeroCartas; i++) {
        for (int j = 0; j < numeroJugadores; j++) {
            steps_left= vuelta/numeroJugadores;
            while (steps_left > 0)
            {
                stepper() ;     // Avanza un paso
                steps_left-- ;  // Un paso menos
                delay (1) ;
            }
            digitalWrite(motorPin, HIGH);
            delay(tini);
            digitalWrite(motorPin, LOW);
            cont++;
            if(cont%3==0)  tini--;
        }
        Direction = ! Direction; // Invertimos la direceccion de giro para que no se "ahorque" con los cables
        //steps_left = 1024;

    }

}

void stepper()            //Avanza un paso
{
    digitalWrite( IN1, Paso[Steps][ 0] );
    digitalWrite( IN2, Paso[Steps][ 1] );
    digitalWrite( IN3, Paso[Steps][ 2] );
    digitalWrite( IN4, Paso[Steps][ 3] );

    SetDirection();
}

void SetDirection()
{
    if (Direction)
        Steps++;
    else
        Steps--;

    Steps = ( Steps + 8 ) % 8 ;
}

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 *