Problemas en sistemas de control matriciales

#2718

Este documento es una traducción del texto 'Keyboard Matrix Help' escrito por Dave Dribin. Su autor nos ha permitido, muy amablemente, la publicación siempre y cuando se respeten los términos de su 'copyright'.

En él se explica el funcionamiento de un teclado y los problemas a los que puede dar lugar si se utiliza como interfaz para los controles de juego. Sin embargo, todo es perfectamente aplicable a otros sistemas matriciales como podría ser el caso del Interfaz por Puerto Paralelo.

Explicación y problemas del interfaz matricial del teclado

Dave Dribi
v1.1 24 de Junio de 2000

Revisión 1.1 - 24 de Junio de 2000 - Revisado por dd
Conversión a DocBook SGML y actualización de la información de los diodos.
Revisión 1.0 - 4 deFebrero de 1999 - Revisado por dd
Primera publicación.

Intento de explicación de cómo funciona la matriz de un teclado, qué son el 'ghosting' y el 'masking' y cómo evitarlos.

1.- Introducción

Me ha llevado un poco de esfuerzo darme cuenta de lo que aquí expongo, en parte debido al hecho de que no hay buena documentación sobre el tema. Así que voy a resolver el misterio. Básicamente, quería comprender cómo funcionan las matrices de los teclados y, en particular, por qué ocurren los efectos de 'ghosting' y 'masking' y cómo evitarlos.

Este artículo tiene derechos de autor de 1999-2000 Dave Dribin. El artículo puede ser reprodido totálmente o en parte sin ninguna clase de compensación económica de acuerdo las siguientes restricciones:

  • El presente aviso sobre derechos de autor debe ser mantenido íntegramente en todas las copias totales o parciales.
  • Cualquier traducción o trabajo derivado debe ser aprobado por el autor original (Dave Dribin) antes de su distribución.
  • Si se distribuye parcialmente el artículo, deben darse instrucciones sobre cómo obtener el artículo completo y facilitar los medios para ello.
  • Partes pequeñas pueden ser reproducidas como ilustración para revisiones o para citas en otros trabajos sin incluir esta nota de derechos de autor siempre que se cite el origen de las citas o ilustraciones. Se puede dar excepción de esta norma por motivos académicos, escríbale al autor para consultarlo. Estas restricciones están aquí para protegernos como autores, no para dificultar el aprendizaje o la enseñanza.

2.- El circuíto matricial

Los teclados usan una matriz con las columnas y filas hechas de conducciones eléctricas. Cada tecla funciona como un interruptor. Cuando una tecla es presionada, un conductor columna hace contacto con un conductor fila y se completa el circuito. El chip controlador del teclado detecta este circuíto cerrado y lo registra como un tecla presionada. Este es una matriz sencilla de teclado:

Figura 1. Circuito Matricial Conceptual

Este teclado sólo tiene 4 teclas: A, B, C y D. Cada una con una única posición en la rejilla, como los puntos en el gráfico. La tecla A es un nodo en la posición C1-R1, la tecla B es un nodo en la posición C2-R1, la tecla C es un nodo en la posición C1-R2, y la tecla D es un nodo en la posición C2-R2. En realidad, esto no tiene demasiado uso, y es la razón por la que en los teclados hay muchas más columnas y filas. De cualquier modo, quiero mantener la explicación de un modo sencillo.

El esquema eléctrico de esta matriz sería algo parecido a esto:

Figura 2. Interruptor Abierto

3. Escaneando para detectar las pulsaciones de teclas

Para poder detectar las pulsaciones de teclas, el controlador del teclado escaneará todas las columnas, activandolas todas, de una en una. Cuando una columna está activada, el controlador detecta que filas están 'activadas'.

Para avanzar paso a paso en este proceso, el controlador activa la columna C1 y comprueba las filas R1 y R2:

Figura 3. Escaneando la columna 1

Ninguna de las teclas A o C están presionadas, así que ninguna de las filas R1 o R2 están activadas. Así que el controlador sabe que los dos nodos C1-R1 y C2-R2 están desactivados.

Entonces se activa la columna C2 y se comprueba de nuevo las filas R1 y R2:

Figura 4. Escaneando la columna 2

Ni B ni D están presionadas, así que ninguna de las filas R1 y R2 están activadas. El controlador ahora sabe que los nodos C2-R1 y C2-R2 están desactivados.

4. Pulsaciones de teclas sueltas

Ahora supongamos que presionamos la tecla A. La matriz sería entonces así:
[Figura 5. La tecla A es presionada]

La tecla A corresponde al nodo C1-R1. Volviendo al circuito, podemos ver cómo es detectado dicho nodo. Aquí tenemos el circuíto con el interruptor A cerrado:

Figura 6. Interruptor A cerrado

Avanzando con el proceso de escaneado otra vez, el controlador activa la columna C1 y detecta qué filas están activadas:

Figura 7. La fila 1 está activada

Ahora, la fila R1 está activada. Así que el controlador sabe que el nodo C1-R1 está presionado. Y como dicho nodo corresponde a la tecla A, el controlador sabe que la tecla A está presionada.

Cuando el controlador activa la columna C2, ninguna de las filas R1 y R2 están activadas. Ambos interruptores están abiertos:

Figura 8. Ninguna fila está activada

Cuando dejamos de pulsar la tecla A, el circuíto vuelve a su posición original, y el controlador detecta que el nodo C1-R1 ya no está activado.

5. Pulsación de varias teclas

Vamos ahora a ver el caso de varias teclas presionadas a la vez. Supongamos que dichas teclas son A y D. La matriz será así:

Figura 9. Las teclas A y D están presionadas

Los dos nodos, C1-R1 y C2-R2, deben ser detectados. Aquí está el circuíto con los interruptores A y D cerrados:

Figura 10. Los interruptores A y D están cerrados

El escaneado de las columnas C1 y luego la C2 genera las siguientes salidas:

Figura 11. Fila 1 está activada Figura 12. Fila 2 está activada

Cuando la columna C1 es activada, la fila R1 está activa, así que el nodo C1-R1 está activo. Cuando la columna C2 es activada, la fila R2 está activa, así que el nodo C2-R2 está activo.

6. Tres pulsaciones simultáneas y el 'Ghosting'

Cuando se pulsan tres teclas a la vez, ocurre el 'Ghosting'. En este ejemplo, las teclas A, B y D son presionadas. La matriz sería así:

Figura 13. Las teclas A, B, y D son presionadas

Si todo marcha bien, los nodos C1-R1, C2-R1 y C2-R2 son detectados. Veamos el circuíto de nuevo:

Figura 14. Los interruptores A,B y D están cerrados

Cuando se activa la columna C1, el circuíto estaría así:

Figura 15. Las filas 1 y 2 están activadas

Si tienes la sensación de que hay algo mal, ¡ tienes razón ! Aquí es cuando el problema del 'ghosting' aparece en juego. La fila R1 está activada y la R2 también, así que los dos nodos C1-R1 y C1-R2 están activados. El nodo C1-R1 era esperado, ya que corresponde a la tecla A, que está en realidad presionada. Pero el nodo C1-R2 corresponde a la tecla C. El interruptor C está abierto, así que la tecla no está realmente presionada. El controlador del teclado no lo sabe e incorrectamente genera una pulsación de la tecla C.

Lo que ocurre es que cerrando los interruptores B y D al mismo tiempo creamos un camino para la electricidad desde C1 a R2, circunvalando al interruptor abierto C. El teclado no sabe que el interruptor C está abierto y genera una pulsación fantasma o 'ghosting' (Ghost = Fantasma). El 'ghosting' aparecerá siempre que tres de las cuatro esquinas de un rectángulo dentro de la matriz sean presionadas a la vez. En este ejemplo sencillo, cualquier combinación de tres teclas causará 'ghosting', pero en una matriz mayor, solo tres de las cuatro esquinas de un rectángulo lo causarían.

