Hacer un tablero de ajedrez electrónico

Quiero hacer un tablero de ajedrez de madera en el que puedas jugar con piezas normales (es decir, piezas no modificadas que utilicen códigos RFID, imanes,...), pero que esté conectado a un software que tome nota de mis movimientos y actúe como el segundo jugador

He estado pensando en cómo detectar piezas en el tablero y he tomado la decisión de que no necesito reconocer qué pieza está dónde: La "verdad" está dentro del software, así que si muevo una pieza de A a B , el software puede averiguar qué pieza se movió.

Entonces, tuve la idea de perforar dos agujeros en cada campo del tablero de ajedrez, uno en el centro y otro en la esquina superior derecha:

  • El del centro se utilizará como sensor de brillo para detectar si una pieza está parada en el campo o no.
  • El que está en la esquina se usará como un LED para mostrar qué pieza debe mover el usuario para la computadora, de modo que la situación del mundo real coincida nuevamente con la situación del software.

Quiero usar una Raspberry Pi como base de hardware para que se ejecute el software, que se escribirá en Node.js (pero eso no debería ser importante para esta pregunta).

Entonces, termino con 64 sensores de brillo y 64 LED, que necesito abordar individualmente. En otras palabras: necesito 64 salidas y 64 entradas. Y, por supuesto, esto es algo que una Raspberry Pi no maneja desde el primer momento, y creo que tiene que haber una mejor manera que tener 128 puertos de E/S.

Como creo que detectar el estado de la placa es la tarea más importante, comencé a buscar en la web cómo manejar una matriz de interruptores de 8x8. Encontré la sugerencia de usar un microcontrolador que escanea las columnas del tablero secuencialmente, y en cada columna detecta si se usa una fila (= un campo) o no.

Esto reduciría la complejidad a tener 8 salidas y 8 entradas (para poder leer el estado de la placa).

Sobre esto, tengo algunas preguntas:

  1. ¿Mis pensamientos son correctos, es decir, es este el enfoque correcto, o hay una mejor alternativa que debo tener en cuenta?
  2. Como no tengo experiencia con microcontroladores, ¿qué debo tener en cuenta? ¿Solo necesito un microcontrolador con 16 pines, que sea programable en un lenguaje que pueda escribir, o...?
  3. ¿Alguien ha construido una placa de este tipo y tiene algún consejo o conoce un tutorial que lo guíe a través del proceso?
Tienes la idea correcta. Sin embargo, se necesitará un poco de refinamiento en la aplicación de detección. Dependiendo del tamaño y peso de las piezas se puede utilizar un esquema de detección de bloqueo de luz o botón táctil. La verdadera pregunta aquí es ¿cómo vas a saber qué pieza es qué? Probablemente va a necesitar piezas personalizadas también. ¿Quizás poner una etiqueta RFID en cada uno y luego cada cuadrado tiene un escáner RFID? Excesivo, pero un pensamiento.
El enrutamiento de escaneo de matriz que describe no podrá hacer frente a tener 4 piezas en 2 filas y 2 columnas. Mire los decodificadores de 3-8 líneas (74138) y extrapole a 5-64
La alineación inicial de las piezas es siempre la misma, por lo que el software sabe qué pieza está dónde. Si luego mueve una pieza de A a B, el software sabe qué pieza se ha movido a dónde. Por supuesto, esto no permite comenzar con alineaciones arbitrarias, pero también puede configurarlo manualmente en el software.
Esto parece... engorroso. Habría ido con un método de video de software. OpenCV y una cámara. Y un proyector.
@Golo Roden: pero la computadora no sabe qué pieza estás moviendo. Si tres piezas pueden terminar en el espacio al que te mueves, ¿cómo sabe la computadora cuál está allí?
La computadora no solo se da cuenta del campo al que se mueve, sino también del campo del que se movió (porque cambia de usado a no usado).
@Passerby Pensamiento interesante también, gracias por la entrada :-)
y un brazo robot para mover la pieza de la computadora :-)
Considere incrustar un imán en la parte inferior de cada pieza y usar un interruptor de lengüeta debajo de cada cuadrado. Muy fácil de cablear para matriz. El software necesitaría emitir un pitido si una pieza no vuelve a aparecer en el tablero en un tiempo razonable, ya que puede estar lo suficientemente descentrada como para no activar el sensor.
esta guía puede ser útil en cuanto a la organización de sensores/detección
Considere usar un sensor de luz i2c como este de Avago , como se usa en los teléfonos inteligentes. Puede conectarlos todos a un bus y simplemente leerlos desde el Pi.
@GoloRoden, ¿construiste un tablero? ¿podemos ver el resultado final por favor? Gracias

Respuestas (5)

Como una imagen vale más que mil palabras, aquí hay un ejemplo de LDM-24488NI : una matriz de 64 leds

ingrese la descripción de la imagen aquí

Para su aplicación, necesitará una matriz de este tipo para LED y otra para sensores, lo que requiere un total de 32 pines IO. Dado que su RPi no tiene tantos, tendrá que usar demux de 1 a 8 para seleccionar filas y columnas individuales:

ingrese la descripción de la imagen aquí

Para los LED, puede usar demultiplexores tanto para filas como para columnas, ya que solo necesita un LED a la vez. Para sensores, recomendaría usar un demux para filas y líneas individuales para columnas, para poder detectar múltiples sensores activos en una fila. Eso llevará el número de pines requerido a 17 pines, que un RPi puede manejar.

Sí, la multiplexación como usted describe es una forma común de abordar matrices de cosas.

La parte más complicada será lidiar con la naturaleza analógica de los sensores de luz. Los CdS LDR (resistencias dependientes de la luz) son probablemente los mejores en este caso porque son sensibles, baratos y producen una gran respuesta fácilmente medible en el rango de luminosidad humana. Eléctricamente, son resistencias, y la resistencia disminuye con la luz más brillante.

Simplificaría la multiplexación si usa un micro que tiene 8 entradas analógicas. Eso significa que la mitad de tu mux está integrado en el micro. Habilita una fila de LDR y lee las señales de 8 columnas directamente con el micro, por ejemplo.

El escaneo secuencial de 64 entradas analógicas se puede hacer fácilmente de manera instantánea en términos humanos con micros ordinarios. Digamos que puede tomar una nueva lectura cada 100 µs. Eso es "largo", incluso para micros pequeños y baratos. Eso significa que toda la placa se escanearía cada 6,4 ms, que es mucho más rápido de lo que puede percibir un retraso.

Multiplexar los LED es aún más fácil ya que todo se hace con salidas digitales. Muchos micros tienen más de 16 salidas digitales, así que no hay problema. Hay otras cosas que tendrán que suceder, y usarás pines más rápido de lo que esperas ahora, pero un micro de 64 pines debería ser lo suficientemente bueno, si no uno de 44 pines.

Probablemente dedicaría un micro solo para manejar la E/S de la placa. Esto está optimizado para tener suficientes pines de E/S, entradas A/D y similares. Luego se conecta al motor de cómputo principal a través de UART. El protocolo se vería como "iluminar el cuadrado 3,2" o "pieza quitada del cuadrado 5,4". Esto también permite una interfaz de hardware totalmente diferente en el futuro siempre que mantenga el mismo protocolo.

Para los LED , la forma obvia de hacer esto es tener una salida para cada fila y cada columna del tablero de ajedrez: un total de 8+8=16 pines. Los ánodos estarían conectados a los hilos de fila y los cátodos al hilo de columna. Para el LED que desea encender, debe hacer que su cable de ánodo sea positivo (lógica 1) y su cable de cátodo negativo (lógica 0), mientras mantiene los otros en el estado inverso (para que los LED restantes tengan polarización neutra o inversa).

Estoy asumiendo aquí que el microcontrolador proporciona voltajes suficientemente altos/bajos para que pueda conectar un LED de uno a otro. Si ese no es el caso, necesitará un transistor o un búfer para cada línea. Con un suministro de 5 V es ajustado, considerando que el LED cae alrededor de 2 V y desea una caída de voltaje razonable sobre su resistencia limitadora de corriente (tenga en cuenta que solo necesita instalarlos en las líneas de fila o en las líneas de columna, no en ambos).

Si sus salidas son de tres estados (es decir, además de la lógica 0 y la lógica 1, se pueden configurar en un estado de alta impedancia, tal vez configurándolas temporalmente como entradas), entonces puede ser inteligente y usar una cuadrícula de 4x8, con LED. conectados en pares antiparalelos. Es importante configurar las salidas no utilizadas a alta impedancia en esta configuración, de lo contrario, se encenderán los LED no deseados.

En cualquier caso, tendrá que pensar en el consumo actual y si es aceptable correr el riesgo de que un error de software encienda todos los LED de una fila a la vez (lo que, si no se tiene en cuenta, podría sobrecargar esa línea de fila del microcontrolador). .)


El caso de los sensores es más complicado. Asumiré que usa sensores resistivos, aunque no se garantiza necesariamente que los fototransistores se conduzcan en una sola dirección.

Puede usar las mismas salidas de 8 filas que usa para encender sus LED, pero necesitará entradas de 8 columnas dedicadas a la detección. Sin duda, habrá visto circuitos para teclados como este. Tenga en cuenta que estos solo están diseñados para tener una tecla presionada a la vez . Si el usuario presiona 1, 3, 7 y 9 al mismo tiempo, el teclado no puede detectar si el usuario suelta alguna de estas cuatro teclas porque todavía existe una ruta de corriente a través de los otros tres interruptores.

Una solución utilizada en los teclados musicales (que están diseñados para tener más de un elemento de la matriz conduciendo a la vez) es tener un diodo en serie con todos y cada uno de los interruptores.

Otra solución sería comprar cuatro circuitos integrados decodificadores de 4 a 16 con salidas de colector abierto (o drenaje abierto si se utilizan circuitos integrados MOSFET) como este: http://www.unicornelectronics.com/ftp/Data%20Sheets/74159.pdf Colector abierto significa que las salidas del IC solo absorberán la corriente, no la generarán. Por lo tanto, puede conectar 16 sensores a 16 salidas del chip y unir los otros extremos con una resistencia pullup (también conectaría su ADC aquí). Trae una salida baja (conductora) y las otras 15 permanecen altas (no conductoras). Esto contrasta con la salida lógica estándar, donde las otras 15 salidas estarían vertiendo corriente en el punto común.

La entrada a estos circuitos integrados es binaria de 4 bits para seleccionar una de las 16 salidas, pero también tienen una entrada adicional para habilitar/deshabilitar el chip. Por lo tanto, podría tener potencialmente una matriz de 64 sumideros de colector abierto, conectados a 64 sensores, con los otros extremos de los sensores todos en común a una sola resistencia pullup y un convertidor analógico a digital. Necesitaría un total de 8 salidas en su microcontrolador para esto: cuatro para tomar las señales de selección de 4 a 16 (comunes a los cuatro chips) y cuatro para tomar las señales de habilitación (una para cada chip).

EDITAR: 3 a 8 decodificadores (también llamados 1 de 8 = 1 línea de 8) parecen estar más disponibles que 4 a 16, pero 8 IC es mucho más complicado que 4. Otro tipo de IC que podría ser útil es el contador octal (y su primo más común, el contador de décadas , que se puede configurar como un contador octal conectando su novena salida a la línea de reinicio). Estos requieren un pulso en serie para avanzar de una salida a la siguiente, por lo que necesitarían menos pines de E/S en el microcontrolador que los circuitos integrados del decodificador. Por lo general, tienen entradas adicionales para restablecer y habilitar. También hay circuitos integrados llamados registros de desplazamiento , que están disponibles en dos tipos: uno para convertir de serie a paralelo, el otro para convertir de paralelo a serie. Finalmente, haybuffers , que puede colocar entre su Rasberry Pi y su tablero de ajedrez para que el Pi no se destruya en caso de sobrecorriente. Todos estos pueden ser útiles en los circuitos de multiplexación.

Usted menciona registros de desplazamiento: también podrían usarse para las salidas de LED. Otro contador más un registro de desplazamiento de 8 bits que puede hacer tres estados podría controlar todo el conjunto con poco más de dos o tres pines, si son lo suficientemente rápidos como para evitar el parpadeo visible.
@hobbs No creo que el parpadeo sea un problema, ya que OP solo quiere encender uno o dos LED a la vez. Incluso tristate no es realmente necesario si solo tiene un registro de década / contador octal / desplazamiento directo y uno inversor para controlar los LED. 3 pines se pueden lograr perfectamente: reinicio común, avance de columna, avance de fila. Ese puede ser el camino a seguir: guarde todos los otros pines para el problema más difícil de los sensores.
Para los LED, también se puede utilizar el controlador LED MAX7219/7221. Esto reducirá el número de entradas a 3: reloj, datos, pestillo.

