fbpixel
Etiquetas: ,

A lógica anti-repique, ou debounce, é utilizada para evitar a detecção de alterações parasitas no estado de um sensor. Ao utilizar um sensor que devolve estados discretos, como um botão de pressão, pode acontecer, por razões mecânicas ou outras, que sejam detectadas mudanças de estado que não correspondem ao que queremos detectar. Podemos melhorar a fiabilidade destas medições utilizando a lógica anti-repique, que veremos neste tutorial.

Material

  • Computador
  • Arduino UNO
  • Cabo USB A Macho/B Macho
  • Um botão de pressão (ou outro sensor on/off)

Princípio de funcionamento

Quando um sistema físico muda de estado, é comum haver oscilações durante a transição, por razões físicas (mecânica, tempo de resposta, etc.). Assim, é necessário dar tempo para que o estado se estabilize. Isto pode ser feito através de filtragem eletrônica ou mecânica, ou digitalmente, pelo programa que processa a medição.

switch-debounce-principle Implementar a lógica anti-repique no Arduino

Esquema

A estratégia anti-repique pode ser utilizada, por exemplo, para melhorar a detecção do estado de um botão. Para testar o código, colocamos um botão entre os pinos GND e 2.

arduino-pushbutton-gnd Implementar a lógica anti-repique no Arduino

Código

Vamos criar duas variáveis que guardarão na memória o estado presente e passado do sensor. Vamos ler a entrada digital e validar o seu estado de acordo com o estado anterior e um delay anti-repique. Este método pode ser implementado com a função delay(), porém o resultado é mais limpo e adequado se usarmos a função millis().

//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

Se variarmos o parâmetro debounceDelay, podemos ver o efeito da lógica anti-repique no reconhecimento do estado do botão. Ao tomar um tempo suficientemente grande, a medição torna-se confiável, e há apenas uma mudança de estado por pressão no botão.

arduino-monitor-debounce-result Implementar a lógica anti-repique no Arduino

Este tutorial ajuda a entender e implementar a lógica anti-repique. Para facilitar o uso, uma opção é escrever uma biblioteca ou usar uma biblioteca já existente, como a OneButton.h.

Aplicações

Fontes

Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie