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

9

Aquí está el producto. Entiendo la idea: estos 16 botones usan una matriz 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 múltiples 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?

Basj
fuente
77
Esto es de conocimiento común, ya que lo encontrará con una búsqueda en Google de 'multiplexación de teclado' o similar. ¿No intentaste eso primero, antes de publicar esto?
TonyM
3
@TonyM Por supuesto que lo hice, muchas búsquedas, e incluso ordené 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"?
Basj
1
El dispositivo de la izquierda debe tener un código de multiplexación en su interior
Marcelo Espinoza Vargas
3
@ Tony Gracias por señalarme esto. ¿Puedes vincular el PDF en lugar de hacer un misterio;)? Tal vez busqué con otras palabras clave además del teclado, etc. y probablemente no encontré lo mismo.
Basj
1
@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 nota. Cuando se trata de la línea 3, encuentras otro botón presionado allí, también lo notas. Al final, obtienes ambos botones. Mientras pueda escanear significativamente más rápido de lo que las personas pueden presionar los botones, no se lo perderá.
Gábor

Respuestas:

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

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

El algoritmo de multiplexación funciona más o menos así:

  1. Conduzca una fila alto, los otros bajos.

  2. Habilitar desplegables pasivos en las líneas de columna.

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

  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 dentro de un tiempo que todavía se siente 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 múltiples 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 muestra. Con los diodos, el algoritmo descrito anteriormente simplemente funciona.

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

Olin Lathrop
fuente
1
Gracias. ¿Qué pasa con las prensas múltiples al mismo tiempo? Nota: el tablero izquierdo es un RaspberryPi.
Basj
1
@Hayman, ¿por qué es así? ¿Puede dar un ejemplo? ¿Por qué se presiona (1,2), (2,2) y (3,3) al mismo tiempo un problema cuando no hay diodo? Tal vez tendrías un pequeño esquema? Como este punto es realmente crucial, ¿quizás valga la pena una respuesta dedicada @Hayman?
Basj
8
+1 para "la placa izquierda parece que tiene un procesador". Me encantó eso.
Enric Blanco
3
@Basj es obvio si juegas con él. Cada vez que presiona un botón, está conectando una fila a una columna. Siempre 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 .
hobbs
2
@Basj Echa un vistazo a esta imagen . Las líneas rojas indican un nivel lógico alto. Si mantiene presionados los 3 botones indicados con una 'x', puede rastrearlos y ver la ruta en la que fluirá la señal. En primer lugar, se selecciona la fila 1 y se establece alta, presionando el botón 1,1 esto hace que la primera columna sea alta. Al presionar el botón 1,2, hemos hecho que la fila 2 sea alta. Ahora, si presionamos cualquier otro botón en la fila 2, elevaremos otra columna. El problema con esto es que el μC es tonto, sabe que establece la fila 1 alta y ve un alto en la columna 3, por lo tanto, piensa que el botón 1,3 es alto
Doodle
9

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

Por ejemplo, en su ejemplo (2,2) (2,3), (3,2) y (3,3); elegiste un ejemplo irónico eligiendo 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á presionada, aunque no lo sea.

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. Notará que no hay teclas "shift" en el teclado de entrada de la tarjeta de crédito de una estación de servicio, por ejemplo.

Sin embargo, si convirtió a S1 en una tecla de mayúsculas, y S3 en una tecla de mayúsculas, de modo que los usuarios puedan mantener razonablemente presionadas ambas teclas al mismo tiempo que presionan S13, entonces S15 también parece presionarse.

Harper - Restablece a Monica
fuente
1
De hecho, la mayoría de los teclados de entrada de datos no están destinados a 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 de ellos 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!
Level River St
Los interruptores de llave podrían ser de un tipo que tenga un diodo incorporado, o podría haber diodos escondidos debajo de ellos.
rackandboneman
1

Aquí se explica cómo hacerlo sin escaneo continuo:

  • Establecer todos los controladores a alto
  • Habilitar desplegables pasivos en las líneas receptoras
  • Establezca la interrupción de cambio de clavija para detectar una de las líneas que se elevan (o cambian de nivel)
  • Cuando esto sucede, 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 la exploración y reinicie en el primer punto
peufeu
fuente
0

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. Haga que los pines de columna generen ceros de salida y salida. Habilite las interrupciones de cambio de pin en todos los pines de fila y columna. http://playground.arduino.cc/Main/PinChangeInterrupt Al presionar un botón en el teclado, un pin de la fila baja. La rutina de interrupción necesita leer los pines de la fila y encontrar qué pin es bajo. Los 4 bits superiores deben ser tres unos y uno cero. Si usa una variable uint8_t de 8 bits, puede dividirla por 16 o (var >> 4) para colocar los 4 bits en los bits más bajos del número. Puede usar un OR bit a bit | operación con 240 para establecer los 4 bits superiores en 1s y una operación NO ~ bit a bit para invertir todos los bits para que solo tenga un conjunto de bits que represente la fila en la que se presionó el botón. Almacene este número como 0, 1, 2 o 3.
Cambie la configuración del pin:
Realice entradas de pines de columna con pull-ups habilitados. Haga que los pines de fila de salida y salida ceros a ellos. Lea los pines de la columna y descubra qué pin es bajo. Haga una manipulación similar con este valor, excepto que no tiene 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 volver a configurar los puertos, ya que es probable que active interrupciones no deseadas. Es posible que tenga que borrar las banderas de interrupción al salir de la rutina de interrupción para evitar el manejo de interrupciones duplicadas.

Darrell Harriman
fuente