fbpixel
Etiquetas:

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.

switch-debounce-principle Aplicación de la lógica anti-rebotes en Arduino

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.

arduino-pushbutton-gnd Aplicación de la lógica anti-rebotes en Arduino

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.

arduino-monitor-debounce-result Aplicación de la lógica anti-rebotes en Arduino

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