¿Cómo se pueden conectar 16 botones con solo 8 cables?

Aquí está el producto. Entiendo la idea: estos 16 botones usan una matriz de 4x4. 4 líneas para filas, 4 líneas para columnas y tenemos 8 cables.

ingrese la descripción de la imagen aquí

Pero:

  1. ¿Cómo puede funcionar esto sin ningún multiplexor?

  2. ¿Puede esto detectar con precisión las pulsaciones de varios botones? ¿Incluso si los botones usan la misma fila o la misma columna? Ejemplo: botones en la posición (2,2) (2,3), (3,2) y (3,3) presionados al mismo tiempo.

  3. ¿Como funciona?

Esto es de conocimiento común, ya que encontrará con una búsqueda en Google de 'multiplexación de teclado' o similares. ¿No lo intentaste primero, antes de publicar esto?
@TonyM Por supuesto que lo hice, muchas búsquedas e incluso pedí algunos chips multiplexores 74HC164 que llegaron a casa hace unos días. Estaba a punto de conectar todo con este chip multiplexor cuando encontré esto. Entonces me preguntaba "¿cómo puede funcionar esto sin ningún multiplexor"?
El dispositivo de la izquierda debe tener un código de multiplexación en su interior.
@MarceloEspinozaVargas Vale. Entonces, ¿qué piensas sobre la pregunta #2?
Depende del código de multiplexación real, si es tan simple como enviar +V a través de cada fila y usar cada columna como entrada, entonces no podrá hacerlo, pero si cambia alrededor de cada fila y columna (tomando los 8 pines como entrada y salida) y puede retener en la memoria qué botón se presiona, es posible que pueda detectar varios botones presionados al mismo tiempo
Hice esa búsqueda y el segundo resultado fue un pdf respondiendo en detalle su Q1, Q3 y parte de Q2. Puede ver mi punto, ¿no es así? Esto ya está documentado y es mejor que lo expliquemos aquí. Echa un vistazo, obtendrás respuestas detalladas.
@TonyM Gracias por señalarme esto. ¿Puedes vincular el PDF en lugar de hacer un misterio;)? Tal vez busqué con otras palabras clave además de teclado, etc. y probablemente no encontré lo mismo.
Claro :-) www.emc.com.tw/eng/database/Sa2/Gp/An/Gf/AN-009.pdf
Lo siento, @TonyM, pero probablemente sea fácil de leer para alguien que ya sabe, pero para mí, ver ensamblador y MOV A,@0X11;disable WDTno es particularmente simple de entender cómo funciona un teclado con varios botones presionados al mismo tiempo...
@Basj: tener múltiples prensas no es un problema. Escanea las cuatro líneas una tras otra. Si se encuentra un botón presionado en la línea 1, lo anota. Cuando se trata de la línea 3, encuentra otro botón presionado allí, también lo nota. Al final, obtienes ambos botones. Siempre que pueda escanear mucho más rápido de lo que las personas pueden presionar los botones, no se lo perderá.
Echa un vistazo a esta animación: upload.wikimedia.org/wikipedia/commons/f/f2/… (nota: el cambio de fila y columna no es una cuestión de hardware. Es tu código "OK, ahora establece pin1 en alto, ahora lea cuál es el estado de pin5", etc.)
@MarceloEspinozaVargas el dispositivo de la izquierda es una Raspberry Pi (modelo 3). Esos pines GPIO son configurables rápida y fácilmente en código. Parece que todos los pines del teclado están conectados a GPIO (nada a GND), pero la foto marcada no es tan clara
El manual de su producto enseña cómo demultiplexarlo: gotronic.fr/pj2-sbc-buttonmatrix-fr-1461.pdf

Respuestas (4)

¿Cómo puede funcionar esto sin ningún multiplexor?

no lo hace La placa del teclado parece tener solo interruptores, tal vez con algunos diodos que no podemos ver. Sin embargo, la placa izquierda parece tener un procesador. Es casi seguro que la multiplexación se realiza en el firmware.

