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.
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.
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.
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
- Filtragem em eletrônica
- https://www.arduino.cc/reference/en/language/functions/digital-io/digitalwrite/
Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie