¿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.

Pero:

  1. ¿Cómo puede funcionar esto sin un multiplexor?

  2. ¿Puede esta detección presionar con precisión varios botones? ¿Incluso si los botones usan la misma fila o la misma columna? Ejemplo: los botones en la posición (2,2) (2,3), (3,2) y (3,3) se presionan al mismo tiempo.

  3. ¿Cómo funciona?

pregunta Basj

4 respuestas

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

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

El algoritmo de multiplexación funciona de esta manera:

  1. Conduce una fila alta, las otras bajas.

  2. Habilita los despliegues pasivos en las líneas de la columna.

  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 una fila afirmada. Los otros botones en esa fila son liberados.

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

El proceso anterior se repite lo suficientemente rápido para que todos los botones se revisen en un tiempo que aún 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 la presión de varios botones?

Probablemente si. Una forma es poner un diodo en serie con cada botón. Esos podrían estar en el lado 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 descubrir qué botones se presionan. Esto requiere entradas A / D en el micro, no solo entradas digitales como cuando se usan diodos.

    
respondido por el Olin Lathrop
9

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

Por ejemplo, en su ejemplo (2,2) (2,3), (3,2) y (3,3); eligió un ejemplo irónico eligiendo un rectángulo. Si en realidad presiona los cuatro, funcionará. Pero si presiona las tres esquinas del rectángulo, la cuarta esquina también aparecerá para que se presione, 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 estación de servicio, por ejemplo.

Sin embargo, si hizo de S1 una tecla de cambio y S3 una tecla de cambio alt de tal manera que los usuarios pudieran mantener razonablemente ambos al mismo tiempo que presionan S13, entonces también parece que se presiona S15.

    
respondido por el Harper
1

A continuación le indicamos cómo hacerlo sin escaneo continuo:

  • Establezca todos los controladores en alto
  • Habilitar desplegables pasivos en las líneas receptoras
  • Establezca la interrupción de cambio de pin para detectar una de las líneas que se eleva (o cambia de nivel)
  • Cuando esto ocurra, habilite la exploración del teclado, diga cada 10 ms
  • Escanear normalmente y procesar pulsando las teclas
  • Después de un tiempo de espera sin eventos, detenga la exploración y reinicie en el primer punto.
respondido por el peufeu
0

He hecho esto con el lenguaje ensamblador en los microcontroladores AVR de Atmel.
Por simplicidad: Filas de teclado: use los Arduino Pins 4,5,6 y 7 (AVR pins PD4, PD5, PD6 y PD7) Columnas del teclado: use los Arduino Pins 8, 9, 10 y 11 (AVR pins PB0, PB1, PB2 y PB3) Hacer entradas de pins de fila con pull-ups habilitados. Hacer pines de columna de salida y salida de ceros a ellos. Habilitar interrupciones de cambio de pin en todos los pines de fila y columna. enlace Al presionar un botón en el teclado, se bajará un pin de Fila. La rutina de interrupción debe leer los pines de la fila y encontrar qué pin está bajo. Los 4 bits superiores deben ser tres unos y un cero. Si utiliza 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. Puedes usar un bit a bit o | opera con 240 para configurar los 4 bits superiores en 1s y una operación NO ~ a nivel de bits para invertir todos los bits de modo que solo tengas un bit establecido que represente la fila en la que se presionó el botón. Almacene este número como 0, 1, 2 o 3.
Cambia la configuración del pin:
Hacer entradas de pines de columna con pull-ups habilitados. Hacer los pines de la fila de salida y la salida a cero a ellos Lee los pines de la columna y encuentra qué pin está bajo. Realice 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 reconfigurar los puertos, ya que es probable que desencadene interrupciones no deseadas. Es posible que tenga que borrar los indicadores de interrupción al salir de la rutina de interrupción para evitar el manejo duplicado de la interrupción.

    
respondido por el Darrell Harriman

Lea otras preguntas en las etiquetas