fbpx

¿Cuál es la diferencia entre INPUT e INPUT_PULLUP?

Konrad Peschka
Konrad Peschka

Comparte este artículo

Share on facebook
Share on linkedin
Share on twitter

Sabemos que en Arduino los pines digitales nos sirven para leer datos (digitales) de un sensor o escribir datos (digitales) hacia un actuador.

Tabla de contenidos

Básicamente lo podemos configurar como salida o entrada:

  • SALIDA: esto es para escribir datos en un actuador, por ejemplo, un LED, un buzzer activo, un relé, un transistor, etc .
  • INPUT: se utiliza en aquellos casos donde necesitamos recibir datos ya sea de un botón o de un sensor. El valor que podemos leer es de ALTO o BAJO, HIGH o LOW (información digital).

Pero no muchos saben que hay una tercera opción: INPUT_PULLUP.

Esta opción es la misma que INPUT (que sirve para leer datos digitales), pero además de eso, se activa la resistencia pull up interna que vale entre 20k y 50k Ohm. El efecto que produce esta resistencia es que mantiene por defecto la lectura de la entrada en ALTO o HIGH o “1”.

No entiendo esto de la resistencia…¿de qué se trata?

Para explicarles mas en detalle, supongamos el caso donde queremos leer un pulsador como entrada digital. Queremos saber si el pulsador está o no presionado.

El problema del pulsador flotante

El Pulsador tiene 4 patitas de las cuales 2 están internamente conectados. Osea que podríamos decir que en realidad solo tiene 2 patitas que cuando uno lo pulsa, se conectan estas 2 patitas. De esa forma es que deja pasar la corriente y el Arduino se “da cuenta” de que esta presionado.

Bueno en principio parecería que el pulsador se conecta como esta aquí abajo en la imagen.

  • Una de las patitas a la entrada del Arduino.
  • Y la otra a negativo o GND.

Hagamos una prueba con este circuito, vamos a escribir un código simple para leer el pulsador e imprimir el valor por el puerto(monitor) serial.

const int BOTTON = 4;
void setup() 
{ 
Serial.begin(9600) ;
pinMode(BOTTON, INPUT) ;
}
void loop() 
{ 
Serial.println(digitalRead(BOTTON ));
delay(10);
}

Si ejecutamos este programa y abrimos Serial Plotter (Herramientas> Serial Plotter, o CTRL + MAYÚS + L), esto es lo que obtenemos, sin presionar el botón.

Cuando presionamos el botón, el valor siempre es BAJO, pero cuando lo soltamos es bastante aleatorio: a veces ALTO, a veces BAJO, y se mueve mucho.

A esta condición es a la que se denomina “flotante”, por que varía al azar entre 0 y 5V.

Esto sucede por que cuando dejamos de presionar el pulsador, el pin del Arduino no tiene una referencia de tensión para “saber” si el valor que esta leyendo es ALTO o BAJO. El único momento donde SI conoce cuál es la tensión es cuando se presiona el pulsador y entonces lo que lee es 0V (GND).

Para solucionar esto lo que tenemos que hacer es “forzar” el estado predeterminado (botón no presionado) para que esté cerca de HIGH o LOW, lo que lo hará bastante estable. Luego, cuando presionamos el botón, el estado simplemente pasará al estado opuesto al predeterminado.

Usando el INPUT_PULLUP del Arduino

Una forma de solucionar este problema (con el mismo circuito anterior) es usando el INPUT_PULLUP interno que viene en el código del Arduino.

Lo único que cambia en nuestro código es lo que va dentro de “pinMode”. Entonces nuestro código será el siguiente:

const int BOTTON = 4;
void setup() 
{ 
Serial.begin(9600) ;
pinMode(BOTTON, INPUT_PULLUP) ;
}
void loop() 
{ 
Serial.println(digitalRead(BOTTON ));
delay(10);
}

Si ejecutamos este programa y abrimos el Serial Plotter, vemos que el valor predeterminado es 1 (ALTO). Y cuando se presiona el botón, el estado pasa directamente a 0 (BAJO) y si lo soltamos vuelve a ALTO.

Ahora siii… está mucho mejor. ¡Podemos decir que el problema esta resuelto!

