Hay dos tipos diferentes de interruptores:
- Botones que pierden la conexión cuando se sueltan. Los botones alimentan un dispositivo mientras el botón esté pulsado.
- Interruptores que mantienen el estado cuando se pulsa el interruptor para mantener la conexión mientras se vuelve a pulsar el interruptor.
Los botones y los interruptores pueden tener un problema de rebote, que puede llevar a errores funcionales en su programa. En este artículo te muestro cómo arreglar este problema con una solución de software y otra de hardware.
6. Febrero de 202111. Agosto de 2019 por cdaviddav
Tutorial sobre conmutadores para Arduino, ESP8266 y ESP32
Hay dos tipos diferentes de interruptores:
- Botones que pierden la conexión cuando se sueltan. Los botones proporcionan energía a un dispositivo siempre que se presione el botón.
- Interruptores que mantienen el estado cuando se presiona el interruptor para mantener la conexión mientras se presiona el interruptor nuevamente.
Los botones e interruptores pueden tener un problema de rebote, lo que puede causar errores funcionales en su programa. En este artículo, le muestro cómo solucionar este problema con una solución de software y hardware.
¿Cómo funcionan los interruptores?
Quizás se pregunte por qué el interruptor de cuatro pines tiene 4 patas. ¿Cómo conectamos el interruptor a otros componentes?
Si el interruptor de cuatro pines no está presionado, los pines A y C están conectados, así como los pines B y D. Si el interruptor está presionado, la conexión de los pines cambia y todos los pines están conectados entre sí. Por lo tanto, no hay diferencia si conecta el componente que desea encender al pin B o al pin D en el otro lado del botón.
La siguiente tabla le brinda una descripción general de todos los componentes y partes que utilicé para este tutorial. Recibo comisiones por compras realizadas a través de los enlaces de esta tabla.
Arduino Nano | Amazon | AliExpress |
Arduino Pro Mini | Amazon | AliExpress |
Arduino Uno | Amazon | AliExpress |
Arduino Mega | Amazon | AliExpress |
ESP32 ESP-WROOM-32 | Amazon | AliExpress |
ESP8266 NodeMCU | Amazon | AliExpress |
ESP8266 WeMos D1 Mini | Amazon | AliExpress |
Resistencia y LED en el paquete | Amazon | Aliexpress |
Kit de botones | Amazon | Aliexpress |
Kit de condensadores | Amazon | Aliexpress |
Diferencia entre circuitos de resistencia pull-down y pull-up
Si desea conectar uno o más interruptores a su microcontrolador Arduino, ESP8266 o ESP32, debe usar un pin de E / S digital para leer el estado actual del interruptor o botón. Ahora la pregunta es ¿cómo conectar el segundo pin del interruptor? ¿Debería conectar el segundo pin a la alimentación oa tierra?
La respuesta a esta pregunta depende de su objetivo y también debe agregar una resistencia en el circuito. De lo contrario, cuando el interruptor está abierto, el pin digital no está conectado a GND o 5V y el estado del pin no estaría definido.
Hay dos configuraciones diferentes sobre cómo se agrega la resistencia al circuito y cómo se conecta el segundo pin del interruptor.
- Agregue una resistencia desplegable cuando la señal debería ser BAJA si el interruptor está abierto
- Agregue una resistencia pull-up si la señal debe ser ALTA si el interruptor está abierto.
La siguiente sección describe la diferencia entre resistencia pull-down y pull-up resistor y muestra cómo conectar todos los componentes con diferentes placas de microcontroladores Arduino, ESP8266 y ESP32.
Si crea un programa, ese programa es independiente de la diferencia en el circuito si usa una resistencia pull-down o pull-up.
Configurar un circuito desplegable con una resistencia
El siguiente circuito muestra el cableado de desenrollado entre un Arduino Uno, la resistencia y un botón. El botón está conectado a la fuente de alimentación y al pin digital. La resistencia está conectada al mismo pin digital y a la misma tierra.
Arduino Nano
Para obtener más información sobre Arduino Nano, visite el tutorial de Arduino Nano.
Arduino Pro Mini
Arduino Uno
Para obtener más información sobre Arduino Uno, visite el tutorial de Arduino Uno.
Arduino Mega
Para obtener más información sobre Arduino Mega, visite el tutorial de Arduino Mega.
ESP32 ESP-WROOM-32
ESP8266 NodeMCU
ESP8266 WeMos D1 Mini
Cuando no se presiona el botón, la resistencia desplegable permite que fluya una pequeña corriente entre el pin digital y GND. Por lo tanto, la entrada digital se reduce a LOW. Si se presiona el botón, el pin digital se conecta a la fuente de alimentación de 5V del Arduino Uno y por lo tanto la entrada digital es ALTA.
Configuración de un circuito de tracción con una resistencia.
En el caso de un circuito de resistencia pull-up, la resistencia pull-up conecta el pin digital y 5V. Por lo tanto, la entrada digital se eleva a 5V. Solo si el interruptor está cerrado, el pin digital está conectado a GND.
Las siguientes imágenes muestran el diagrama de circuito del Arduino Uno con la resistencia pull-up y el cableado para varias placas de microcontroladores Arduino, ESP8266 y ESP32.
Arduino Nano
Para obtener más información sobre Arduino Nano, visite el tutorial de Arduino Nano.
Arduino Pro Mini
Arduino Uno
Para obtener más información sobre Arduino Uno, visite el tutorial de Arduino Uno.
Arduino Mega
Para obtener más información sobre Arduino Mega, visite el tutorial de Arduino Mega.
ESP32 ESP-WROOM-32
ESP8266 WeMos D1 Mini
Controla un LED con una resistencia desplegable y un botón
En el siguiente ejemplo, queremos controlar un LED, que está conectado con un botón y una resistencia desplegable. El propósito del boceto es que el LED esté apagado, cuando no se presiona el botón, y el LED está encendido mientras se presiona el botón. Por supuesto, puede insertar el LED en el circuito del botón para obtener esta funcionalidad, pero en este artículo queremos leer el estado del botón para controlar el LED.
Las siguientes imágenes muestran el cableado entre todos los componentes en diferentes placas de microcontroladores Arduino, ESP8266 y ESP32 para el circuito de resistencia desplegable.
Arduino Nano
Para obtener más información sobre Arduino Nano, visite el tutorial de Arduino Nano.
Arduino Pro Mini
Arduino Uno
Para obtener más información sobre Arduino Uno, visite el tutorial de Arduino Uno.
Arduino Mega
Para obtener más información sobre Arduino Mega, visite el tutorial de Arduino Mega.
ESP32 ESP-WROOM-32
ESP8266 NodeMCU
ESP8266 WeMos D1 Mini
Después del cableado, podemos sumergirnos en el código del programa Arduino, que es muy fácil de entender y se presenta en el siguiente cuadro.
// for Arduino microcontroller int button_pin = 7; int LED_pin = 4; // for Arduino microcontroller //int button_pin = D6; //int LED_pin = D7; // for Arduino microcontroller //int button_pin = 4; //int LED_pin = 0; void setup() { Serial.begin(9600); pinMode(LED_pin, OUTPUT); pinMode(button_pin, INPUT); } void loop() { int switchStatus = digitalRead(button_pin); digitalWrite(LED_pin, switchStatus); }
En la primera parte del código del programa tenemos que definir los pines conectados del microcontrolador. En este ejemplo tenemos el interruptor y el LED que están conectados al microcontrolador Arduino, ESP8266 o ESP32. Dado que el script se puede usar para placas de microcontroladores Arduino, ESP8266 y ESP32, debe seleccionar cada tercera sección del código del programa y comentar las otras dos secciones, como hice para el ESP8266 y el ESP32, o eliminar las secciones.
En la función de configuración establecemos la velocidad en baudios de la conexión USB serial a su PC a 9600 que debería ser la misma en el monitor serial de su Arduino IDE. También necesitamos declarar el pin del botón como entrada y el pin LED como pines de salida.
En la función de bucle, leemos el estado actual del botón en el circuito desplegable, es decir, ALTO si el botón está abajo y BAJO si el botón no está abajo y escribimos exactamente el mismo estado en el LED. Por lo tanto, si se presiona el botón, el estado del LED cambia de BAJO a ALTO y el LED se enciende.
El siguiente video muestra que el LED se enciende cuando presiono el botón.
Cambiar la funcionalidad del botón a un interruptor
Es posible modificar el boceto que el botón utilizado tiene la funcionalidad de un interruptor. El LED solo se enciende y apaga si se presiona el botón y mantiene su estado. Por lo tanto, los estados del LED y el interruptor deben almacenarse en variables para comparar el último estado con las entradas actuales. Si el botón se presiona continuamente, los estados no deben cambiarse.
El cableado no se cambia, pero las siguientes secciones muestran el código de programa que se cambia.
// for Arduino microcontroller int switch_pin = 7; int LED_pin = 4; // for Arduino microcontroller //int switch_pin = D6; //int LED_pin = D7; // for Arduino microcontroller //int switch_pin = 4; //int LED_pin = 0; int switchStatusLast = LOW; // last status switch int LEDStatus = LOW; // current status LED void setup() { Serial.begin(9600); pinMode(LED_pin, OUTPUT); pinMode(switch_pin, INPUT); } void loop() { int switchStatus = digitalRead(switch_pin); // read status of switch if (switchStatus != switchStatusLast) // if status of button has changed { // if switch is pressed than change the LED status if (switchStatus == HIGH && switchStatusLast == LOW) LEDStatus = ! LEDStatus; digitalWrite(LED_pin, LEDStatus); // turn the LED on or off switchStatus = switchStatusLast; } }
La primera parte sigue siendo la misma, pero tenemos que definir dos nuevas variables con el estado inicial BAS que almacena el último estado del interruptor y el LED.
En la función de bucle, leemos el estado actual del botón. Si este estado es diferente al anterior, por ejemplo, se presiona el botón (señal digital de LOW a HIGH) o se suelta (señal digital de HIGH a LOW), ingresamos un segundo if request que solo es cierto si el botón está presionado (el último estado es BAJO y el estado actual es ALTO). En este caso, cambiamos el estado del LED. Si el LED estaba apagado (LOW), el estado del LED cambia a HIGH y si el LED estaba encendido (HIGH), cambiamos el estado a LOW. Este estado cambiado se escribe en la función digitalWrite para controlar el LED. El último paso es guardar el estado actual del conmutador como último estado antes de iniciar la función de bucle desde el principio.
El siguiente video muestra la función del interruptor en acción. En el video, también puede ver el problema común de eliminación de rebotes que resolvemos en los siguientes capítulos de este artículo.
Controle un LED con una resistencia pull-up y un botón
Con la resistencia pull-up queremos que el LED esté encendido cuando no se presiona el botón y si presionamos el botón el LED debe apagarse. Básicamente, la funcionalidad es la opuesta al circuito desplegable y tiene la ventaja de que usted sabe directamente que puede haber un cable roto en el circuito si el LED está apagado y no presiona el botón. En un circuito de desplazamiento, sabes que hay un problema dentro del circuito solo hasta que presionas el botón. Si tiene circuitos críticos, debería preferir la resistencia pull-up.
La siguiente imagen muestra el cableado de la resistencia pull-up y el botón, así como el LED en combinación con diferentes placas de microcontroladores Arduino, ESP8266 y ESP32.
Arduino Nano
Para obtener más información sobre Arduino Nano, visite el tutorial de Arduino Nano.
Arduino Pro Mini
Arduino Uno
Para obtener más información sobre Arduino Uno, visite el tutorial de Arduino Uno.
Arduino Mega
Para obtener más información sobre Arduino Mega, visite el tutorial de Arduino Mega.
ESP32 ESP-WROOM-32
ESP8266 NodeMCU
ESP8266 WeMos D1 Mini
El código del programa no depende de su circuito y de si está utilizando una configuración desplegable o pull-up con su resistencia. Por lo tanto, estamos usando el mismo código de programa que se usó para la configuración desplegable.
// for Arduino microcontroller int button_pin = 7; int LED_pin = 4; // for Arduino microcontroller //int button_pin = D6; //int LED_pin = D7; // for Arduino microcontroller //int button_pin = 4; //int LED_pin = 0; void setup() { Serial.begin(9600); pinMode(LED_pin, OUTPUT); pinMode(button_pin, INPUT); } void loop() { int switchStatus = digitalRead(button_pin); digitalWrite(LED_pin, switchStatus); }
El siguiente video muestra la configuración de dominadas con la resistencia. Verá que si no presiono el botón, el LED se enciende y si presiono el botón, el LED se apaga.
Explicación del problema de rebote con los botones.
Cuando se presiona un interruptor o botón, los contactos de metal en los puntos de contacto pueden hacer que los puntos de contacto se toquen entre sí varias veces. Por lo tanto, el contacto rebota antes de hacer contacto permanente. Es posible que se pregunte qué problema podría surgir debido al rebote de los contactos. El problema es que la velocidad del reloj de Arduino es de 16 MHz, lo que resulta en 16 millones de operaciones por segundo. Por lo tanto, Arduino reconocerá que los contactos que rebotan han cerrado y abierto los contactos varias veces seguidas. La siguiente imagen muestra este comportamiento en el osciloscopio cuando presiona un botón.
En la primera imagen, puede ver claramente que cuando se presiona el botón, el voltaje solo alcanza alrededor de 1.8V en lugar de 5V. Este comportamiento da como resultado un LED que no responde cuando se presiona el interruptor o botón. Solo cuando se presiona el botón por segunda vez, los contactos internos se conectan y se alcanza la tensión de funcionamiento de 5 V y el LED permanece encendido.
Se puede mostrar el mismo comportamiento cuando intento apagar el LED en el segundo cuadro. El voltaje de trabajo es de 5V y presiono el botón. El voltaje cae dos veces a alrededor de 4V y vuelve a rebotar a 5V. La tercera vez, el voltaje cae a alrededor de 1 V pero también vuelve a bajar a 5 V. Solo cuando presiono el botón por cuarta vez, se suelta el interruptor y se apaga el LED.
Este comportamiento es un gran problema en la vida real porque desea presionar varias veces en un para encender o apagar una luz en su cocina? No creo.
Es bueno saber que hay dos soluciones de software y una solución de hardware para resolver este problema llamado problema de eliminación de rebotes.
Dos soluciones de software contra el problema del rebote
Hasta donde yo sé, hay dos soluciones de software contra el efecto antirrebote. En las siguientes secciones, explico ambas soluciones antes de mostrarte también una solución de hardware.
Agregar retraso al leer el estado del botón
La primera solución de software es bastante simple e inicia un retraso y luego lee el estado nuevamente. El tiempo entre las dos lecturas de entrada se define mediante un retraso. Si la demora es demasiado corta, el cambio aún se puede limitar.
// for Arduino microcontroller int switch_pin = 7; int LED_pin = 4; // for Arduino microcontroller //int switch_pin = D6; //int LED_pin = D7; // for Arduino microcontroller //int switch_pin = 4; //int LED_pin = 0; int switchStatusLast = LOW; // last status switch int LEDStatus = LOW; // current status LED void setup() { Serial.begin(9600); pinMode(LED_pin, OUTPUT); pinMode(switch_pin, INPUT); } void loop() { int switchStatus = digitalRead(switch_pin); // read status of switch if (switchStatus != switchStatusLast) // if status of button has changed { delay(50); // debounce time of 50 ms switchStatus = digitalRead(switch_pin); // read the status of the switchPIN again if (switchStatus != switchStatusLast) // if the status of the button has changed again { // if switch is pressed than change the LED status if (switchStatus == HIGH && switchStatusLast == LOW) LEDStatus = ! LEDStatus; digitalWrite(LED_pin, LEDStatus); // turn the LED on or off switchStatus = switchStatusLast; } } }
Puede ver en las siguientes imágenes del osciloscopio que la presión y el voltaje de liberación son más suaves que sin una solución de software. Esto da como resultado el comportamiento de que cuando se presiona el botón una vez, la luz indicadora se enciende o apaga. El siguiente video también muestra el resultado de la solución de software contra la eliminación de rebotes.
apurarse
Salida
Estados del botón Guardar: no recomendado
Una segunda solución de software posible contra la eliminación de rebotes es continuar demorando hasta que no haya más cambios en el estado del interruptor al final del tiempo de eliminación de rebotes. Por lo tanto, el estado del interruptor debe almacenarse en tres momentos diferentes:
- Estado antes de la activación del interruptor (switchStatusLast)
- Estado durante el tiempo de antirrebote (switchStatusDebounce)
- Estado de la última pulsación del interruptor (switchStatus)
Si el estado ha cambiado y está presente durante más tiempo que el tiempo de antirrebote preestablecido, se puede cambiar el estado del LED. Para comparar el tiempo de supresión de rebotes con la última vez que se presionó el interruptor, debemos establecer la hora en que se presionó por última vez como sin firmar. variable porque el número entero tiene un límite superior de (2 ^ 15-1) ms o 33 segundos. El valor máximo largo sin signo es (2 ^ 32-1) ms o 50 días.
Pero también hay una solución mucho mejor que guardar el estado del interruptor 3 veces porque también es posible resolver el problema con el interruptor antirrebote con una solución de condensador de hardware.
Soluciones de hardware al problema del rebote
La posible solución de hardware para resolver el problema de antirrebote es utilizar un condensador en el interruptor. Mientras no se presione el interruptor, el capacitor se carga. Cuando se presiona el interruptor, el condensador se descarga mientras la señal del interruptor al Arduino es ALTA. Durante el rebote, la energía del condensador mantiene la señal de conmutación ALTA. Una combinación de resistencia-condensador recomendada es una resistencia pull-up de 10 kΩ y un condensador de 10 µF.
La velocidad a la que el capacitor se carga y descarga depende de la resistencia R y la capacitancia C. La ecuación del voltaje del capacitor después de t segundos
- la carga es V (1- ^ e (-t / RC)) y
- la descarga es V (e (-t / RC))
Por lo tanto, cuanto mayor sea el valor de RC, mayor será el tiempo de eliminación de rebotes. El retardo de supresión de rebotes se puede expresar en 0,693 * RC segundos. Con una combinación de una resistencia pull-down de 10 kΩ y un capacitor de 10 µF, el retardo antirrebote es de 69 ms. Aunque la combinación de resistencia y condensador es de libre elección, se debe usar una resistencia grande para minimizar la corriente a través de la resistencia.
Las siguientes imágenes muestran el cableado de varias placas de microcontroladores Arduino, ESP8266 y ESP32.
Arduino Nano
Para obtener más información sobre Arduino Nano, visite el tutorial de Arduino Nano.
Arduino Pro Mini
Arduino Uno
Para obtener más información sobre Arduino Uno, visite el tutorial de Arduino Uno.
Arduino Mega
Para obtener más información sobre Arduino Mega, visite el tutorial de Arduino Mega.
ESP32 ESP-WROOM-32
ESP8266 NodeMCU
ESP8266 WeMos D1 Mini
Debido a que no estamos agregando ninguna solución de software para el problema de la eliminación de rebotes, podemos usar el script de cambio estándar de Arduino que creamos en el capítulo anterior.
// for Arduino microcontroller int switch_pin = 7; int LED_pin = 4; // for Arduino microcontroller //int switch_pin = D6; //int LED_pin = D7; // for Arduino microcontroller //int switch_pin = 4; //int LED_pin = 0; int switchStatusLast = LOW; // last status switch int LEDStatus = LOW; // current status LED void setup() { Serial.begin(9600); pinMode(LED_pin, OUTPUT); pinMode(switch_pin, INPUT); } void loop() { int switchStatus = digitalRead(switch_pin); // read status of switch if (switchStatus != switchStatusLast) // if status of button has changed { // if switch is pressed than change the LED status if (switchStatus == HIGH && switchStatusLast == LOW) LEDStatus = ! LEDStatus; digitalWrite(LED_pin, LEDStatus); // turn the LED on or off switchStatus = switchStatusLast; } }
Los siguientes dos videos muestran el impacto de la solución de hardware contra el antirrebote con un capacitor de 10 µF y 100 µF. En el video se puede ver que el capacitor de 100µF maneja el LED mucho más tiempo que el capacitor de 10µF si apago el LED con el botón.
Condensador = 10µF
Condensador = 100µF
En la siguiente imagen se ve el aumento de tensión cuando se presiona el botón. Es muy similar a la solución de software.
La siguiente imagen muestra la tensión durante las fases de compresión y liberación. Puede ver muy bien el impacto del condensador reduciendo el voltaje con el tiempo. La imagen muestra 4 ciclos.
Conclusión
En este artículo, aprenderá sobre los diferentes tipos de interruptores y resistencias pull-up y pull-down, cómo usarlos y las diferencias.
También aprendiste cuál es el problema con el antirrebote. Además, discutimos las soluciones de hardware y software contra el problema de supresión de rebotes.
Espero que hayas recomendado este artículo. ¿Tiene más preguntas sobre interruptores? Utilice la sección de comentarios a continuación para hacer sus preguntas.