Para mi proyecto del Reloj VFD voy a necesitar conectar varios pulsadores a mi Arduino. Aún no tengo decidido el número, pero como mínimo 4, esto hace que necesite por cada pulsador, una entrada digital. Lo último sería verdad si conectase los pulsadores de la manera más usual, pero no va a ser así. En esta pequeña entrada os voy a explicar como conectar varios pulsadores a un Arduino con solo una entrada analógica.

Entradas analógicas

Para poder conectar varios pulsadores a Arduino, vamos a necesitar usar las entradas Analógicas. Las entradas digitales, solo nos permiten saber si una señal está en nivel alto o nivel bajo, es decir solo nos puede dar dos valores, 1 o 0. Sin embargo, las entradas analógicas tienen un rango mucho más amplio de valores posibles, y esto es lo que vamos a usar para leer diferentes valores.

Las entradas analógicas sirven para leer el valor de voltaje, en vez de leer un altobajo, leemos por ejemplo 3.42V, es decir un valor analógico. Voy a usar un Arduino Nano y estas plaquitas pueden leer entre 0 y 5 voltios. Cuando nuestro microcontrolador lee un valor analógico, necesita guardarlo en algún sitio para que luego nosotros podamos usar ese valor en nuestro programa. Como el Arduino tiene un ADC de 10 bits, significa que solo vamos a poder usar 10 bits de un número entero para representar nuestro valor de voltaje.

En un número de 10 bits podemos contar desde 0 (todos los bits a 0) hasta 1023 ( todos los bits a 1), por lo tanto si el valor máximo (1023) representa a los 5 voltios, podemos hallar la fórmula para cambiar entre el valor leído y el voltaje como:

    \[V = \frac{\text{entero}}{1023}\]

Esto último os lo lleváis de gratis porque no nos hace falta para poder hacer lo que nosotros queremos. En nuestro caso, nos da igual el valor absoluto de voltaje, nos basta con ver qué valor entero nos llega.

Leyendo varios pulsadores

Lo que queremos conseguir en que dependiendo del botón que se pulse, se varíe el voltaje a la entrada analógica del Arduino. Para así, sabiendo que valor ha llegado, sabemos que botón se ha pulsado. A continuación tenéis el circuito para leer varios botones con solo un pin del Arduino. La etiqueta “SW_INPUT” es cualquier entrada analógica de Arduino.

Diagrama de conexiones

Diagrama de conexiones

Cuando se pulsa un botón se genera un divisor de tensión y por ejemplo, si se pulsa el SW1, tendremos el divisor formado por 100 Ohms y 1 KOhm, por lo tanto el voltaje que se leería en el SW_INPUT sería de 5\frac{100}{1.100} = 0.45V aproximadamente un valor de 465 en el Arduino.

Cuando se pulsase cualquier de los otros botones se formaría un divisor diferente y por tanto tendríamos un valor de voltaje dependiente del botón que pulsamos.

Paso 1: Leer los valores y apuntarlos

Para saber que valores recibimos, podríamos hacer la cuenta pero dado que los ADCs no son perfectos deberíamos hacer un pequeño software que nos vaya diciendo que valores lee con cada pulsación.

El código para este primero programa simplemente leería el ADC y luego lo mostraría por el puerto serial para nosotros poder apuntarlo.

int pinADC = 14; // A0 en el nano

void setup(){
    Serial.begin(9600);
    pinMode(pinADC, INPUT);
}

void loop(){
    Serial.println(analogRead(pinADC));
    delay(100);
}

Si ejecutamos este código y vemos los valores de salida, podremos apuntar los valores que obtenemos en las lecturas del ADC para cada botón. A veces, estos valores bailan un poco, así que si el baile es bastante grande, es mejor apuntar el rango que obtenemos para el Paso 2.

Paso 2: Crea el programa para leer los pulsadores

Una vez que tenemos apuntados los valores que obtenemos de los diferentes botones, tenemos que hacer el programa que en función de cual está pulsado hace una u otra cosa.

Para el siguiente código he supuesto que tenemos 2 botones y que nos dan la medida de:

  • Botón 1: valor entero 200
  • Botón 2: valor entero de 600

Como los valores están separados, podemos poner un margen de 100 por arriba y abajo por si hay pequeñas variaciones en el voltaje.

El código que nos quedaría sería muy sencillo:

int lectura_adc;

int pinADC = 14; // A0 en el nano

void setup(){
    pinMode(pinADC, INPUT);
}

void loop(){
    lectura_adc = analogRead(pinADC);

    if (lectura_adc < 50){
        // Ningún botón pulsado, lectura cerca de 0
    }else if(lectura_adc  > 100  && lectura_adc < 300){
        // Boton 1...
    }else if(lectura_adc > 500 && lectura_adc < 700){
        // Boton 2...
    }

}

