Hacer un tablero de ajedrez electrónico

14

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

He estado pensando en cómo detectar piezas en el tablero, y he tomado las decisiones de que no necesito reconocer qué pieza es 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 que está en el centro se usará para un sensor de brillo para detectar si una pieza está parada en el campo o no.
  • El que está en la esquina se usará para que un LED muestre qué pieza tiene que mover el usuario para la computadora, de modo que la situación del mundo real coincida con la situación del software nuevamente.

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, lo que termino con son 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 un Raspberry Pi no maneja de fábrica, 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 conmutadores de 8x8. Encontré la sugerencia de usar un microcontrolador que escanea las columnas de la placa de forma secuencial, y en cada columna detecta si se usa o no una fila (= un campo).

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, este es 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 idioma que pueda escribir, o ...?
  3. ¿Alguien ha construido tal tablero y tiene algún consejo o conoce un tutorial que lo guíe a través del proceso?
Golo Roden
fuente
1
Tienes la idea correcta. Sin embargo, tomará un poco de refinamiento en la aplicación de detección. Dependiendo del tamaño y peso de las piezas, 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 decir qué pieza es qué. Probablemente va a necesitar piezas personalizadas también. ¿Tal vez poner una etiqueta RFID en cada uno y luego cada cuadrado tiene un escáner RFID? Exagerado, pero un pensamiento.
mcmiln
1
El enrutamiento de exploración matricial que describa 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
Icy
2
La alineación inicial de las piezas es siempre la misma, por lo que el software sabe qué pieza es 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 esto también puede configurarse en el software manualmente.
Golo Roden
1
Esto parece ... engorroso. Me hubiera ido con un método de video de software. OpenCV y una cámara. Y un proyector.
Passerby
2
esta guía puede ser útil en lo que respecta a la organización de detección / sensor
usuario2813274

Respuestas:

5

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

ingrese la descripción de la imagen aquí

Para su aplicación, necesitará una matriz de este tipo para LED y otra para sensores, que requiere un total de 32 pines IO. Como 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 para filas y columnas, ya que solo necesita un LED a la vez. Para los 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.

Dmitry Grigoryev
fuente
12

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

La parte más difícil será tratar con la naturaleza analógica de los sensores de luz. Los LDR CdS (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 ligereza humana. Eléctricamente, son resistencias, y la resistencia disminuye con 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 su mux está integrado en el micro. Habilita una fila de LDR y lee las 8 señales de columna directamente con el micro, por ejemplo.

Escanear 64 entradas analógicas secuencialmente se puede hacer fácilmente instantáneamente 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á 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, por lo que no hay problema. Hay otras cosas que tendrán que suceder, y usará los pines más rápido de lo que puede esperar 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 con el motor de cálculo principal a través de UART. El protocolo se vería como "iluminar cuadrado 3,2" o "pieza retirada del cuadrado 5,4". Esto también permite una interfaz de hardware totalmente diferente en el futuro siempre que mantenga el protocolo igual.

Olin Lathrop
fuente
7

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 se conectarían a los cables de la fila y los cátodos al cable de la columna. Para el LED que desea encender, haría que su cable de ánodo sea positivo (lógica 1) y su cable de cátodo negativo (lógica 0), mientras mantiene a los demás en el estado inverso (por lo que los LED restantes tienen polarización neutral o inversa).

Aquí supongo que el microcontoller 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 buffer para cada línea. Con un suministro de 5 V es ajustado, teniendo en cuenta que el LED cae aproximadamente 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 ambas).

Si sus salidas son de tres estados (es decir, además de la lógica 0 y la lógica 1, pueden configurarse en un estado de alta impedancia, quizás configurándolas temporalmente como entradas), entonces puede ser inteligente y usar una red 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 iluminarán los LED no deseados.