El algoritmo de multiplexación funciona de la siguiente manera:

  1. Conduzca una fila hacia arriba, las otras hacia abajo.

  2. Habilite los menús desplegables pasivos en las líneas de las columnas.

  3. Vea qué líneas de columna son altas. Se presionan los botones en las intersecciones de esas líneas de columna con la línea de fila afirmada. Los otros botones de esa fila se sueltan.

  4. Repita de nuevo al paso uno, afirmando la siguiente fila en secuencia.

El proceso anterior se repite lo suficientemente rápido como para que todos los botones se verifiquen en un tiempo que aún parece instantáneo para un observador humano. El límite humano de "instantáneo" en este contexto es de unos 50 ms. Incluso un microcontrolador de gama baja puede escanear un teclado 4x4 en mucho menos tiempo que eso.

¿Puede esto detectar con precisión las pulsaciones de varios botones?

Probablemente si. Una forma es poner un diodo en serie con cada botón. Esos podrían estar en la parte inferior del tablero que muestres. Con los diodos, el algoritmo descrito anteriormente simplemente funciona.

Otra forma es poniendo resistencias en serie con líneas y midiendo su voltaje analógico. Incluso con varios botones que acortan varias líneas de fila/columna, eventualmente puede averiguar qué botones se presionan. Esto requiere entradas A/D en el micro, no solo entradas digitales como cuando se usan diodos.

Gracias. ¿Qué pasa con varias prensas al mismo tiempo entonces? Nota: la placa de la izquierda es una RaspberryPi.
@Basj Si solo va a presionar 2 botones simultáneamente, entonces está bien, solo cuando presione 2 o más botones en la misma columna y otro botón en una columna diferente donde necesitará diodos
@Hayman ¿por qué es así? ¿Puede dar un ejemplo? ¿Por qué (1,2), (2,2) y (3,3) presionados al mismo tiempo es un problema cuando no hay diodo? ¿Tal vez tendrías un pequeño esquema? Como este punto es realmente crucial, ¿tal vez valga la pena una respuesta dedicada @Hayman?
+1 para "parece que la placa izquierda tiene un procesador". Me encantó eso.
También escuché que tres no funcionarán ocasionalmente con este tipo de multiplexación. Registra una cuarta tecla cuando se pulsa (una pulsación fantasma). Hay un nombre para este algoritmo, y no recuerdo que se vea...
@Basj es obvio si juegas con él. Cada vez que presiona un botón, está conectando una fila a una columna. Cada vez que se conectan una fila y una columna, la tecla en la intersección se registra como presionada. Pero si se presionan al menos 3 teclas, una fila y una columna se pueden conectar indirectamente .
@Basj Eche un vistazo a esta imagen . Las líneas rojas indican un nivel lógico alto. Si mantienes presionados los 3 botones indicados con una 'x' puedes rastrearlos y ver el camino por el que fluirá la señal. En primer lugar, se selecciona la fila 1 y se establece alta, al presionar el botón 1,1 esto hace que la primera columna sea alta. Al presionar el botón 1,2 ahora hemos hecho la fila 2 alta. Ahora, si presionamos cualquier otro botón en la fila 2, haremos otra columna alta. El problema con esto es que el μC es tonto, sabe que estableció la fila 1 alta y ve una columna alta en la columna 3, por lo tanto, piensa que el botón 1,3 está alto
@Basj Sin diodos, si conecta la fila 1 a la columna 1 y la fila 1 a la columna 2, ha conectado las columnas 1 y 2 juntas. Ahora, ¿cómo puede saber si se presionó la columna 1 de la fila 2 y no la columna 2 de la fila 2? Con los diodos, no ha conectado las dos columnas juntas porque ese camino tendría que ir hacia atrás a través de un diodo.
Incluso el manual del mismo (se puede acceder desde el enlace del producto) proporciona el código que se utiliza para desmultiplexarlo: gotronic.fr/pj2-sbc-buttonmatrix-fr-1461.pdf

Sin diodos... obtendrás rectángulos fantasma.