Extra: Como elegir las resistencias

Aunque parezca una tontería, la elección de las resistencias nos puede ayudar a ahorrar potencia en nuestro sistema. Una cosa buena de nuestro circuito es que el consumo es cero mientras no se pulse ningún botón. Además, solo consume el rato que el botón esté pulsado, por lo que es un circuito apto para sistemas que funcionen con baterías. Sin embargo, si la elección de las resistencia no es la correcta, nos arriesgamos a picos de consumo para esta tontería.

Si por un casual, elegimos la resistencia de tierra de 10 ohmios, cuando se pulse el botón que conecta directamente con 5V, estarán pasando 0.5 amperios por la resistencia! Necesitaríamos una resistencia de 1W para poder manejar eso con tranquilidad. Es una locura!!

Por otro lado, la impedancia de entrada hacia el ADC no debería ser mayor de 20-40 KOhms, por lo que tampoco podemos poner resistencias de 1 MOhm para que no circule corriente. Por lo tanto, vamos a ver como podemos elegir la resistencia común y las resistencias de cada pulsador.

Resistencias de los pulsadores

Lo primero que queremos optimizar es el uso de las resistencias, además de hacer que los valores que obtenemos en el Arduino sean fáciles de tratar. Para ello es muy fácil de ver que cuanto más separados estén los valores de voltaje que leemos, más fácil será para Arduino discernir que botón está pulsado. Además, de que esta será la mejor opción para defendernos contra el posible ruido en los cambios de voltaje.

Lo primero vamos a definir N como el número de botones que queremos tener y V_{DD} como el voltaje de alimentación del circuito. Sabemos que el voltaje cero, corresponde a ningún pulsador y el siguiente voltaje que podemos usar sería el \frac{V_{DD}}{N}, luego \frac{V_{DD}}{N}\cdot 2 y así hasta llegar a \frac{V_{DD}}{N}\cdot N = V_{DD}.

Es decir, el voltaje que queremos leer con cada botón i-ésimo V_i es :

    \[V_i = \frac{V_DD}{N}\cdot i\]

Y además, el divisor de tensión sabemos que nos generará para cada botón un voltaje de:

    \[V_i = V_{DD} \frac{ R_i}{R_i + R_C}\]

Donde R_C es la resistencia común. Por tanto, de la ecuación anterior podemos despejar R_i:

    \[R_i = R_C \frac{V_{DD}-V_i}{V_i}\]

Como además sabemos que:

    \[V_i = \frac{V_{DD}}{N}\cdot i \Rightarrow R_i = R_C \left( \frac{N}{i} - 1 \right)\]

De esta manera tan sencilla podemos calcular cuales serían nuestras resistencias de cada pulsador. Si por ejemplo tuviéramos 3 resistencias, N=3 para cada i tendríamos:

  • R_1 = R_C (3/1 -1) = 2R_C
  • R_2 = R_C (3/2 -1) = 1/2 R_C
  • R_3 = R_C (3/3 -1) = 0 (Este es el pulsador que no tiene resistencia! todo cuadra!)

Resistencia Común

Muy bien sabemos calcular cuanto tiene que valer cada resistencia del circuito en función de la resistencia base, porque si os fijáis, no depende para nada del voltaje de alimentación ni de nada por el estilo, solo de la resistencia base.

Sin embargo, el valor de la resistencia base todavía no lo tenemos. Como sabemos que la mayor resistencia que vamos a tener que poner siempre va a ser R_1 que es igual a:

    \[R_1 = R_C (N-1)\]

Y como la resistencia máxima que podemos tener a la entrada del ADC, para que le de tiempo a hacer la medición, es de unos 10-20 KOhms, podemos calcular que :

    \[R_C \leq \frac{15 k\Omega}{N-1}\]

Usando 15k\Omega por poner un valor medio, si queréis aseguraros de que el ADC va sobrado bajar este valor.

Resumen: A mi dime las cosas directamente.

Si te parece mucho tostón todo lo de arriba aquí te dejo como calcular las resistencias de tu entrada de multiples pulsadores, para optimizar los valores.

  • N: Número de pulsadores que quieres
  • V_{DD}: Voltaje de alimentación del circuito de pulsadores.
  • R_i: Resistencia del pulsador i-ésimo
  • R_C: Resistencia común, la que va de la salida a tierra

    \[R_i = R_C \left( \frac{N}{i} - 1 \right)\]

    \[R_C \leq \frac{15 k\Omega}{N-1}\]

Espero que esta entrada os haya resultado útil!

Nos vemos en la próxima!


Gluón

Teleco con ganas de aprender más y compartirlo. Viajero empedernido y amante de la fotografía y la tecnología. Espero dejar mi granito de arena y que este pueda servir de ayuda.