Cuando configura el modo en INPUT_PULLUP, lo que hacemos es habilitar una resistencia interna dentro del Arduino de valor estimado de entre 20k y 50k Ohm. Lo que hace esta resistencia a Positivo (5V) es asegurarnos que el estado por defecto que lee el Arduino es HIGH (Alto). Y que cuando presionamos el pulsador, entonces vemos LOW (bajo).

¿Y cómo puedo hacer si no quiero usar el INPUT_PULLUP?

Usando una resistencia externa

En lugar de usar la resistencia pull_up interno, podemos crear el mismo circuito por fuera del Arduino. Esto lo que nos da de ventaja es que podemos ajustar el valor de la resistencia como nosotros lo necesitemos.

El circuito quedaría así:

Lo que vemos de distinto en este circuito es la resistencia que agregamos de 10k Ohm entre una pata del botón (mismo lado que el lado de datos – pin digital 4) y VCC (5V).
Ahora, con este circuito ya no es necesario habilitar el pull_up interno porque lo hemos armado por fuera del Arduino.
En el código entonces nos queda asi:

const int BOTTON = 4;
void setup() 
{ 
Serial.begin(9600) ;
pinMode(BOTTON, INPUT) ;
}
void loop() 
{ 
Serial.println(digitalRead(BOTTON ));
delay(10);
}

Cuando ejecutamos el programa obtenemos el mismo resultado: el estado predeterminado del botón es ALTO, y cuando lo presiona, su estado pasa a BAJO.

Seguramente ahora se estarán preguntando…¿Y como hago que esto sea inverso?
Que cuando no se presiona el botón lea siempre BAJO y que cuando lo presiono lea ALTO?

Colocar la resistencia en pull down

Esta es otra opción que podemos utilizar y que es bastante popular por que a muchos nos gusta que cuando no este presionado el botón se lea un BAJO y que solo cuando lo presionamos, este en ALTO.

Al contrario de la resistencia pull_up, no puede configurar esto solo con el código porque Arduino no lo trae, por eso tendremos que utilizar una resistencia externa.
Aquí está el circuito.

El circuito es bastante parecido al anterior, pero veamos las diferencias:

  • La resistencia de 10k ohmios está entre una pata y el suelo (GND).
  • El cable para el pin digital 4 está en el mismo lado que el suelo.
  • El otro lado del botón está conectado a VCC (5V) directamente.

El código que se utiliza con este circuito es el mismo que antes, ya que la resistencia es externa, por ello en el pinMode(BOTTON, INPUT) ;

Si ejecutamos nuestro código, vamos a ver lo siguiente:

¡Excelente! Ahora, el valor predeterminado cuando no se presiona el botón es BAJO. Y en cuando SI se presioné el botón, el estado subió a ALTO.

Conclusión

En este post hemos viste 4 formas de conectar un pulsador al Arduino, de las cuales la primera que hicimos no era funcional.

No hay mejor o peor opción y dependerá de los componentes físicos (espacio) que dispongas para tu proyecto.

También es una cuestión de preferencia: ¿desea que el estado predeterminado (cuando no se presione) sea BAJO o ALTO?

Lo más importante es no tener un estado flotante del pulsador por que en ese caso vamos a tener falsas mediciones y nuestro código se va a volver loco.

Eso es todo de mi parte…dudas y consultas por favor déjenme sus comentarios aquí abajo.

Saludos Makers!

Responses

  1. Buenas noches Konrad.
    Me parece muy buena idea lo del Blog. Ya que sirve para aclarar algunos conceptos.
    He intentado realizar algunos ejemplos pero me daba error.
    He detectado que faltan algunos void y en serial algunas eses están en minúscula.
    Te lo comento por si alguno lo intenta creo que también le dará error.
    Muchas gracias

    1. Buen dia Fer, muchísimas gracias por haberlo probado!
      Me habré equivocado en el pasaje del código al word cuando escribir el blog.
      Mil disculpas por el error, ya están solucionados: 🙂
      Ahora si…a probar que sucede con el INPUT y el INPUT_PULLUP

Aprende con nuestros cursos

[uo_login_ui]