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

5

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 un botón. ¿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:

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

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

    
pregunta shoham

3 respuestas

4

Lo que está buscando se llama escalera de voltaje .

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

Elesquemaestávinculadodesde LCD Keypad Shield desde DFRobot.com .

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

Aquíhay un enlace a más información sobre este diseño , incluido un bosquejo de Arduino que lee y descodifica 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 manera que cada uno provoca una caída de voltaje en el pin analógico que se puede distinguir de los otros botones que se presionan. Normalmente veo casos en los que los valores de la resistencia aumentan exponencialmente (330R, 620R, 1K y 3K3 en este caso), pero creo que podría usar valores similares (todos ellos 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 distribuir, 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 distinguirse por las lecturas en la 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 causen una caída de voltaje que le proporcione más de 10 en cada llamada a analogRead (). Esto limitará el número máximo 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. Por lo tanto, elija un botón, reemplácelo por un cable y quite todos los otros botones. Luego puedes calcular el voltaje para ese botón.

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

  3. Construyéndolo. Coloque el circuito en una placa de prueba, 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 un botón al mismo tiempo. Si presiona más de un botón, solo se seleccionará el que esté más cerca de la parte superior de los esquemas.

    
respondido por el Ricardo
3

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 camino a tierra y, por lo tanto, no fluirá ninguna corriente. La entrada de Arduino se puede considerar como una resistencia extremadamente grande, no un buen camino a tierra.

  2. Valores sensibles mínimos para resistencias.

    Dado que uno de los extremos de la escalera va al poder y el otro a tierra, debe asegurarse de que (a) si presiona todos los botones no pasa por alto todos los resistores y cortocircuita su fuente de alimentación, y (b) a la resistencia mínima de la escalera, la corriente que fluye en la resistencia más pequeña no disipará demasiada potencia en ella.

    Dada una fuente de 5V y la resistencia 2k de kimliv, eso tendría (por ley de ohmios) 2.5ma fluyendo en ella, disipando (por P = VI) 12.5mW de potencia. Incluso las resistencias de montaje superficial pequeñas y pequeñas tienen una potencia nominal de 63 mW, por lo que estarán bien.

    Su resistencia 100R original tendría 50 m de corriente y 250 mW disipados, 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. Los valores de más de 100k (o intentar hacer lecturas muy rápidas) pueden necesitar 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 razonable y elegir los otros en función de ese valor funciona bien.

    
respondido por el pjc50
2

Prueba este circuito:

simular este circuito : esquema creado usando CircuitLab

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

    
respondido por el kimliv

Lea otras preguntas en las etiquetas