Danceduino
Somos el grupo 15 formado por Daniel Jiménez Uceda, Alejandro Martín-Sonseca Sánchez, Miguel Herrero Montiel y David de Pablo Crespo.
Nuestro proyecto consiste en un tablón de contrachapado con botones el cual permite simular teclas de un teclado a modo de mando para poder jugar a juegos del estilo recreativo que no requieran de muchos controles como pueden ser juegos de ritmo (Stepmania u Osu) o juegos arcade (Pacman, tetris) y donde puedas remapear los controles. En nuestro proyecto hemos orientado el diseño para juegos de ritmo en este caso, Stepmania, muy similar al conocido juego Dance Dance Revolution pero con botones.
Pasos seguidos para la realización
Para la implementación pensamos en construir un circuito con los botones necesarios para el juego elegido de tal manera que los botones tengan asignados las teclas correspondientes a dicho juego. El primer paso fue elegir cuál iba a ser el diseño y cómo íbamos a enfocar el mismo. Para ello hicimos varios bocetos y buscamos en internet posibles ideas. Una vez decidido el diseño, comenzamos por buscar los materiales que íbamos a necesitar para llevarlo a cabo.
MATERIALES |
Contrachapado de madera de roble |
9 Botones Arcade de colores |
Pintura(Spray y témperas) |
Cables de cocodrilo |
Kit de componentes electrónicos |
2 Rotuladores permanente Edding |
Arduino Leonardo |
Kit de Arduino URJC |
Cuando compramos los materiales, comenzamos por diseñar el código y montar un circuito con botones pequeños para comprobar que el mismo funcionaba correctamente antes de implementarlo en el proyecto final.
El diseño del código fue ameno y sin muchas incidencias, al igual que el montaje del circuito de prueba, aunque tuvimos incidencias con la placa de arduino que explicaremos más adelante.
Una vez probado el circuito y viendo que funcionaba correctamente, procedimos a realizar la estructura principal. Para ello cortamos las tablas de madera con el tamaño adecuado y comenzamos a realizar diseño artístico sobre la misma, dibujando flechas donde iban a ir ubicados los botones, añadiendo algunos elementos de decoración y cortando agujeros para los botones.
Una vez realizado todo el trabajo de manualidad, insertamos los botones y montamos el circuito final para comenzar las pruebas.
Circuito
Al terminar de montar el circuito, comprobamos de nuevo que seguía funcionando y realizamos pruebas con diferentes juegos y situaciones para comprobar que todo estaba correctamente.
Finalmente, realizamos el video explicativo de la parte de hardware, software, el diseño y los casos de uso.
Problemas y soluciones encontradas
A la hora de diseñar y probar el código en un circuito, nos surgió un problema con la placa de Arduino Uno, ya que a pesar de que se conectaba al ordenador este no la identificaba a pesar de tener los drivers bien instalados. Después de consultar a los profesores e investigar, decidimos comprar otra placa pero ahora Arduino Leonardo, la cual era más sencilla para nuestro código.
Vídeo Explicativo
Código
#include <Keyboard.h>
int playerOneUpStatus=1;
int playerOneUpStatusPrev=1;
int playerOneLeftStatus=1;
int playerOneLeftStatusPrev=1;
int playerOneDownStatus=1;
int playerOneDownStatusPrev=1;
int playerOneRightStatus=1;
int playerOneRightStatusPrev=1;
int playerTwoUpStatus=1;
int playerTwoUpStatusPrev=1;
int playerTwoLeftStatus=1;
int playerTwoLeftStatusPrev=1;
int playerTwoDownStatus=1;
int playerTwoDownStatusPrev=1;
int playerTwoRightStatus=1;
int playerTwoRightStatusPrev=1;
int enterStatus=1;
int enterStatusPrev=1;
void setup()
{
pinMode(4,INPUT_PULLUP);
pinMode(5,INPUT_PULLUP);
pinMode(6,INPUT_PULLUP);
pinMode(7,INPUT_PULLUP);
pinMode(8,INPUT_PULLUP);
pinMode(9,INPUT_PULLUP);
pinMode(10,INPUT_PULLUP);
pinMode(11,INPUT_PULLUP);
pinMode(12,INPUT_PULLUP);
Keyboard.begin();
}
void loop()
{
playerOneRightStatus=digitalRead(8);
playerOneUpStatus=digitalRead(9);
playerOneDownStatus=digitalRead(10);
playerOneLeftStatus=digitalRead(11);
playerTwoRightStatus=digitalRead(4);
playerTwoUpStatus=digitalRead(5);
playerTwoDownStatus=digitalRead(6);
playerTwoLeftStatus=digitalRead(7);
enterStatus=digitalRead(12);
//JUGADOR UNO FLECHA DE ARRIBA PULSADA
if (playerOneUpStatus!=playerOneUpStatusPrev && playerOneUpStatus==LOW)
{
Keyboard.press('w');
playerOneUpStatusPrev=playerOneUpStatus;
}
//JUGADOR UNO FLECHA DE ARRIBA NO PULSADA
if (playerOneUpStatus!=playerOneUpStatusPrev && playerOneUpStatus==HIGH)
{
Keyboard.release('w');
playerOneUpStatusPrev=playerOneUpStatus;
}
//JUGADOR UNO FLECHA IZQUIERDA PULSADA
if (playerOneLeftStatus!=playerOneLeftStatusPrev && playerOneLeftStatus==LOW)
{
Keyboard.press('a');
playerOneLeftStatusPrev=playerOneLeftStatus;
}
//JUGADOR UNO FLECHA IZQUIERDA PULSADA
if (playerOneLeftStatus!=playerOneLeftStatusPrev && playerOneLeftStatus==HIGH)
{
Keyboard.release('a');
playerOneLeftStatusPrev=playerOneLeftStatus;
}
//JUGADOR UNO FLECHA DE ABAJO PULSADA
if (playerOneDownStatus!=playerOneDownStatusPrev && playerOneDownStatus==LOW)
{
Keyboard.press('s');
playerOneDownStatusPrev=playerOneDownStatus;
}
//JUGADOR UNO FLECHA DE ABAJO NO PULSADA
if (playerOneDownStatus!=playerOneDownStatusPrev && playerOneDownStatus==HIGH)
{
Keyboard.release('s');
playerOneDownStatusPrev=playerOneDownStatus;
}
//JUGADOR UNO FLECHA DERECHA PULSADA
if (playerOneRightStatus!=playerOneRightStatusPrev && playerOneRightStatus==LOW)
{
Keyboard.press('d');
playerOneRightStatusPrev=playerOneRightStatus;
}
//JUGADOR UNO FLECHA DERECHA NO PULSADA
if (playerOneRightStatus!=playerOneRightStatusPrev && playerOneRightStatus==HIGH)
{
Keyboard.release('d');
playerOneRightStatusPrev=playerOneRightStatus;
}
//JUGADOR DOS FLECHA DE ARRIBA PULSADA
if (playerTwoUpStatus!=playerTwoUpStatusPrev && playerTwoUpStatus==LOW)
{
Keyboard.press(KEY_UP_ARROW);
playerTwoUpStatusPrev=playerTwoUpStatus;
}
//JUGADOR DOS FLECHA DE ARRIBA NO PULSADA
if (playerTwoUpStatus!=playerTwoUpStatusPrev && playerTwoUpStatus==HIGH)
{
Keyboard.release(KEY_UP_ARROW);
playerTwoUpStatusPrev=playerTwoUpStatus;
}
//JUGADOR DOS FLECHA IZQUIERDA PULSADA
if (playerTwoLeftStatus!=playerTwoLeftStatusPrev && playerTwoLeftStatus==LOW)
{
Keyboard.press(KEY_LEFT_ARROW);
playerTwoLeftStatusPrev=playerTwoLeftStatus;
}
//JUGADOR DOS FLECHA IZQUIERDA NO PULSADA
if (playerTwoLeftStatus!=playerTwoLeftStatusPrev && playerTwoLeftStatus==HIGH)
{
Keyboard.release(KEY_LEFT_ARROW);
playerTwoLeftStatusPrev=playerTwoLeftStatus;
}
//JUGADOR DOS FLECHA DE ABAJO PULSADA
if (playerTwoDownStatus!=playerTwoDownStatusPrev && playerTwoDownStatus==LOW)
{
Keyboard.press(KEY_DOWN_ARROW);
playerTwoDownStatusPrev=playerTwoDownStatus;
}
//JUGADOR DOS FLECHA DE ABAJO NO PULSADA
if (playerTwoDownStatus!=playerTwoDownStatusPrev && playerTwoDownStatus==HIGH)
{
Keyboard.release(KEY_DOWN_ARROW);
playerTwoDownStatusPrev=playerTwoDownStatus;
}
//JUGADOR DOS FLECHA DERECHA PULSADA
if (playerTwoRightStatus!=playerTwoRightStatusPrev && playerTwoRightStatus==LOW)
{
Keyboard.press(KEY_RIGHT_ARROW);
playerTwoRightStatusPrev=playerTwoRightStatus;
}
//JUGADOR DOS FLECHA DERECHA NO PULSADA
if (playerTwoRightStatus!=playerTwoRightStatusPrev && playerTwoRightStatus==HIGH)
{
Keyboard.release(KEY_RIGHT_ARROW);
playerTwoRightStatusPrev=playerTwoRightStatus;
}
//START PULSADO
if (enterStatus!=enterStatusPrev && enterStatus==LOW)
{
Keyboard.press(KEY_RETURN);
enterStatusPrev=enterStatus;
}
//START NO PULSADO
if (enterStatus!=enterStatusPrev && enterStatus==HIGH)
{
Keyboard.release(KEY_RETURN);
enterStatusPrev=enterStatus;
}
}