Arduino UNO R4 - Bouton - anti-rebond

Lors de la programmation de l'Arduino Uno R4 pour détecter un événement d'appui sur un bouton, vous pouvez constater qu'une seule pression est détectée plusieurs fois. Cela se produit car, en raison de facteurs mécaniques, le bouton ou l'interrupteur peut basculer rapidement entre bas et haut à plusieurs reprises. Cela s'appelle le rebondissement. Le rebondissement peut faire en sorte qu'une seule pression sur le bouton soit détectée comme plusieurs pressions, ce qui peut provoquer des erreurs dans certaines applications. Ce tutoriel explique comment résoudre ce problème, un processus connu sous le nom d'anti-rebond du bouton.

Phénomène de chatter sur l'Arduino UNO R4

À propos du bouton

Apprenez-en davantage sur les boutons (répartition des broches, fonctionnement, programmation) dans les tutoriels suivants si vous n’êtes pas familier avec eux :

Diagramme de câblage

Schéma de câblage du bouton Arduino UNO R4

Cette image a été créée avec Fritzing. Cliquez pour agrandir l'image.

Examinons et comparons le code Arduino UNO R4 sans et avec anti-rebond, et observons leurs comportements.

Arduino Uno R4 - Bouton sans anti-rebond

Avant d'apprendre le debouncing, regardons le code sans lui et voyons comment il se comporte.

/* * Ce code Arduino UNO R4 a été développé par newbiely.fr * Ce code Arduino UNO R4 est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/tutorials/arduino-uno-r4/arduino-uno-r4-button-debounce */ #define BUTTON_PIN 7 // The Arduino UNO R4 pin connected to the button int button_state; // the current state of button int prev_button_state = LOW; // the previous state of button void setup() { // initialize serial communication at 9600 bits per second: Serial.begin(9600); // initialize the pushbutton pin as a pull-up input pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the switch/button: button_state = digitalRead(BUTTON_PIN); if (prev_button_state == HIGH && button_state == LOW) Serial.println("The button is pressed"); else if (prev_button_state == LOW && button_state == HIGH) Serial.println("The button is released"); // save the last state prev_button_state = button_state; }

Étapes rapides

Suivez ces instructions étape par étape :

  • Si c'est votre première fois que vous utilisez l'Arduino Uno R4 WiFi/Minima, reportez-vous au tutoriel sur Arduino UNO R4 - Installation du logiciel..
  • Connectez les composants selon le schéma fourni.
  • Connectez la carte Arduino Uno R4 à votre ordinateur à l'aide d'un câble USB.
  • Lancez l'IDE Arduino sur votre ordinateur.
  • Sélectionnez la carte Arduino Uno R4 appropriée (par exemple, Arduino Uno R4 WiFi) et le port COM.
  • Copiez le code ci-dessus et ouvrez-le dans l'IDE Arduino.
  • Cliquez sur le bouton Upload dans l'IDE Arduino pour envoyer le code à l'Arduino UNO R4.
Téléversement du code dans l'IDE Arduino
  • Ouvrez le moniteur série.
  • Appuyez et maintenez le bouton enfoncé pendant quelques secondes, puis relâchez-le.
  • Vérifiez le moniteur série pour le résultat.
COM6
Send
The button is pressed The button is pressed The button is pressed The button is released The button is released
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Comme vous pouvez le voir, vous avez appuyé sur le bouton et l'avez relâché une seule fois. Cependant, l'Arduino le reconnaît comme plusieurs appuis et relâchements.

※ Note:

La valeur de DEBOUNCE_TIME varie selon les applications. Chaque application pourrait utiliser une valeur unique.

Arduino Uno R4 - Bouton avec anti-rebond

/* * Ce code Arduino UNO R4 a été développé par newbiely.fr * Ce code Arduino UNO R4 est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/tutorials/arduino-uno-r4/arduino-uno-r4-button-debounce */ #define BUTTON_PIN 7 // The Arduino UNO R4 pin connected to the button #define DEBOUNCE_TIME 50 // The debounce time; increase if the output flickers int last_steady_state = LOW; // the previous steady state from the input pin int last_flickerable_state = LOW; // the previous flickerable state from the input pin int current_state; // the current reading from the input pin unsigned long last_debounce_time = 0; // the last time the output pin was toggled void setup() { // initialize serial communication at 9600 bits per second: Serial.begin(9600); // initialize the pushbutton pin as a pull-up input pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the switch/button: current_state = digitalRead(BUTTON_PIN); // If the switch/button changed, due to noise or pressing: if (current_state != last_flickerable_state) { // reset the debouncing timer last_debounce_time = millis(); // save the the last flickerable state last_flickerable_state = current_state; } if ((millis() - last_debounce_time) > DEBOUNCE_TIME) { // if the button state has changed: if (last_steady_state == HIGH && current_state == LOW) Serial.println("The button is pressed"); else if (last_steady_state == LOW && current_state == HIGH) Serial.println("The button is released"); // save the the last steady state last_steady_state = current_state; } }