La multiplexación es de hecho una práctica común.

Hay un par de formas en las que puedes sacar más provecho de tus pines de frambuesa pi

Una es usar un chip para hacer parte del trabajo pesado por usted. Por ejemplo, si tiene 8 entradas y 8 salidas para leer el estado de la placa, puede usar un contador para aumentar las 8 entradas una a la vez. Necesitará 2 pines en el Arduino para esto: uno para restablecer el primer pin y otro para "ir a la siguiente fila". ¡Acabas de guardar 6 pines!

Guardar 6 pines puede no ser suficiente. Veamos a dónde podemos ir desde aquí: si reorganiza su cuadrícula de 8x8 en una cuadrícula de 16x4, puede usar algo como http://www.instructables.com/id/16-Stage -Decade-Counter-Chain-Using-two-4017-Chi/?ALLSTEPS (ignore la mitad superior, las dos líneas que bajan de arriba hacia abajo son su "restablecimiento", que viene de la parte superior izquierda y el " vaya a la siguiente fila", que se llama CLK, por reloj, aquí). Ahora puede contar el 8 en la mitad izquierda del tablero, seguido del 8 en la mitad derecha del tablero; conecte las columnas A y E, B y F, C y G, y D y H juntas.

Felicitaciones, ahora tiene dos pines de salida (restablecimiento y reloj) y 4 pines de entrada, para un total de 6, ¡eso ahorra 10 pines! Tenga en cuenta que la raspberry pi no tiene convertidores de analógico a digital, por lo que necesitará un poco de trabajo adicional para eso.

Ahora para los LED. Ya tiene una fuente de alimentación controlada (los dos contadores de décadas), reutilicémoslos. Coloque sus 64 LED de sus 16 pines de suministro, a través de una resistencia (¡cada LED DEBE tener su propia resistencia!), a otros 4 rieles (mismo diseño que el anterior: AE, BF, CG y DH). Conecte estos 4 rieles a través de 4 transistores a 4 pines y coloque todos los pines en "alto"; dado que ambos lados del LED ahora tienen 5 voltios, los LED estarán apagados. Luego, cuando desee encender un LED, asegúrese de que sus dos décadas estén en la posición correcta (como si estuviera leyendo el sensor en ese cuadrado), configure uno de los 4 rieles en bajo. La corriente ahora debería fluir desde el "alto" del contador de décadas, al "bajo" en ese riel específico. ¡Oye, presto, la luz se enciende! Dele un poco de retraso, luego apáguelo antes de cambiar el contador de décadas nuevamente.

Si desea más control, puede usar algo como un chip TLC5940 - http://playground.arduino.cc/Learning/TLC5940 - cada chip puede configurar 16 LED (por lo que necesitaría 4 de estos) a un nivel de brillo de 0 (apagado) a 1024 (encendido completo), para que pueda atenuar LED individuales hacia adentro y hacia afuera, con gran control. De memoria, estos necesitan alrededor de 4 pines, y se pueden conectar en cadena, por lo que 4 pines digitales (uno de los cuales debe ser PWM; estos tienen el símbolo "~" al lado del pin) controlarán cualquier número de LED.

¡Buena suerte!

Es RPi, no Arduino.
Mis disculpas, tienes razón. Casi todo lo que dije todavía se aplica, así que hice algunas modificaciones menores para que funcione.

No creo que necesite un LED en la esquina superior derecha. Un sensor en el medio como mencionas sería suficiente. La parte Tricky será el código para el tablero de ajedrez. Imagina que tienes un tablero de ajedrez. La fila se indicará como 'alfabeto' y la columna se indicará como 'número'.

Así que primero necesitas un programa para programar el tipo de pieza en la posición inicial. Posteriormente, cuando muevas tus piezas, el código generará la ubicación inicial de la pieza a la ubicación final. Eso reducirá su entrada a la mitad.

Tal vez no expliqué bien... los LED no están destinados a leer en el estado actual, están destinados a mostrar qué movimiento quiere hacer la computadora. Entonces, el usuario hace el movimiento: los sensores de brillo le dicen al software lo que hizo el usuario. El software calcula su próximo movimiento y parpadea dos LED, el usuario mueve la pieza y luego es el turno del humano nuevamente.