Introduction: GatoPad

Este instructable esta basado en el Instructable original subido por origamiwolf. A diferencia del instructable original, este se encuentra modificado, para que el juego sea entre dos jugadores, osea para que existan dos pads que se comuniquen, y se comporten idénticamente por lo tanto se pueda puedan jugar wireless (la distancia dependerá del poder de la Xbee a utilizar).

Recomiendo leer las instrucciones originales si la intención es realizar solo un pad (y si hablas inglés).

Créditos a Luis Fuentes Rios, por el desarrollo de los códigos para la comunicacion entre pads y por su ayuda en la traducción técnica del documento original.

Step 1: Materiales

2 Xbee S1 o S2

Xbee Explorer Dongle (o un Arduino UNO)

2 Xbee Breakout Board

2 Arduino UNO (o ethernet, o cualquiera)

18 Leds bicolor, o 36 Leds (18 azules y 18 rojas, o cualquier color). De alto brillo

12 Resistencias entre 10kohm y 500kohm (todos deben ser iguales)

18 Resistencias entre 100ohm y 220ohm (todas deben ser iguales)

2 Fuentes de poder de 5 volts, idealmente baterias (pueden ser baterías para cargar celular)

MDF 5,5mm

Acrilico 3mm

Jumpers hembra mayor a 23cm (para rompert)

Cable solid core

Herramientas para soldar

Cinta adhesiva de Cobre (o hoja de cobre)

Espuma (o material esponjoso)

Placa para soldar

Step 2: Cableando La Matriz De LEDs

Primero vamos a construir la matriz de LEDs, cuando lo hagamos, podemos hacerlo sobre el pad ya diseñado, en el archivo listo para cortar. Si no tienes la intención de armar la caja al pie de la letra, puedes usar una mica o cualquier tipo de superficie firme que no sea conductiva.

Para que se encienda un LED, ambos cables deben estar conectados. Si dedicáramos un par de pines a cada uno de los 18 LEDs (9 rojos y 9 verdes), rápidamente se nos acabarían los pines del Arduino. Sin embargo, haciendo multiplexing seremos capaces de controlar todos los LEDs con solo 9 pines.

Para hacer esto, los LEDs están cableados en forma de cruz, como lo muestra la primera figura. Los ánodos de los LEDs están agrupados en columnas de 6, y sus cátodos están agrupados en filas de 3.

Configurando una línea del ánodo en HIGH, y una línea particular del catodo en LOW, podemos seleccionar que LED queremos encender, ya que existe un solo camino posible que puede tomar la corriente.

Por ejemplo, en la segunda figura, configurando la línea del anodo verde en HIGH, y la Línea 1 del cátodo en LOW, el LED de abajo a la izquierda se enciende. El camino que toma la corriente en este caso se muestra en color azul.

¿Pero qué pasa si queremos iluminar más de un LED en líneas diferente? Para lograr esto usaremos “persistencia de la visión”. Seleccionando pares de líneas de LEDs muy rápido, da la ilusión de que todos los LEDs seleccionados están siendo encendidos al mismo tiempo.

(Configuracion xbees)

Cableo

Testeo del cableo

Shield

Hacer la grid

Multiplexing

Step 3: Matriz De Disposición De LEDS

El diagrama de circuitos de la imagen de arriba muestra como los LEDs son cableados físicamente (G1-G9: LEDs verdes, R1-R9: LEDs rojos). Este diagrama es para un solo LED (rojo y verde), si estas usando un LED bicolor con catodo común rojo/verde, hay solo un catodo por patita que hay que conectar.

Las líneas análogas rojo y verde van a los pins PWM del Arduino (que son los pins 3,5,6,9,10,11 del UNO) para que podamos tener efectos de desvanecimiento más adelante.

A cada línea de ánodos y catodos se le conecta una resistencia de 100 Ohms a modo de protección.

Step 4: Construir La Matriz De LEDs

Para el código de "El Gato",
necesitaremos ser capaces de guardar la siguiente información sobre los LEDs:

- Si el LED está o no encendido.

- Si está encendido, debemos saber si es verde o rojo.

Una forma de hacer esto es guardar el estado de la matriz de 9 celdas usando tres dígitos para representar el estado (0 = apagado, 1 = rojo encendido, 2 = verde encendido).

Cada vez que necesitemos chequear el estado de los LEDs, por ejemplo, chequear si hay alguna condición de ganador, necesitaremos hacer el ciclo a través de la Matriz. Este es un método que funciona pero es un poco torpe.

Un método un poco más racional, seria usar dos grupos de 9 bits. El primer grupo de nueve bits guarda el estado On-Off de los LEDs, y el segundo grupo de 9 bits guarda el color. Entonces manipular los estados de los LEDs simplemente se convierte en un asunto de aritmética de bits y desplazamiento.

Aquí hay un ejemplo más trabajado. Digamos que dibujamos nuestro juego en una cuadricula, y primero usamos 1 y 0 para representar el estado On-Off (1 es On, 0 es Off).

000
000 = matriz con el LED de abajo a la izquierda encendido
100

100
010 = matriz con LEDs diagonales encendidos
001

Si enumeramos las celdas desde abajo a la izquierda, podemos escribir sobre representaciones como series de bits, en el primer caso este seria 100000000, y en el segundo, seria 001010100. Si pensamos en estos como representaciones binarias, entonces cada serie de bits puede ser resumida en un solo número (256 en el primer caso, 84 en el segundo caso). Entonces, en vez de usar una matriz para guardar el estado de la matriz podemos utilizar solamente un número!

De forma similar, podernos representar el color del LED (1 es rojo y 0 es verde).

Asumamos primero que los LEDs están encendidos (así el estado On-Off está representado por 511). La matriz de abajo entonces representa el estado del color de los LEDs:

010 verde, rojo, verde

101 rojo, verde, rojo

010 verde, rojo, verde

Ahora, cuando se muestra la matriz de LEDs, hemos justo empezado a hacer el ciclo en cada bit, primero en el estado On-Off y después en el estado del color. Por ejemplo, digamos que nuestro estado On-Off es 100100100, y el estado del color es 010101010.

Acá esta nuestro algoritmo para encender la matriz de LEDs:

Paso 1: Hacer una adición bit a bit del estado encendido y apagado con un binario 1 (es decir enmascaramiento de bits)

Paso 2: Si es verdadero, el LED está encendido. Ahora hacer una adición bit a bit del estado del color con un 1 binario.

Paso 3: Si es verdadero, se enciende el LED rojo y si es falso, se enciende el LED verde.

Paso 4: Desplazamos los estados On-Off y el estado del color un bit a la derecha.

Paso 5: Repetir los pasos 1-4 hasta que los 9 bits hayan sido leídos.

Nótese que estamos llenando la matriz al revés empezamos con la celda 9 y luego procedemos de nuevo a la celda 1.

El estado On-Off y el estado color son guardados como un tipo entero sin signo (como una palabra). Eso es porque en el desplazamiento de bits si no somos cuidadosos, puede ser que accidentalmente cambie el signo de la variable.

Adjunto está el código para iluminar la matriz de LEDs. LED_matrix.pde 1 KB

Step 5: Construcción Del Touchpad

El Touchpad va sobra la pieza de los LEDs, en la imagen es la pieza transparente, esta debe ser transparente para que pase la luz.

Utilizamos los Jumpers hembra largos, en este caso deben tener por lo menos 27 centímetros. Se corta uno de los extremos y se pela todo el cable, cuando tengas el cable pelado, veras que hay cables más pequeños, conserva solo uno y pásalo a lo largo del arílico por las aberturas. Esto a lo largo y ancho del Pad. Los cables nunca deben tocarse, los horizontales pasar por sobre el Pad y los verticales por debajo.

Luego utilizaremos los jumpers machos que vendrán desde el Arduino, estos deberán pasar por una resistencia, que puede ir entre 10k y 1M, deben ser todas iguales.

Las conexiones al Arduino necesitan de 6 pins análogos, con los pins 14, 15 y 16 conectamos las filas y el 17, 18 y 19 las columnas.

Step 6: Funcionamiento Del Touchpad

Al igual como lo hicimos con la matriz de LEDs, también utilizaremos Multiplexing para lograr ahorrar pins en el Touchpad.

El concepto para este Touchpad es simple. Es escencialmente una matriz de cables, 3 cables posicionados como columnas y tres posicionados como filas, generando una interseccion entre ellos. En casa interseccion, hay un par de hoyos en el acrilico que permiten que uno de los cables pase por abajo y el otro por arriba, evitando así que se toquen entre ellos. Tocar la interseccion con un dedo hará que ambos cables se toquen y hagan contacto, resultando en una gran, pero finita, resistencia entre los dos cables. En el Touchpad ese contacto entre cables no será realizado con los dedos si no que con un botón diseñado especialmente para que ambos cables hagan contacto entre ellos (en el siguiente Paso sabrás como fabricar estos botones). Una pequeña corriente, pero suficiente para ser detectada, fluye de un cable al otro a través de tu dedo o en el caso del Touchpad, a través del botón. Para determinar que intereseccion fue presionada, el siguiente metodo fue utilizado:

Paso 1: Configurar todas las columnas como OUTPUT LOW.
Paso 2: Configurar todas las filas como INPUT, con los "internal pullups" activados.
Paso 3: Tomar una lectura analoga para casa fila hasta que el valor leido quede por debajo del umbral definido. Esto te dirá en que fila la interseccion fue presionada.
Paso 4: Repite los pasos 1-3, pero ahora con las columnas como inputs y las filas como outputs. Esto te dirá que en que columna la interseccion fue presionada. Para minimizar el ruido que se puede generar, se toma una cantidad de lecturas y luego se saca un promedio de ellas. El promedio resultado es luego comparado contra el umbral definido. Como este metodo solo compara contra el umbral, no es posible presionar simultanemente. Sin embargo, dado que el "El Gato" es un juego que se juego por turnos, una lectura a la vez es suficiente. Adjunto encontrarás un ilustración mostrando como funciona el Touchpad.