Étapes rapides

  • Copiez le code ci-dessus et ouvrez-le avec l'IDE Arduino.
  • Appuyez sur le bouton Upload dans l'IDE Arduino pour envoyer le code à l'Arduino UNO R4.
  • Ouvrez le moniteur série.
  • Maintenez le bouton enfoncé pendant quelques secondes avant de le relâcher.
  • Consultez le moniteur série.
COM6
Send
The button is pressed The button is released
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Comme vous pouvez le constater, vous avez appuyé et relâché le bouton une fois. L'Arduino le détecte correctement comme un seul appui et relâchement, éliminant tout rebondissement.

Nous l'avons rendu simple : code d'anti-rebond du bouton Arduino UNO R4 utilisant une bibliothèque

Nous avons créé une solution plus simple pour les débutants qui utilisent de nombreux boutons en créant une bibliothèque nommée ezButton. Vous pouvez en savoir plus sur la bibliothèque ezButton ici.

Voyons quelques codes d'exemple.

Code d'anti-rebond du bouton pour Arduino UNO R4 - un seul bouton

/* * Created by ArduinoGetStarted.com * * This example code is in the public domain * * Tutorial page: https://arduinogetstarted.com/tutorials/arduino-button-library * * This example reads the state of a button with debounce and print it to Serial Monitor. */ #include <ezButton.h> ezButton button(7); // create ezButton object that attach to pin 7; void setup() { Serial.begin(9600); button.setDebounceTime(50); // set debounce time to 50 milliseconds } void loop() { button.loop(); // MUST call the loop() function first if(button.isPressed()) Serial.println("The button is pressed"); if(button.isReleased()) Serial.println("The button is released"); }

Code d'anti-rebond pour boutons multiples sur Arduino UNO R4

Appliquons le filtrage anti-rebond pour trois boutons. Voici le schéma de câblage entre l'Arduino UNO R4 et les trois boutons :

Schéma de câblage de la bibliothèque de boutons Arduino UNO R4

Cette image a été créée avec Fritzing. Cliquez pour agrandir l'image.

Voir Comment alimenter l'Arduino UNO R4..

/* * Ce code Arduino UNO R4 a été développé par newbiely.fr * Ce code Arduino UNO R4 est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/tutorials/arduino-uno-r4/arduino-uno-r4-button-debounce */ #include <ezButton.h> ezButton button_1(6); // initialiser l'objet ezButton connecté à la broche 6 ezButton button_2(7); // initialiser l'objet ezButton connecté à la broche 7 ezButton button_3(8); // initialiser l'objet ezButton connecté à la broche 8 void setup() { Serial.begin(9600); button_1.setDebounceTime(50); // configurer le temps d'antirebond pour le bouton_1 à 50ms button_2.setDebounceTime(50); // configurer le temps d'antirebond pour le bouton_2 à 50ms button_3.setDebounceTime(50); // configurer le temps d'antirebond pour le bouton_3 à 50ms } void loop() { button_1.loop(); // mettre à jour l'état du bouton_1 button_2.loop(); // mettre à jour l'état du bouton_2 button_3.loop(); // mettre à jour l'état du bouton_3 if(button_1.isPressed()) Serial.println("The button 1 is pressed"); if(button_1.isReleased()) Serial.println("The button 1 is released"); if(button_2.isPressed()) Serial.println("The button 2 is pressed"); if(button_2.isReleased()) Serial.println("The button 2 is released"); if(button_3.isPressed()) Serial.println("The button 3 is pressed"); if(button_3.isReleased()) Serial.println("The button 3 is released"); }

Vidéo

※ NOS MESSAGES

  • N'hésitez pas à partager le lien de ce tutoriel. Cependant, veuillez ne pas utiliser notre contenu sur d'autres sites web. Nous avons investi beaucoup d'efforts et de temps pour créer ce contenu, veuillez respecter notre travail !