leer-un-pulsador-con-arduino

Leer un pulsador con Arduino

En el tutorial entradas digitales en Arduino vimos como leer un sensor que proporcione una señal digital con dos niveles de tensión LOW y HIGH. Nos quedó pendiente aprovechar las entradas digitales para leer el estado de un interruptor o pulsador con Arduino.

Para ello necesitaremos realizar correctamente un montaje específico y la ayuda de dos nuevas amigas las resistencias de Pull Down y Pull Up. Aunque ambos casos son muy similares, el montaje y el tipo de resistencia a usar dependerá de si queremos que al accionar el pulsador o interruptor leamos un valor LOW o HIGH.

Para entender el funcionamiento de ambos montajes vamos a presentar el razonamiento lógico por el cuál se llega al mismo, para lo cuál utilizaremos dos montajes incorrectos que nos ayudarán a entender el papel de cada elemento en el montaje definitivo.

Por tanto, empezamos con el primer intento de realizar una lectura del estado del pulsador.

Otra forma más avanzada de leer un pulsador es emplear interrupciones y aplicar un debounce para filtrar la entrada, como vemos en esta entrada

Primer intento, conexión directa

Nuestra primera idea para leer un pulsador podría ser conectar directamente un PIN digital de Arduino a un valor de tensión de referencia, ya sea este 0V o 5V. Al cerrar el pulsador la tensión en el PIN sería el valor de referencia (0V o 5V depende del montaje) y podríamos realizar la lectura como en cualquier entrada digital.

arduino-pulsador-1

¿Cuál es el problema? Bueno, esto funcionará cuando el interruptor está cerrado. Pero, ¿Qué pasa cuando el interruptor está abierto? En este caso estamos dejando el PIN totalmente desconectado de cualquier tensión, algo que denominaremos estado de alta impedancia.

¿Qué valor registra un autómata si realizamos la medición en estado de alta impedancia? Pues depende de varios factores, como la construcción interna del autómata o el último estado al que haya estado conectado. Pero, en resumen, la entrada está en un estado indeterminado, es decir, que puede asumir cualquier valor. Por tanto es necesario evitar esta situación en nuestros diseños.

¿Cómo podemos resolver este estado de indeterminación? Bueno, esto nos lleva directamente a nuestro segundo intento.

Mejorando nuestra solución, doble conexión

Lo siguiente que podríamos pensar es conectar el PIN a dos referencias de tensión, alternadas en función del estado del interruptor:

  • Para medir un valor LOW al accionar el interruptor, podemos conectar el PIN de forma fija a 5V, y a 0V a través del interruptor. Con el interruptor abierto leeríamos HIGH, y al cerrar el interruptor se forzaría 0V en el PIN, por lo que leeríamos LOW.
  • Para medir un valor HIGH al accionar el interruptor, podemos conectar el PIN de forma fija a 0V, y a 5V a través del interruptor. Con el interruptor abierto leeríamos LOW, y al cerrar el interruptor se forzaría 5V en el PIN, por lo que leeríamos HIGH.

arduino-pulsador-2

¿Cuál es el problema de este montaje? Pues que al pulsar el interruptor estamos conectando directamente los valores de 0V y 5V, lo que significa que estamos causando un cortocircuito. Esto provocaría el paso de un elevado de corriente y un rápido calentamiento de componentes y conductores.

¿Cómo evitar este cortocircuito? Bueno, estamos cerca. Esto lo veremos a continuación en el montaje definitivo.

Los cortocircuitos son fallos peligrosos. Además de dañar algún componente podéis llegar a provocar un incendio. Ser cuidadosos.

El montaje tampoco funcionaría porque estaríamos conectando el PIN simultáneamente a 0V y 5V, por lo que tendríamos nuevamente una indeterminación, y la medición real dependería de la resistencia de los conductores a ambos niveles de tensión.

Montaje correcto, resistencias de Pull-Down o Pull-Up

Como habíamos adelantado, para resolver el montaje correctamente necesitaremos la presencia de dos nuevas amigas, las resistencias de Pull Down y Pull Up. Estas dos resistencias son un mecanismo básico, muy habitual dentro del mundo de la electrónica y automatización.

arduino-pulsador-3

Las resistencias de Pull-Down y Pull-Up se conectan entre el PIN digital y una de las tensiones de referencia (0V o 5V) y “fuerzan” (de ahí su nombre) el valor de la tensión a LOW o HIGH, respectivamente.

  • La resistencia de Pull-Up fuerza HIGH cuando el pulsador está abierto. Cuando está cerrado el PIN se pone a LOW, la intensidad que circula se ve limitada por esta resistencia
  • La resistencia de Pull-Down fuerza LOW cuando el pulsador está abierto. Cuando está cerrado el PIN se pone a HIGH, y la intensidad que circula se ve limitada por esta resistencia

Así es como quedaría el montaje final en vista esquemática (la conexión de puede realizar en empleando cualquiera de los PIN digital).

arduino-pulsador-4

Y así el cableado en una placa de prototipos.

arduino-pulsador-5

Por último, la lectura del estado del PIN se realiza normalmente, tal y como vimos en el tutorial entradas digitales en Arduino.

const int inputPin = 2;

int value = 0;
 
void setup() {
  Serial.begin(9600);
  pinMode(inputPin, INPUT);
}
 
void loop(){
  value = digitalRead(inputPin);  //lectura digital de pin
 
  //mandar mensaje a puerto serie en función del valor leido
  if (value == HIGH) {
      Serial.println("Encendido");
  }
  else {
      Serial.println("Apagado");
  }
  delay(1000);
}

Pruébalo online

Arduino dispone de resistencias de Pull Up internas de 30k pero no suelen ser usadas por dos motivos.

  • Tienen poca autoridad (valor de resistencia demasiado alto)
  • Si la configuramos incorrectamente desde el programa, podemos generar un cortocircuto, por lo que es preferible conectara físicamente para verificar que no nos la hemos dejado.

¿Qué valor de resistencia elegir?

El valor de la resistencia viene condicionado por la intensidad que pasa al accionar el interruptor, y por un concepto llamado la “autoridad del Pull Down/up” que está relacionado con el ruido en la medición.

  • Una resistencia muy pequeña, tendrá mucha autoridad, pero permitirá el paso de una mayor corriente, lo que supone mayor consumo y mayor calentamiento.
  • Una resistencia muy grande, dejará pasar poca corriente, pero tendrá poca autoridad, por lo que será más susceptible a mediciones incorrectas debidas a ruido.

Descarga el código

Todo el código de esta entrada está disponible para su descarga en Github. github-full