Simplemente para completar, aquí está el circuíto cuando se activa la columna C2:

Figura 16. Las filas 1 y 2 están activadas

Como era de esperar, los nodos C2-R1 y C2-R2 están activados, correspondiendo a las teclas B y D.

7. El problema del 'Masking'

Partamos del caso anterior donde teníamos las teclas A, B y D presionadas a la vez. Ahora, apretemos la tecla C. Dado el efecto 'ghosting', nada cambia ya que el controlador interpretaba previamente que la tecla C estaba también presionada. Soltemos la tecla B y... ¡Ajá! Ocurre el mismo problema. El dejar de presionar la tecla no es detectado porque el interruptor B es circunvalado por los interruptores cerrados A y C.

8. Librándonos del 'Ghosting' y del 'Masking'

Usando diodos, ambos problemas son eliminados. No hay más que colocar los diodos en serie con cada uno de los interruptores del siguiente modo:

Figura 17. Esquema con diodos

Volvamos al caso en el que A, B y D eran presionadas simultáneamente. Al activarse las columnas C1 y C2, los esquemas serían:

Figura 18. Sólo la fila 1 está activada Figura 19. Las filas 1 y 2 están activadas

¡Voila! Los diodos detienen a la corriente eléctrica de circular en la dirección 'mala' de vuelta hacia el interruptor B. Cuando la columna C1 está activada, solo el nodo C1-R1 se activa y NO el nodo C1-R2. Cuando la columna C2 se activa, ambos filas R1 y R2 son activadas, como era de esperar.

Esto soluciona el problema del 'masking' por la misma razón, el diodo detiene a la corriente que va en la dirección 'incorrecta'.

9. ¿Qué diodos usar?