Step 7: Botones

Los botones ya vienen diseñados en el archivo adjunto, solo tienes que cortar las piezas que aparecen. Debes considerar que los botones no son del mismo tamaño por lo tanto es importante respetar el orden que su grabado indica.

Una vez que que tengas la piezas cortadas, debes pegar el pequeño marco en el sector centrar demarcado. Una vez secos, corta tu cinta de cobra (o papel de cobre) según la forma que tiene este marco. Puedes usar una maquina de corte de vinilo para ser exactos. Usa el mismo archivo de corte y extrae las piezas que corresponden al marco y así serás más exacto. Luego pega este cobre en el marco y tendrás listo el mecanismo que permite que ambos cables entren en contacto.

Finalmente toma tu material esponjoso y pega tiras delgadas en todo el contorno del botón por la parta inferior, esto permitida que al presionarlo exista la sensación de esta presionando un verdadero botón.

Step 8: Armar Todo

Ahora que todos los componentes individuales están listos, es hora de ponerlos todos juntos.

Hay que superponer la malla de alambre sobre la matriz de LEDs, quizás necesites reordenar las numeraciones de los pines en la matriz del código LED para tenerlo sincronizado con los espacios de la rejilla del Touchpad.

Añade un interruptor entre el pin 12 y la masa (tierra) del Arduino. Este interruptor es para alternar entre el modo de dos jugadores y el modo de un jugador (humano versus microcontrolador).

Step 9: Programando El Gato (un Solo Módulo)

Adjunto está el código para el juego.

Primero dividamos el gato en varios pasos. Para el modo de dos jugadores:

Paso 1: El jugador A elije una celda vacía tocando una intersección

Paso 2: El LED de esa celda se ilumina con el color A

Paso 3: Chequear si el jugador A ha ganado

Paso 4: El jugador B elije una celda vacía tocando una intersección

Paso 5: El LED de esa celda se ilumina con el color B

Paso 6: Chequear si el jugador B ha ganado

Paso 7: Repetir los pasos desde el 1 al 6 hasta que exista la condición para ganar o hasta que todas las celas estén llenas.

Leyendo las celdas:

El programa hace un loop entre leer la rejilla y encender los LEDs. Siempre y cuando el sensor de la rejilla (el touch pad) no registe un valor distinto de cero este loop continuara. Cuando una intersección es presionada en la rejilla la variable presionada guarda la posición de la celda presionada.

Chequear si la celda está vacía:

Cuando una posición de lectura es obtenida (variable presionada), es comparada contrastando el estado actual de la celda (guardada en la variable Grid On-Off) usando una adición bit a bit. Si la celda presionada está vacía, entonces proceder a encender el LED, de lo contrario regresar a leer las celdas.

Alternando los colores:

Una variable booleana “Turn”, es usada para almacenar a quien le toca jugar. El color del LED elegido cuando una celda es escogida es determinado por esta variable, que alterna cada vez que se elige una celda.

Chequeando la condición de ganador

Sólo hay 8 posibles condiciones de victoria y estos se almacenan como variables de palabras en una matriz (winArray). Dos adiciones a nivel de bits se utilizan para comparar las posiciones de celdas llenas de un jugador con las condiciones de victoria. Si hay una coincidencia, entonces el programa muestra una rutina de triunfo, después del cual se inicia un nuevo juego.

Chequeando una condición de empate

Cuando se han guardado nueve rutinas y todavía no hay una condición de victoria, el juego es un empate. Los LEDs entonces hacen un efecto de desvanecimiento y comienza un nuevo juego

Cambio al modo de un jugador:

Si el interruptor está en la posición ON, el programa entra en modo 1 jugador con el jugador humano comenzando la partida. Al final del turno de este jugador, el programa simplemente elige una celda al azar. Obviamente esta no es la estrategia más inteligente!

Step 10: Configurar Xbee

Para configurar una xbee debes tener un xbee dongle, o puedes usar la versión más económica que es tomar un arduino uno y sacar su procesador. Existen varios instructivos para hacer que dos Xbee se comuniquen, busca según el modelo de Xbee que tengas y prueba la conexión, una vez que los xbees estén comunicándose podemos hacer cambios en el código de arduino para que envíe y reciba datos entre los pads.

Step 11: Conectar Xbee Y Probar El Juego

Una vez que te asegures que tus Xbee se comunican, debes subir los siguientes códigos, uno por cada Pad. Prueba su funcionamiento y listo! a Jugar