Diferencia entre revisiones de «Rebote»
(→Referencias) |
(→Referencias) |
||
Línea 169: | Línea 169: | ||
* [http://playground.arduino.cc/code/debounce Playground] | * [http://playground.arduino.cc/code/debounce Playground] | ||
* [https://www.luisllamas.es/debounce-interrupciones-arduino/ Debounce] - Luis Llamas | * [https://www.luisllamas.es/debounce-interrupciones-arduino/ Debounce] - Luis Llamas | ||
− | * [https://aprendiendoarduino.wordpress.com/2017/06/19/ejemplos-practicos-arduino/ Ejemplos | + | * [https://aprendiendoarduino.wordpress.com/2017/06/19/ejemplos-practicos-arduino/ Ejemplos prácticos Arduino] - Enrique Crespo |
* [https://manueldelgadocrespo.blogspot.com/p/digitalread.html DigitalRead] - Manuel Delgado | * [https://manueldelgadocrespo.blogspot.com/p/digitalread.html DigitalRead] - Manuel Delgado | ||
− | * [https://programarfacil.com/blog/utilizar-pulsadores-en-arduino/ Utilizar | + | * [https://programarfacil.com/blog/utilizar-pulsadores-en-arduino/ Utilizar un pulsador sin saber nada de electrónica] - Luis Del Valle |
* [https://core-electronics.com.au/tutorials/switch-debouncing-with-arduino.html Interruptores, Debouncing y el Arduino] - Core Electronics | * [https://core-electronics.com.au/tutorials/switch-debouncing-with-arduino.html Interruptores, Debouncing y el Arduino] - Core Electronics | ||
[[Category:Librerias]] | [[Category:Librerias]] |
Revisión del 18:48 24 jun 2019
El rebote es un efecto muy comun en los contactos electricos del tipo pulsadores, interruptores, contactos de rele, etc. Debido a problemas fisicos y mecanicos se produce un chisporroteo, que al ser leido por Arduino se convierte en muchos pulsos de un corto periodo, de forma que el pulsar el boton una sola vez puede causar resultados impredesibles.
Contenido
Solucion 1
La mejor solucion es por hardware poniendo un condensador de 1 uF en paralelo con el pulsador.
Solucion 2
La solución por software mas simple consiste en aplicar un pequeño retardo luego de cada vez que se detecta la transicion del pulsador. Eso elimina el ruido.
void setup() {
pinMode(2, INPUT); //Pulsador
pinMode(13, OUTPUT); //LED
}
void loop() {
//Lee la entrada
if (digitalRead(2)){
digitalWhite(13, !digitalRead(13));
delay(50); //Retardo que elimina ruido
}
}
Solucion 3
Otra solución simple que funciona la mayoría de las veces es fijarse en el estado anterior del botón asi.
bool estado,anterior;
void setup() {
pinMode(2, INPUT_PULLUP); //Pulsador
pinMode(13, OUTPUT); //LED
}
void loop() {
estado = digitalRead(2);
if (!estado && anterior) {
digitalWrite(13, !digitalRead(13));
}
anterior = estado;
}
Solucion 4
Quizás los puristas que desean desterrar la función delay() prefieran usar esta solución:
unsigned long tiempo;
void setup() {
pinMode(2, INPUT); //Pulsador
pinMode(13, OUTPUT); //LED
}
void loop() {
//Lee la entrada
if (digitalRead(2)){
if (millis() > tiempo + 50){
digitalWhite(13, !digitalRead(13));
tiempo = millis();
}
}
}
Solución 5
El siguiente boceto se basa en la versión de rebote de Limor Fried. En este ejemplo, el pulsador retorna HIGH cuando se presiona y LOW cuando no se presiona.
Cada vez que el pin de entrada pasa de LOW a HIGH (se pulso el botón), el pin de salida cambia de LOW a HIGH y HIGH a LOW varias veces. Para ignorar este ruino se introduce un retraso mínimo entre las conmutaciones.
const byte boton = 2; //Pulsador
const byte led = 13; //LED
bool ledState = HIGH; //El estado actual del pin de salida (LED).
bool buttonState; //El estado actual del pin de entrada (Pulsador).
bool lastButtonState = LOW; //El estado anterior del pin de entrada (Pulsador).
unsigned long tiempo = 0; //Ultima vez que cambio la entrada (pulsador)
unsigned long retardo = 50; //Tiempo de retardo. Aumentar si salida parpadea
void setup() {
pinMode(boton, INPUT);
pinMode(led, OUTPUT);
digitalWrite(led, ledState);
}
void loop() {
//Lee la entrada
bool reading = digitalRead(boton);
//Comprueba si acaba de pulsar (LOW a HIGH)
if (reading != lastButtonState) {
//Reinicia temporizador
tiempo = millis();
}
if ((millis() - tiempo) > retardo) {
if (reading != buttonState) {
buttonState = reading;
//Solo cambia LED si es pulsado
if (buttonState) {
ledState = !ledState;
}
}
}
digitalWrite(led, ledState);
lastButtonState = reading;
}
Solución 6
Eliminación del rebote mediante libreria Debounce
#include <Debounce.h>
Debounce rebote = Debounce(20, 2); //Asigna 20 ms de retardo en pulsador
void setup() {
pinMode(2, INPUT); //Pulsador
pinMode(13, OUTPUT); //LED
}
void loop() {
rebote.update(); //Actualizar instancia de clase
digitalWrite(13, rebote.read()); //Obtener pulso
}
Solución 7
Eliminación del rebote mediante libreria Bounce2
Método | Descripción |
---|---|
.read() | Lee el estado del pin actualizado. |
.fell() | Devuelve verdadero si el pin pasa de HIGH a LOW. (falling) |
.rose() | Devuelve verdadero si el pin pasa de LOW a HIGH. (rising) |
#include <Bounce2.h>
Bounce rebote = Bounce(2, 50); //Instancia de la clase con retardo de 50 ms
void setup() {
pinMode(2, INPUT_PULLUP); //Pulsador
pinMode(13, OUTPUT); //LED
}
void loop() {
rebote.update(); //Actualiza instancia de clase
if (rebote.rose()){; //Lee pulsador cuando se suelta
digitalWrite(13, !digitalRead(13); //Conmuta LED
}
}
Vea también
Referencias
- Playground
- Debounce - Luis Llamas
- Ejemplos prácticos Arduino - Enrique Crespo
- DigitalRead - Manuel Delgado
- Utilizar un pulsador sin saber nada de electrónica - Luis Del Valle
- Interruptores, Debouncing y el Arduino - Core Electronics