La lógica del rebotado evita la detección de cambios de estado parásitos de un sensor. Cuando se utilizan sensores que devuelven estados discretos, como un pulsador, puede ocurrir, por razones mecánicas o de otro tipo, que se detecten cambios de estado que no se corresponden con lo que queremos detectar. Podemos mejorar la fiabilidad de estas mediciones utilizando una lógica anti-rebotes que veremos en este tutorial.
Hardware
- Computadora
- Arduino UNO
- Cable USB A macho a B macho
- Un botón pulsador (u otro sensor de encendido/apagado)
Principio de funcionamiento
Cuando un sistema físico cambia de estado, a menudo se producen oscilaciones durante el período de transición por razones físicas (mecánicas, tiempo de respuesta, etc.). Por lo tanto, hay que dar tiempo suficiente para que el estado se estabilice. Esto puede ser posible por medio de un filtro electrónico o mecánico o digitalmente a través del programa que procesa la medición.
Esquema
La estrategia anti-rebotes puede ser utilizada para mejorar la detección del estado de un botón, por ejemplo. Para probar el código, colocamos un botón entre los pines GND y 2.
Código
Vamos a crear dos variables que mantendrán en la memoria el estado presente y pasado del sensor. Vamos a leer la entrada digital y validar su estado según el estado anterior y un retraso anti-rebotes. Este método puede ser implementado con la función delay() pero el uso de la función millis() es más limpio y adecuado.
//Parameters const int didPin = 2; //Variables bool didStatus = false; bool oldDidStatus = false; unsigned long lastDebounceTime = 0; unsigned long debounceDelay = 50; void setup() { //Init Serial USB Serial.begin(9600); Serial.println(F("Initialize System")); //Init digital input pinMode(didPin, INPUT_PULLUP); } void loop() { debounceDid(); } void debounceDid( ) { /* function debounceDid */ ////debounce DigitalDebounce int reading = digitalRead(didPin); if (reading != oldDidStatus) { lastDebounceTime = millis(); } if ((millis() - lastDebounceTime) > debounceDelay) { if (reading != didStatus) { didStatus = reading; Serial.print(F("Sensor state : ")); Serial.println(didStatus); } } oldDidStatus = reading; }
Resultado
Si varía el parámetro debounceDelay, puede ver el efecto de la lógica anti-rebotes en el estado de los botones. Al tomar un tiempo suficientemente largo, la medición se vuelve confiable y sólo hay un cambio de estado por prensa.
Este tutorial ayuda a entender e implementar la lógica anti-rebote. Para facilitar el uso, puede escribir una biblioteca o utilizar una biblioteca existente como OneButton.h.
Aplicaciones
Fuentes
Encuentre otros tutoriales y ejemplos en el generador de código automático
Arquitecto de Código