Más de un botón en el mismo pin

12

Estoy haciendo algún proyecto y estoy usando Arduino para crear un prototipo, tengo que usar 10 botones (junto con más cosas) y no tengo suficientes pines.

Una solución que se me ocurre es usar los pines analógicos y usar cada uno de ellos para dos botones, algo como esto:

esquemático

simular este circuito : esquema creado con CircuitLab

De esa manera puedo leer el pin A0 y saber cuál de ellos está siendo empujado al ver si el voltaje es de 5V o la mitad de eso.

¿Es esta una buena idea? NUNCA se supone que deben presionarse los diferentes botones al mismo tiempo, que es el único problema que puedo pensar.

¿Hay mejores formas?

MyUserIsThis
fuente
¿Cuántos pines estás tratando de usar?
W5VO
@ W5VO Necesitaría 22, con 10 botones, la placa solo tiene 18 ... así que dos botones para cada pin analógico solo necesito 5 pines analógicos y la placa tiene 6.
MyUserIsThis
1
Solo para su información, muchos fabricantes de automóviles utilizan el mismo enfoque para los controles montados en el volante del sistema de audio. Tienen (dar o recibir) 8 botones, cada uno con su propia resistencia. Esto les permite pasar un solo cable (o un par de cables para garantizar un retorno limpio) desde la rueda hasta el cabezal de audio. Es un enfoque perfectamente bueno.
DoxyLover
Creo que en realidad puedes usar tres pines para ingresar teóricamente un número infinito de interruptores usando algunos registros de desplazamiento. También es posible usar 8 pines para ingresar 256 interruptores usando multiplexores.
Alvin Wong

Respuestas:

22

¿Por qué desperdiciar múltiples pines analógicos para dos interruptores cada uno, cuando podría hacer cualquier cantidad de botones en un solo pin analógico?

Dos formas de hacerlo. Uno está en serie, el otro es paralelo.

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Así son algunos controles de audio del volante del automóvil. Y cómo funcionan algunos de los controladores en línea para iPod más antiguos.

Dependiendo de las resistencias que use, si necesita presionar varios botones al mismo tiempo y qué tan sensible es su entrada analógica, podría tener los 10 botones en un solo pin.

Transeúnte
fuente
Gracias, también pensé en esto, pero también pensé que tal vez las lecturas de voltaje no fueron tan exactas como las necesito para poder confiar en este método. Intentaré esto también y veré cómo funciona.
MyUserIsThis
Dado que los fundamentos del análisis de mi red de resistencias no son muy sólidos, intenté usar CircuitLab para simular el circuito en serie y dibujar una tabla de verdad para la medición de voltaje en el pin de entrada analógica. Descubrí que las combinaciones B2 + B3 dan como resultado 2.499V y las combinaciones B1 + B4 dan como resultado 2.498V. Con cifras tan cercanas, creo que el ADC típico de 10 bits no podrá diferenciar las combinaciones de entradas múltiples correctamente. Qué dices ? Por supuesto, una clave a la vez, funcionaría perfectamente, sin duda. Nota B1 = Botón1.
icarus74
En realidad, B2 + B4 da 1.666V, mientras que B2 + B3 + B4 también da 1.666V. La solución podría estar usando diferentes valores de resistencias para R1, R2, R3, R4 y no mantenerlos a todos en 1K. Que dice ?
icarus74
77
Una escalera 2R / R antigua convertía los botones en D / A, y cada combinación de pulsaciones de botones tendría un valor único. Confiaría en que funcione con botones N-3, donde N es la resolución ADC
Scott Seidman
1
@ icarus74 sí, usar diferentes valores en lugar de todos los 1k, daría combinaciones únicas. Trate de 1k, 2k, 4k, 8k, 16k, etc (O 1k, 4k, 16k, etc, para una gama más amplia)
Passerby
10

Eso funcionaría, pero una mejor manera es con una matriz . Este es el mismo concepto que los LED de multiplexación con una matriz, pero con interruptores.

ingrese la descripción de la imagen aquí

Esta es una matriz de 2x2. Una matriz útil es más grande, porque a este tamaño, no está guardando ningún pin sobre la conexión de los interruptores individualmente.

Con una matriz 3x3 puede obtener 9 interruptores. Necesita 10, por lo que puede agregar una fila más o una columna más y admitir 12 interruptores, o simplemente colocar el décimo interruptor en su propio pin.

La ventaja aquí es que puede usar IO digital, que es más barato y generalmente más abundante que IO analógico. Un registro de turno es una forma económica de agregar más E / S digitales, si se agota.

Si desea incluso menos pines, puede, para aumentar su complejidad, usar charlieplexing . Tendrá que agregar diodos además de sus interruptores, y estos diodos probablemente cuestan tanto como un registro de desplazamiento. Sin embargo, si el costo no es su principal preocupación, entonces puede tener alguna ventaja. Con este método, puede leer todos sus interruptores (hasta 12, en realidad) con cuatro pines.

