Comportamiento inusual al controlar una matriz de botones

Tengo una matriz 4x4 para 16 botones. Cada fila/columna está conectada directamente a los pines de un microcontrolador desconocido. Cuando conecto los pines directamente entre sí, el microcontrolador se comporta correctamente, como si se presionara el botón respectivo.

Quiero controlar los pines directamente con un Arduino o conectarlos directamente a GND/VCC. Sin embargo, cuando los enciendo de esta manera, el microcontrolador:

  • no hace nada
  • se comporta como si se presionaran varios botones a la vez.

¿Porqué es eso? ¿Me estoy perdiendo algo, como resistencias pullup?

El microcontrolador admite ciertas pulsaciones de botones al mismo tiempo. Creo que tiene que ver con el escaneo de filas. <- Esto resultó ser cierto, el microcontrolador verificó una fila en ese momento. Por lo tanto, era necesario activar el pin de la columna solo cuando se seleccionaba la fila correcta.

Para escanear teclados de matriz utilizo interrupciones de temporizador, en cada una de las cuales leo la entrada primero y luego cambio la salida, esto permite la mayor latencia para las entradas y, como consecuencia, valores más altos para las resistencias pull up/down y un menor consumo de corriente. En este escenario, Arduino tiene tiempo para emitir la señal correcta, pero no garantiza que todos lo hagan de esta manera.

Respuestas (2)

La pregunta es: ¿cómo estás "controlando" los cables usando un arduino? El microcontrolador probablemente está tirando de las filas (o columnas) hacia arriba (o hacia abajo) una a la vez, y luego verifica el voltaje en el otro eje para detectar pulsaciones de botones en esa fila/columna.

Para emular esto usando un arduino, tendría que monitorear el eje energizado y luego enviar al eje de detección de manera sincronizada. Dependiendo de cómo esté programado el microcontrolador desconocido, esto puede ser muy difícil, porque podría leer muy pronto después de energizarse. Quizás demasiado rápido para que tu arduino reaccione.

También vale la pena señalar que existen otros arreglos además de fila/columna. ¿Estás seguro de que así es como está organizado el teclado?

Esto es exactamente lo que acabo de hacer, ¡funciona! Establecer todos los pines de la columna en BAJO, leer cuál de los pines de la fila se estableció en BAJO y luego establecer el pin de la columna derecha en ALTO solo cuando se alcanzó la fila derecha; de lo contrario, manténgalo BAJO. Me preocupaba que el Arduino pudiera ser demasiado lento, ya que el microcontrolador parece funcionar con 12 MHz. ¡Pero el intervalo de muestreo/luz estroboscópica de fila parece ser lo suficientemente grande! ¡Gracias!
Afortunadamente, los pines de columna y fila estaban secuenciales y separados en el controlador. Creé una matriz de entrada y también medí todos los pines a lo largo del tiempo, por lo que sabía cuáles eran salidas con pullups. Así que podía estar bastante seguro de que era así.

El teclado usa multiplexación, vea aquí la teoría.

Qué puedes hacer ?

Primero necesita identificar las entradas y las salidas y averiguar si el procesador desconocido impulsa las salidas en lógica positiva o negativa. Esto debería ser fácil ya que ya realizó algunas pruebas y la placa aún funciona. En lógica positiva, una entrada conectada a VDD mostraría tantos botones presionados a la vez. En lógica negativa, una entrada conectada a GND mostrará tantos botones presionados a la vez. Una salida no hará nada conectada a VCC o GND. Como supongo que puede ver las filas y las columnas, solo necesita hacer esta prueba para una línea de cada una. Incluso si aún no quemó una salida, use una pequeña resistencia para las pruebas (470 ohmios servirán). El ejemplo en el enlace está en lógica positiva (una entrada/salida activa es alta)

Puede intentar simular el comportamiento del teclado conectando cuatro entradas de arduino a las salidas del teclado del procesador y cuatro salidas de arduino a las entradas del teclado del procesador, pero es poco probable que esto funcione de manera confiable ya que para presionar una tecla simulada, la salida debe seguir la entrada conectada muy rápido. Un microcontrolador con motor CLC como algunos PIC-s de microchip puede hacer eso, pero Arduino no.

Puede usar una matriz de optoacoplador, si la matriz está en lógica positiva, conecte el colector del fototransistor a la salida, el emisor a la entrada y, a la inversa, si está en lógica negativa. Si funciona, también puede usar la multiplexación para controlar los optoacopladores como se ve al final del artículo en el enlace anterior. Puede encontrar optoacopladores cuádruples muy baratos como este , necesitará cuatro de ellos, menos de 10 $ para todos.