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:
¿Cómo puede funcionar esto sin ningún multiplexor?
¿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.
¿Como funciona?
Respuestas:
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í:
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.
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.
fuente
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.
fuente
Aquí se explica cómo hacerlo sin escaneo continuo:
fuente
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.
fuente