Phil Frost
fuente
Sólo una pregunta. ¿Por qué es esto mejor si necesitaré más pines? De esta manera necesitaré 6 pines para la matriz de 9x9 más un pin más para la décima, mientras que en lo que hice, necesitaría solo 5 pines.
MyUserIsThis
@MyUserIsEsto se escala mejor a medida que aumenta el número total de interruptores. Por ejemplo, una matriz de 5x5 le permite conectar 25 interruptores a 10 pines. Como comentario más general, hacer las cosas de la manera convencional facilita que cualquier otra persona entienda lo que has hecho; y para que reconozcas lo que hacen los circuitos de otras personas (porque te has entrenado en la implementación estándar).
Dan está jugando con Firelight el
@MyUserIsEste ver ediciones. El transeúnte también tiene una buena respuesta.
Phil Frost
2

La entrada analógica es un enfoque válido, debería poder tener varios botones. También me gustaría sugerir usar un chip IO Expander como el MCP23017 . Tiene 16 pines que pueden ser entradas son salidas y se controla con I2C usando dos pines. Adafruit tiene una biblioteca Arduino para ello.

BrianK
fuente
2

Sí, parece una buena idea, pero de todos modos voy a proponer una alternativa que se me ocurrió.

Si tiene acceso a puertas lógicas, puede asignar muchos nbotones a ceil(log2(n + 1))pines a través de la lógica booleana. Como ejemplo, si tiene 4 botones, pero solo 2 pines, puede crear una configuración como esta:

Buttons | Pins
----    | --
0123    | 01
----    | --
0001    | 00
0010    | 01
0100    | 10
1000    | 11

Es decir, button0presionado debe tener pin0y pin1bajo; button1, pin0bajo y pin1alto; button2, pin0alto y pin1bajo; y button3, pin0y pin1alto.

De esto surgirían las siguientes expresiones booleanas

pin0 = button2 OR button3
pin1 = button1 OR button3

De este modo, se podría realizar una asignación de 4 botones a 2 pines con solo 2 compuertas OR. Sin embargo, necesitaría un pin adicional y algo de lógica adicional para indicar si se está presionando algún botón.

Por supuesto, aún habrá problemas si se presionan varios botones simultáneamente.

Además, si aún seguirá con el enfoque de resistencia, considere usar valores más grandes en las resistencias que no sean 100 ohmios, ya que 5 V a través de resistencias del orden de 100s de ohmios producirían una corriente del orden de 10s de mA, que es amable de innecesariamente alto. Supongo que valores más razonables serían 10k Ohm o 47k Ohm.

nijoakim
fuente
Gracias por tu acercamiento. También pensé en algo así, pero no tengo puertas lógicas y tengo toneladas de resistencias. Y sí, generalmente uso resistencias de 10k para esto, 100 ohmios era solo el valor predeterminado del editor de circuitos. Gracias de nuevo por tu ayuda.
MyUserIsThis
Creo que finalmente usaré el enfoque de resistencia, ya que no tendré que comprar puertas lógicas, además su enfoque lógico me ahorra solo 1 pin y no lo necesito. Sin embargo, tendré esto en mente para proyectos más grandes. Muchas gracias.
MyUserIsThis
¡Bueno! ¡Buena suerte con tu proyecto!
nijoakim
0

La siguiente página puede ser útil:

http://txapuzas.blogspot.co.uk/2010/07/papertecladoanalogico-varios-pulsadores.html

Está escrito en español, pero los esenciales están graficados, creo que es una muy buena idea para ti.

En este video puede ver el resultado final, el boceto también está en la página, función encapsulada para facilitar la implementación en sus proyectos

Video de Youtube: teclado de 10 teclas en un solo pin

Aquí hay un esquema del sitio anterior:

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

JohnnyDeauville
fuente
2
Agregue un resumen de lo que contiene el enlace en caso de que fallezca, especialmente cuando está en español y este es un sitio en inglés.
PeterJ
Lo sentimos, puede ser la situación normal de que en España es normal consultar una publicación en inglés ... Pero el enlace es muy interesante, dice cómo construir un teclado de 10 teclas usando solo un pin con la descripción de la foto paso a paso, los diagramas para hacer un tablero y una imagen para hacer la tapa de los botones. También el código para gestionar el teclado, de fácil comprensión. Bonito desarrollado, creo.
JohnnyDeauville
No se trata solo del lado español de las cosas, estoy de acuerdo en que el diagrama es claro, se ve bien y puedo resolver de qué se trata solo en base a eso. Pero Stack Exchange desalienta las respuestas de solo enlaces porque no son útiles si el enlace muere, imagínese si ese blog se cierra / borra mañana lo útil que sería la respuesta. Tal vez podría incluir el esquema y una o dos oraciones al respecto y simplemente dejar el enlace como referencia para obtener más información.
PeterJ
Soy un novato en este foro, ¿cómo puedo hacer que me lo digas? Alguna sección en especial ...? Gracias por su tiempo
JohnnyDeauville
Acabo de incluir el esquema y la referencia de donde vino, pero también podría valer la pena traducir un poco más de la página para dar un contexto sobre cómo funciona y cuáles serán las lecturas de ADC.
PeterJ