Qué resistencias usar para leer varios botones con un solo pin analógico

EDITAR: ¡Gracias, todos ustedes ayudaron mucho! Ricardo resumió todo muy bien, así que marcaré su respuesta como la mejor, pero todas las respuestas me ayudaron a entender. Gracias de nuevo :).

Tengo un Arduino Uno R3 y quiero conectar un circuito que me permita leer varios botones usando un solo pin de entrada analógica. Básicamente, quiero que el circuito imite un potenciómetro discreto, pero quiero usar botones en lugar de una perilla. ¿Cómo puedo hacer eso? ¿Y cómo sé qué resistencias usar en mi circuito?

Aquí hay una foto del circuito que tengo en mente:

Circuito

¿Qué valores debo darle a las resistencias? ¿Y por qué?

¿Cómo puedo conectar un circuito así para que mi arduino no se fríe?

Si ese es todo el circuito, entonces el arduino siempre leerá 5V en el pin ADC. En el lado positivo, es seguro con cualquier valor de resistencia allí.
Oh. Entonces, ¿qué debo hacer para que obtenga los valores que obtendría si usara la corriente?
La placa arduino tiene una resolución de 10 bits, ¿es suficiente para 15 botones? y como calculo las cosas que dijiste?

Respuestas (4)

Lo que buscas se llama escalera de voltaje .

A continuación se muestran algunos esquemas que muestran un ejemplo de una escalera de voltaje.

esquemas de escalera de voltaje

El esquema está vinculado desde el LCD Keypad Shield de DFRobot.com .

En este caso, la escalera de voltaje se usa para obtener la entrada de 5 botones usando solo una entrada analógica en el Arduino. Los botones están organizados como 4 flechas de cursor y un botón de selección como en la siguiente imagen:

Escudo de teclado LCD

Aquí hay un enlace para obtener más información sobre este diseño , incluido un boceto de Arduino que lee y decodifica los valores de la escala de voltaje y determina qué botón se presionó.

Aquí hay otro ejemplo , ahora de Freetronics.com , con más información sobre cómo funciona la escalera.

Volviendo a su pregunta, los valores de resistencia se seleccionan de modo que cada uno provoque una caída de voltaje en el pin analógico que se puede distinguir de las otras pulsaciones de botones. Normalmente veo casos en los que los valores de las resistencias suben exponencialmente (330R, 620R, 1K y 3K3 en este caso), pero creo que podrías usar valores similares (todos como 330R). Además, R2 está ahí para evitar un cortocircuito entre 5V y GND cuando se presiona el primer botón.

Si tuviera, digamos, 15 botones para diseñar, tendría que tener 15 resistencias, y tendría que asegurarse de que la caída de voltaje entre las resistencias adyacentes sea lo suficientemente alta como para ser distinguida por las lecturas en el pin analógico. Debe considerar que el ATmega328P tiene un ADC de 10 bits (es decir, le dará valores entre 0 y 1023) pero solo muestra una precisión de 4 bits (es decir, mostrará un error de aproximadamente 10 en cada lectura). Por lo tanto, debe buscar valores de resistencia que provoquen una caída de voltaje que le proporcione más de 10 en cada llamada analogRead(). Esto limitará la cantidad máxima de botones que puede leer de esta manera.

Hay principalmente 3 formas de obtener los valores de resistencia:

  1. Puede calcular la lectura de voltaje para cada botón considerando ese botón como presionado, eliminando las partes del último circuito de voltaje que están abiertas y aplicando la Ley de Ohm. Entonces, elija un botón, reemplácelo por un cable y elimine todos los demás botones. Entonces puedes calcular el voltaje para ese botón.

  2. También puede simular el circuito. ¿Notaste que puedes simular el circuito publicado por kimliv? Al hacer clic en sus esquemas, accederá a CircuitLabs, que es un sitio web que le permite simular circuitos. Allí podrá cambiar los valores de resistencia, presionar botones y ver los resultados. También puede usar otros paquetes de simulación de circuitos que están disponibles.

  3. construyéndolo Diseñe el circuito en una placa de prueba, luego pruebe diferentes valores de resistencia y mida la caída de voltaje con Arduino y Serial.println(). También puede usar un multímetro digital (DMM) para eso.

Tenga en cuenta que la escalera de voltaje solo registra una pulsación de botón a la vez. Si presiona más de un botón, solo se selecciona el que está más cerca de la parte superior de los esquemas.