Ahora que la teoría ha sido explicada, necesitamos saber cómo construir realmente un circuíto con diodos para solucionar los problemas. Desafortunadamente, es aquí cuando mi conocimiento empieza a desaparecer. Conozco la teoría, pero no la práctica (que es lo que ocurre cuando uno va a clase pero no usa la información fuera del aula Sonrisa. De cualquier modo, explicaré lo que se (o lo que creo que se). Mi agradecimiento va para un lector, que prefiere permanecer anónimo, por facilitarme la la mayoría de esta información.

Hay muchos tipos de diodos para todo tipo de aplicaciones. En este caso, necesitamos lo que se llaman 'switching diodes' (creo que en español el término se traduciría por diodos de conmutación). Otro tipo común de diodos son los diodos para rectifar corriente alterna en contínua, diodos de potencia, que pueden soportar más corriente sin estropearse o fundirse. También están los favoritos de todo el mundo, los diodos emisores de luz o LED.

Si vamos a buscar a una tienda de electrónica, probáblemente nos encontraremos con unos diodos con el nombre de 1N4001. Yo iba a usar estos, pero cuando los iba a comprar, el dependiente me dijo que debería usar los 1N4148 debido a su menor tiempo de conmutación. Durante un año, no estuve seguro de si los diodos 1N4001 podrían funcionar, hasta que un lector me aclaró el asunto.

Los diodos 1N4001 fueron diseñados para rectificar corriente alterna doméstica. Y dado que la corriente alterna cambia de polaridad 60 veces por segundo, los diodos 1N4001 deben estar diseñados para un funcionamiento alrededor de los 60Hz. Esto es bastante rápido para un interruptor de teclado a menos que seamos capaces de presionar un botón más de 60 veces por segundo (Algo poco probable Sonrisa ).

Los diodos 1N4148 están diseñados para una rápida conmutación y tienen un tiempo de conmutación de 4 nanosegundos (1E-9 segundos, la mil millonésima parte de un segundo). Y dado que esto es mucho más rápido que en el caso de los 1N4001, a esto es a lo que se refería el dependiente. Esto hace a los diodos 1N4148 los más adecuados y los más económicos, aunque no nos haga falta tanta velocidad de respuesta. Ya que los 1N4148 se venden alrededor de 1 euro el paquete de 30, es mi recomendación.

10. Conclusión

Es muy sencilla: ¡Usa diodos en serie con tus interruptores! ¿Qué tipos de diodos?, te preguntarás... Usa los diodos de conmutación 1N4148 y no tendrás problemas.

Dave Dribin

Apéndice

Quiero reiterar mi agradecimiento a Dave Dribin por permitirnos la traducción y publicación de su estupenda y detallada explicación de cómo funciona un sistema matricial.

Notación

En el artículo, se utiliza la letra C (Column = Columna) para referise a las columnas y la letra R (Row = Fila) para referirse a las filas. Esta notación es diferente a la utilizada en el tutorial del interfaz por puerto paralelo. Tanto mejor, así se facilita más la verdadera comprensión del funcionamiento del sistema y no la memorización de unas simples letras Guiño.

En cuanto al color de los cables, creo que es bastante evidente que los cables dibujados de color rojo son los que tienen tensión y los que están en negro son los que no la tienen. En el caso del interfaz por puerto paralelo, la tensión es de 5v. En los teclados desconozco si hay algún estándar.

Simplificación y 'ghosting'

Como se dice en el artículo, por sencillez, se ha utilizado la matriz más pequeña posible, de 2x2. En un teclado de verdad hay más filas y columnas, pero el funcionamiento es el mismo. Y los problemas también, solo hay que aislar mentalmente las filas y columnas que nos preocupen. Se puede dar el 'ghosting' siempre que pulsemos tres de las cuatro esquinas de cualquier submatriz de la matriz general.

Aquí se pueden ver tres ejemplos de 'ghosting' y un ejemplo de tres pulsaciones simultáneas 'inofensivas':

20.gif 21.gif

22.gif 23.gif

El artículo se refiere a los teclados, pero es válido para cualquier sistema matricial, como el ya citado interfaz por puerto paralelo.

Con una sabia elección de los nodos utilizados, se puede evitar el efecto 'ghosting'. Pero si vamos a construir un panel con dos jugadores y ocho botones para cada uno además de las 4 entradas que usa el joystick, la cosa se complica bastante. Muchísimo más sencillo es poner los diodos y dejarse de jaleos. Además, de ese modo podremos utilizar todos los nodos. También está el método 'divino', pasar de todo y rezar para que no haya fallos... pero seguro que no funciona Carcajada

Velocidad de respuesta

Hay un 'problema' del que no se habla en el artículo, la velocidad de escaneado. Ya que solo está activada una columna en cada instante, no todos los botones se leen a la vez. Esto no supone ningún problema real ya que la velocidad de lectura es muy rápida. De lo contrario se podrían producir defectos graves:

  • En un juego de lucha uno de los jugadores podría moverse o golpear antes que el otro, no dándole la oportunidad de protegerse o de contraatacar al rival.
  • Si pulsáramos y soltáramos un botón antes de darle tiempo al escaneo de pasar por su columna, el controlador no detectaría la pulsación.

En el interfaz por puerto paralelo, la velocidad de funcionamiento es configurable, estando fijada por defecto a 3µs. Es decir, que para escanear las 5 columnas tardamos: 3E-6 * 5 = 1.5E-5 = 0.000015s. Es decir, que podríamos realizar 66.666,7 pulsaciones de botón por segundo...un número imposible para cualquier mano humana. Así que en el caso del interfaz por puerto paralelo, estamos totalmente seguros de que nunca tendremos alguno de los problemas que he citado.

Desconozco cuál es la velocidad de funcionamiento de un teclado, es de esperar que sea más baja que la del interfaz por puerto paralelo ya que se idearon para escribir. Si alguien tienen información al respecto, sería de agradecer que nos la facilitara ya que así podría conocerse la limitación de un hackeo de teclado para servir como interfaz de controles para un panel de varios jugadores.

Sobre la traducción

No soy un artista con la lengua de Shakespeare, así que puede que la traducción no sea muy buena. Cualquier fallo o mejora que consideréis no tenéis más que hacerla en el foro y se intentará corregir en cuanto antes.

Macarro

Publicidad