
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.
Anuncio:
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.
¿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.
¿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.
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.
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).
Y así el cableado en una placa de prototipos.
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); }
- 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.
Anuncio:
Por fin alguien que explica correctamente porqué se debe conectar un interruptor a + y -, el motivo, su función y porqué colocar una resistencia. Llevo días en otros blogs buscando la respuesta. Un diez amigo. Un abrazo de un principiante.
Me alegro de que te haya servido, gracias a ti por tu comentario!
Yo le doy un diez también….es lo que buscaba
Muy bueno Luis, lo voy a tomar como base para un estudio que estoy realizando. un abrazo desde argentina!
Estimado Luis, gracias por compartir estas librerias….. el tiempo que nos ahorras.
Estimado Luis, soy un ayudante de principiante (ja ja), pero con esfuerzo y mucho tiempo dedicado, he conseguido importantes avances. Empece con PIC y me pareció lo mas sencillo para aprender, pero todos los componentes y librerías venían dedicados a los arduinos…
Necesito que me ayudes, a realizar un contador que, con pulsador sume y con otro pulsador reste dicho contador.
Saludos desde Mendoza, Argentina.
Excelente la documentación, la gráfica y las explicaciones de cada uno de los temas, que tratas…
Hola, Echa un ojo a estas dos librerías, Debounce Filter https://www.luisllamas.es/libreria-arduino-debounce-filter/ y Countdown https://www.luisllamas.es/libreria-arduino-countdown. No deberías tener muchos problemas en juntarlas para hacer lo que quieres.
Un saludo!
No, las resistencias son obligatorias en todo caso. Es decir, te funcionaría, pero no es un montaje correcto.
Claro que es posible! Lee atentamente las entradas del blog y podrás hacerlo sin ningún esfuerzo
hola tengo una consulta, estoy simulando un sensor de distancia con un potenciometro 20 a 100 cm, como puedo hacer que al pulsa el pulsador me guarde ese valor y cuando la medicion del potenciometro sea menor a ese valor encienda un led de emergencia
Excelente explicación
Buenas luis he repetido tu ejemplo y funciona perfectamente, pero me a pasado una cosa lo e querido hacer en el ESP8266 y no me a funcionado, cosa que era de esperar ya que es otro modelo de Arduino sabes que cambios debo realizar en el ESP8266 para que me funcione igual el motivo de por que lo quiero realizar en el ESP8266 es para poder controlar la bomba de agua del pozo por Wifi y saber cuantas veces entra durante el dia, o si llega a entrar y no se llega a parar por cualquier motivo, ya que si… Read more »
Hola Alfredo, probablemente esta respuesta llegue demasiado tarde para ti, pero quizás ayude a los recién iniciados como yo. Tuve el mismo problema que tú, y he observado que el el ESP8266, concretamente el montado sobre NodeMCU, tiene una numeración en los pines que no coincide con la de Arduino. Por ejemplo, si queremos usar el pin D2 en NodeMCU, en el código fuente debemos poner el número 4. En el siguiente link encontraréis un esquema bastante claro de la correlación: https://www.luisllamas.es/esp8266-nodemcu/ Usando el mismo ejemplo, observaréis que el pin D2 corresponde con el valor GPIO4. Recordad que ese valor… Read more »
Luis, excelente tutorial muchas gracias por compartir tus conocimientos.
hola luis como podría hacer un programa en que el pulsador active al servo motor de 180 grados.
gracias
Hola Como puedo mezclar un sensor ultrasonico y un pulsador para comandar un porton? ?
Hola, me gustaria hacerte una consulta. ¿De que valor deberan de ser las resistencias?
hola un saludo, muchas gracias por tus grandes aportes e informacion que nos das, nos ayudas mucho. queria hacerle una consulta, tengo un codigo de luces que realiza unas frecuencias de encendidos y apagados mediante delay , y a la ves hay varias combinaciones de ella y las cambio por medio de un pulsador. mi problemas esta hay…. para poder cambiar a las diferentes combinaciones tengo que mantenerlo pulsado hasta que termine ese loop, por casualidad hay alguna forma que quede memorizado ese señal del pulsador? o hay esta el gran problema de los delay. muchas gracias y un cordial… Read more »
Te agradezco la explicacion, hasta obtuve mas información de lo que esperaba
Que grande LuisLlamas, mucha cantidad de información útil en tu página web, te sigo desde hace mucho. Muchas gracias por tu trabajo y espero que nunca desaparezca tu página.
[…] Enlace a web para ampliar sobre esto. […]
Luis eres grandioso. Muchas gracias por todo esto. Podrías indicar un valor para esas resistencias? Algo que te haya servido. Gracias.