Matriz de interruptores y botones SPST con Arduino

0

Tengo un controlador que hice con el interruptor SPST (el tipo con el tipo de "cubierta de misiles") y botones momentáneos (por lo que los que normalmente están cerrados, hasta que los presionas, y una vez que se sueltan, vuelven al modo cerrado). posición). La matriz es un 7x6 usando pines digitales.

Todo funciona bien, siempre que los presione uno por uno, o active los interruptores uno por uno. pero si comienzo a tener los interruptores habilitados, como 3 o 4 de ellos en la posición abierta; y presiono un botón; En lugar de obtener solo el valor del botón presionado, disparo todos los botones que están en la misma columna / fila del botón presionado.

Entiendo que no debo usar los interruptores de palanca SPST para estos casos; y solo use los botones, pero estoy usando este artilugio, para jugar a juegos de simulación de vuelo, que requieren algunos interruptores para permanecer encendido o apagado (como las líneas de combustible del motor, luces y demás; que requieren, por motivos de realismo, estar encendidos o encendidos). fuera de posición, por lo que no puedo usar los interruptores de palanca momentáneos).

Mientras leía, descubrí acerca de fantasmas y enmascaramiento; y que se usa un diodo para solucionar problemas con varios botones presionados, aunque no estoy seguro de que esto se aplique al SPST; así que antes de desmontar el controlador, quiero entender mejor cuál es el problema que estoy experimentando.

Mi hardware es bastante simple: varios conmutadores y SPST conectados en una matriz de 7x6; que va a un teensy 3.1 (usando todos los GPIO digitales, no los analógicos). Puedo publicar el boceto si es necesario; es una versión ligeramente modificada de este tutorial: enlace

    
pregunta rataplan

2 respuestas

3

Estoy seguro de que esto se ha publicado al menos un millón de veces en la web en algún lugar. Resulta que recogí esta imagen de un manual en PDF que se encuentra en un sitio web que contiene documentos para capturar direcciones de correo electrónico, etc. Por lo tanto, no estoy proporcionando un enlace a ese sitio. De todos modos, es un buen diagrama:

EsossontodoslosconmutadoresSPST.(SialgunavezquieremanejarunSPDT,simplementetomedosfilasenunacolumnaarribaparaeso).

Losdiodosanterioressepuedencablearconpolaridadopuesta.Todoloquehaceescambiarelsignificadode"activo" frente a "inactivo". Como se muestra arriba, "activo" significa "HI".

La matriz anterior es más grande de lo que especificó. Pero transmite la idea y es incluso más grande de lo que necesita. Solo recorta filas o columnas, según corresponda.

No se muestran en la matriz anterior las resistencias "desplegables" en cada una de las columnas. Esto es para que cuando un interruptor en una fila activa no esté activado, el valor leído por la entrada de la columna será un BAJO definido. Pero si el interruptor está activado en una fila activa, entonces el diodo se detendrá en la línea de la columna y se leerá como ALTO definido por las entradas de la columna.

Para escanear, haría todas sus filas como salidas, con solo una de las filas active a la vez. Los demás serían inactive . Las columnas serían entradas.

Cuando una fila está activa, se leen los valores de todas las columnas. Por lo general, es conveniente organizar todas las columnas para que se adhieran a los pines en el mismo puerto de E / S de su MCU. Hace que leerlos sea más fácil / mejor.

Sería aconsejable hacer también la publicación de estos valores de columna. Usualmente uso una pequeña máquina de estado para este propósito, con \ $ 8 \: \ text {ms} \ $ por muestra y usando tres muestras para que cualquier interruptor complete su máquina de estado y sea reconocido como un valor. Se encuentra un ejemplo de la máquina de estado que uso aquí , aquí , y aquí . Por lo tanto, para mí esto es \ $ 24 \: \ text {ms} \ $ por valor abonado. Sin embargo, necesitas resolver tus propios problemas.

Si observa detenidamente la matriz anterior, creo que puede ver que si solo una fila está activa (ALTA en este caso) y todas las demás filas están inactivas (BAJA), entonces solo los interruptores a lo largo de esa fila están capaz de afectar los valores de columna que lees. Las demás filas (LOW inactivo) tendrán sus diodos polarizados en sentido inverso y no pueden afectar a la línea de la columna. Esto evita la interferencia de los conmutadores que no se están escaneando en este momento.

Hay muchos otros problemas con los que puede que tenga que lidiar. Ya he aludido a uno: tiempo de rebote. Pero hay más. ¿Cómo desea manejar eventos de pulsación múltiple, reinicio de teclas, combinaciones de teclas, etc.? Pero eso es solo software. Así que hazlo.

    
respondido por el jonk
0
  

Mientras leía, descubrí acerca de fantasmas y enmascaramiento; y que un   diodo se utiliza para solucionar problemas con varios botones pulsados, aunque   No estoy seguro de que esto se aplique al SPST; así que antes de desarmar el   controlador, quiero entender mejor cuál es el problema que soy   experimentando.

Tome un ejemplo simple de una matriz de conmutación que no utiliza diodos: -

He mostrado dos interruptores que están activados y, para este ejemplo, asumo que los interruptores normalmente están abiertos. Inmediatamente tiene un problema porque Y1 se acorta a Y3 y estas son salidas de controlador de fila. En otras palabras, sin un diodo en serie con cada interruptor, no se puede averiguar qué botones se presionan si se activa más de uno. Y1 cortocircuita a Y3 y produce un nivel de unidad lógica indeterminado.

Si desea determinar el estado de cada conmutador, necesita diodos en serie con CADA conmutador, de modo que Y1 no llegue a Y3 (en este ejemplo).

    
respondido por el Andy aka

Lea otras preguntas en las etiquetas