¿Por qué elegiste esos valores de resistencia específicos? ¿y si tuviera 15 botones?
Los valores de resistencia se seleccionan de modo que cada uno tenga una caída de voltaje que se pueda distinguir cuando se presionan otros botones. Normalmente veo casos en los que los valores de las resistencias suben exponencialmente (330R, 620R, 1K y 3K3 en este caso), pero creo que podrías usar valores similares (todos como 330R).
Si tenía 15 de ellos, debe asegurarse de que la caída de voltaje entre las resistencias adyacentes sea lo suficientemente alta como para ser distinguida por las lecturas en el pin analógico. Debe considerar que el ATmega328P tiene un ADC de 10 bits (es decir, le dará valores entre 0 y 1023) pero solo muestra una precisión de 4 bits (es decir, mostrará un error de aproximadamente 10 en cada lectura). Por lo tanto, debe buscar valores de resistencia que caigan de voltaje que le den más de 10 en cada llamada analogRead().
¿Hay una buena manera de probar eso? Quiero decir, aparte de comprar 100 resistencias de diferentes valores y probarlas.
Puede calcular la lectura de voltaje para cada pulsación de botón quitando las partes del último circuito de voltaje que están abiertas y aplicando la Ley de Ohm. Entonces, elija un botón, reemplácelo por un cable y elimine todos los demás botones. Luego encontrará el voltaje para ese botón. Tenga en cuenta que la escalera de voltaje solo registra una pulsación de botón a la vez.
También puede simular el circuito. ¿Notaste que puedes simular el circuito publicado por kimliv? Al hacer clic en sus esquemas, accederá a CircuitLabs, que es un sitio web que le permite simular circuitos. Allí podrá cambiar los valores de resistencia y ver los resultados. Esas son las tres alternativas que tienes: calcularlo, simularlo y construirlo.

Solo mencionaré cosas que las otras respuestas no han abordado:

  1. Tenga en cuenta que un extremo debe ir a VCC y el otro a tierra, y su punto de medición debe estar en algún lugar en el medio.

    Su circuito original no tiene un camino a tierra y, por lo tanto, no fluirá corriente. La entrada de Arduino se puede considerar como una resistencia extremadamente grande, no un buen camino a tierra.

  2. Valores mínimos sensibles para resistencias.

    Dado que un extremo de la escalera se enciende y el otro a tierra, debe asegurarse de que (a) si presiona todos los botones, no omita todas las resistencias y cortocircuite su fuente de alimentación, y (b) en el resistencia mínima de la escalera, la corriente que fluye en la resistencia más pequeña no va a disipar demasiada potencia en ella.

    Dado un suministro de 5V y la resistencia de kimliv de 2k, tendría (según la ley de ohm) 2.5ma fluyendo en él, disipando (por P = VI) 12.5mW de potencia. Incluso las pequeñas resistencias de montaje en superficie tienen una potencia nominal de 63 mW, por lo que estará bien.

    Su resistencia 100R original tendría una corriente de 50 mA y una disipación de 250 mW, lo que quemará las resistencias diminutas y hará que las de tamaño normal se calienten notablemente.

  3. Valores máximos sensibles para resistencias.

    Las resistencias grandes son más ruidosas. También debe permitir que una pequeña cantidad de corriente fluya hacia el ADC para tomar lecturas. Con valores superiores a 100k (o tratando de hacer lecturas muy rápidas), es posible que deba comenzar a considerar estos efectos.

Este circuito no depende de valores absolutos específicos, por lo que elegir arbitrariamente 1k o 2k como un mínimo sensato y elegir los demás en función de ese valor funciona bien.

Prueba este circuito:

esquemático

simular este circuito : esquema creado con CircuitLab

Ahora obtienes diferentes valores para diferentes combinaciones de botones. Creo que estás buscando esto.

Ok, pero ¿por qué elegiste esos valores para las resistencias? ¿Y si tuviera 15 botones en una configuración similar?
Lo importante es que si sumas cualquier valor, no obtienes otro como resultado.
necesita los 2k en la parte superior entre 5V y GND para evitar un cortocircuito. el resto tiene que seguir mi declaración superior
¿Es seguro el 2k? ¿Cómo te decidiste por 2k?
Si toma la ley de Ohms, tiene: I = U / R en este circuito, el peor de los casos es si presiona el botón SW1 y obtiene I = 5/2000 => I = 0.0025A (2.5mA) que está bien para el Arduino
si desea detectar múltiples entradas de botones a la vez, use este circuito: i2.wp.com/tronixstuff.com/wp-content/uploads/2012/02/…
¿Qué valores están bien para el arduino?
los valores en mi dibujo son buenos
@kimliv Lo siento, soy muy principiante. Vengo del campo del software y acabo de empezar con la electrónica. Entonces, si tengo 10 botones, ¿cuáles son sus sugerencias para elegir los valores de resistencia? ¿Cualquier 10 valores (con casi la misma diferencia) de 330 a 4k?

Además de elegir valores de resistencia sensatos con el consumo de corriente, en realidad desea que diferentes botones en la escalera produzcan pasos de voltaje uniformes en el ADC, lo que facilita la conversión y aumenta la inmunidad al ruido. Considere la siguiente escalera de voltaje:

esquemático

simular este circuito : esquema creado con CircuitLab

Idealmente, le gustaría que los botones produzcan voltajes con incrementos de 0,25·VCC: 0, 0,25, 0,5, 0,75. El quinto nivel de voltaje, VCC, se detectará cuando no se presione ningún botón.

Puede elegir el valor R0 libremente y luego calcular los valores restantes para producir los pasos de voltaje deseados. Supongamos que R0 = 1 kOhm:

  • R1 debería caer 1/4 VCC, entonces R1/(R1+R0) = 1/4, R1 = R0/3 = 330 Ohm
  • R1+R2 debería caer 1/2 VCC, entonces (R1+R2)/(R0+R1+R2) = 1/2, R2 = 660 Ohm
  • R1+R2+R3 debe caer 3/4 VCC, entonces (R1+R2+R3)/(R0+R1+R2+R3) = 3/4, R3 = 2 kOhm

Esto se puede generalizar fácilmente a más botones.