Por ejemplo, en su ejemplo (2,2) (2,3), (3,2) y (3,3); elegiste un ejemplo irónico al elegir un rectángulo. Si realmente presiona los cuatro, funcionará. Pero si presiona cualquiera de las tres esquinas del rectángulo, la cuarta esquina también parecerá estar presionada, aunque no lo esté.

Ese teclado está claramente destinado a la entrada de datos del teclado, donde la convención del usuario es presionar una tecla a la vez. Observa que no hay teclas de "cambio" en el teclado de entrada de una tarjeta de crédito de una gasolinera, por ejemplo.

Sin embargo, si convirtió S1 en una tecla de mayúsculas y S3 en una tecla de mayúsculas y minúsculas, de modo que los usuarios puedan razonablemente mantener presionadas ambas mientras presionan S13, entonces S15 también parecería estar presionado.

De hecho, la mayoría de los teclados de entrada de datos no están diseñados para tener más de 2 teclas presionadas a la vez, por lo que no hay problema. Los teclados musicales son otra historia, ya que se pueden presionar muchas teclas a la vez. La mayoría tienen diodos o cableado independiente para cada tecla. Pero encontré un teclado musical en una tienda de segunda mano (con un precio de 9 euros) que no tenía ninguna adaptación adecuada para presionar varias teclas a la vez, ¡con resultados impredecibles y molestos!
Los interruptores de llave podrían ser de un tipo que tenga un diodo incorporado, o podría haber diodos ocultos debajo de ellos.

He aquí cómo hacerlo sin escaneo continuo:

  • Establecer todos los controladores en alto
  • Habilitar menús desplegables pasivos en las líneas de recepción
  • Configure la interrupción de cambio de pin para detectar que una de las líneas sube (o cambia de nivel)
  • Cuando esto suceda, habilite el escaneo del teclado, digamos cada 10 ms
  • Escanee normalmente y procese las pulsaciones de teclas
  • Después de un tiempo de espera sin eventos, detenga el análisis y reinicie en el primer punto

He hecho esto con lenguaje ensamblador en microcontroladores Atmel AVR desnudos.
Para simplificar: Filas del teclado: use los pines Arduino 4,5,6 y 7 (pines AVR PD4, PD5, PD6 y PD7) Columnas del teclado: use los pines Arduino 8, 9, 10 y 11 (pines AVR PB0, PB1, PB2 y PB3 ) Realice entradas de pines de fila con pull-ups habilitados. Hacer salida de pines de columna y salida de ceros para ellos. Habilite las interrupciones de cambio de pin en todos los pines de fila y columna. http://playground.arduino.cc/Main/PinChangeInterruptAl presionar un botón en el teclado, se bajará un pin de Fila. La rutina de interrupción necesita leer los pines de las filas y encontrar cuál es el pin bajo. Los 4 bits superiores deben ser tres unos y un cero. Si usa una variable de 8 bits uint8_t, puede dividirla por 16 o (var >> 4) para colocar los 4 bits en los bits inferiores del número. Puede utilizar un OR bit a bit | operación con 240 para establecer los 4 bits superiores en 1 y una operación NOT ~ bit a bit para invertir todos los bits, de modo que solo tenga un bit establecido que represente la fila en la que se presionó el botón. Guarde este número como 0, 1, 2 o 3.
Cambie la configuración de pines:
Haga entradas de pines de columna con pull-ups habilitados. Hacer salida de pines de fila y salida de ceros para ellos. Lea los pines de la columna y encuentre qué pin está bajo. Haz una manipulación similar con este valor, excepto que no tienes que desplazar el número a la derecha. Después de var ^ 240 y ^var, tiene un solo bit para representar la columna en la que se presionó la tecla. Recuerde deshabilitar las interrupciones antes de reconfigurar los puertos, ya que es probable que desencadene interrupciones no deseadas. Es posible que deba borrar las banderas de interrupción al salir de la rutina de interrupción para evitar el manejo de interrupciones duplicadas.