En cualquier caso, tendrá que pensar en el consumo actual , y si es aceptable arriesgarse a la posibilidad de un error de software al encender todos los LED en 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 los fototransistores no están necesariamente garantizados para conducir en una sola dirección.

Puede usar las mismas salidas de 8 filas que usa para encender sus LED, pero necesitará 8 entradas de columna 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 presionar una tecla a la vez . Si el usuario presiona 1,3,7 y 9 juntos, el teclado no puede detectar si el usuario suelta alguna de estas cuatro teclas porque todavía existe una ruta actual 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 cada interruptor.

Otra solución sería comprar cuatro CI 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 El colector abierto significa que las salidas del IC solo absorberán corriente, no la generarán. Por lo tanto, puede conectar 16 sensores a 16 salidas del chip, y poner en común los otros extremos junto 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 está en contraste 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 IC 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 una matriz de 64 sumideros de colector abierto, conectados a 64 sensores, con los otros extremos de los sensores en común a una sola resistencia pullup y convertidor analógico a digital. Para esto, necesitaría un total de 8 salidas en su microcontrolador: 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 son mucho más desordenados que 4. Otro tipo de IC que podría ser útil es el contador octal (y su primo más común es el contador de década , 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 CI del decodificador. Por lo general, tienen entradas adicionales para restablecer y habilitar. También hay llamadas registros de desplazamiento de IC , que están disponibles en dos tipos: uno para convertir series en paralelo, el otro para convertir paralelos en series. Finalmente haybuffers , que puedes poner entre tu Rasberry Pi y tu tablero de ajedrez para que el Pi no se destruya en caso de sobrecorriente. Todo esto puede ser útil en circuitos de multiplexación.

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

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

Hay un par de formas en que puede sacar más provecho de sus pines de frambuesa pi

Una es usar un chip para hacer algo de 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 subir las 8 entradas de una en una. Necesitará 2 pines en el Arduino para esto: uno para restablecer el primer pin y otro para "pasar a la fila siguiente". ¡Acabas de guardar 6 pines!

Guardar 6 pines podría 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 a abajo son su "reinicio", que vienen de la parte superior izquierda y el " vaya a la siguiente fila ", que se llama CLK, para 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 (reinicio y reloj) y 4 pines de entrada, para un total de 6, ¡eso ahorra 10 pines! Tenga en cuenta que la frambuesa pi no tiene convertidores 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 contadores de dos décadas): reutilicemos esos. Coloque sus 64 LED de sus 16 pines de alimentación, a través de una resistencia (cada LED DEBE tener su propia resistencia), a otros 4 rieles (el 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", ya que ambos lados del LED están ahora a 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), coloque uno de los 4 rieles en bajo. La corriente ahora debería fluir desde el "alto" del contador de la década, al "bajo" en ese carril específico. ¡Hola, listo! ¡Se enciende la luz! Espere un poco, luego apáguelo antes de cambiar el contador de la década 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 (completamente encendido), por lo que puede atenuar y encender los LED individuales, con un gran control. De memoria, estos necesitan aproximadamente 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!

AMADANON Inc.
fuente
Es RPi, no Arduino.
Dmitry Grigoryev
Mis disculpas, tienes razón. Casi todo lo que dije aún se aplica, así que he hecho algunas ediciones menores, para que funcione
AMADANON Inc.
0

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

Entonces, primero necesita un programa para programar el tipo de pieza en la posición inicial. Más tarde, cuando mueva sus piezas, el código generará la ubicación inicial de la pieza a la ubicación final. Eso reducirá su entrada a la mitad.

Brandon Lok
fuente
55
Tal vez no expliqué bien ... los LED no están diseñados para leer en el estado actual, sino para mostrar qué movimiento quiere hacer la computadora. Entonces, el usuario se mueve: los sensores de brillo le dicen al software lo que hizo. El software calcula su próximo movimiento y parpadea dos LED, el usuario mueve la pieza y luego es el turno del humano nuevamente.
Golo Roden