Arduino Nano - Bouton - Anti-rebond

Lorsqu'un bouton est pressé ou relâché, ou qu'un interrupteur est basculé, les débutants supposent souvent que son état passe de LOW à HIGH ou de HIGH à LOW. En réalité, ce n'est pas toujours le cas. En raison des caractéristiques mécaniques et physiques, l'état du bouton (ou de l'interrupteur) peut être rapidement basculé plusieurs fois entre LOW et HIGH en réponse à un seul événement. Ce phénomène est connu sous le nom de rebond. Le rebond peut causer qu'une seule pression soit lue comme plusieurs pressions, entraînant un dysfonctionnement dans certaines applications.

phénomène de chatter

La méthode pour éliminer ce problème est appelée anti-rebond ou debounce. Ce tutoriel vous explique comment procéder lorsque vous utilisez le bouton avec un Arduino Nano. Nous apprendrons à travers les étapes suivantes :

Préparation du matériel

1×Arduino Nano
1×USB A to Mini-B USB cable
1×Push Button
1×(Optional) Panel-mount Push Button
1×Breadboard
1×Jumper Wires
1×(Optional) 9V Power Adapter for Arduino Nano
1×(Recommended) Screw Terminal Adapter for Arduino Nano

Or you can buy the following sensor kits:

1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)
Divulgation : Certains des liens fournis dans cette section sont des liens affiliés Amazon. Nous pouvons recevoir une commission pour tout achat effectué via ces liens, sans coût supplémentaire pour vous. Nous vous remercions de votre soutien.

À propos du Bouton

Si vous n'êtes pas familier avec les boutons (brochage, fonctionnalités, programmation, etc.), les tutoriels suivants peuvent vous aider :

Diagramme de câblage

Schéma de câblage du bouton Arduino Nano

This image is created using Fritzing. Click to enlarge image

Observons et comparons le code Arduino Nano pour les versions AVEC et SANS anti-rebond, ainsi que leurs comportements respectifs.

Bouton de lecture sans anti-rebond

Avant de plonger dans le concept de l'anti-rebond, examinez le code sans anti-rebond et observez son comportement.

Étapes rapides

  • Connectez un câble USB à l'Arduino Nano et à votre PC.
  • Lancez l'Arduino IDE, choisissez la carte et le port appropriés.
  • Copiez le code ci-dessous et ouvrez-le dans l'Arduino IDE.
/* * Ce code Arduino Nano a été développé par newbiely.fr * Ce code Arduino Nano 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-nano/arduino-nano-button-debounce */ #define BUTTON_PIN 2 // The number of the pushbutton pin int prev_button_state = LOW; // The previous state from the input pin int button_state; // The current reading from the input pin void setup() { // Initialize the Serial to communicate with the Serial Monitor. Serial.begin(9600); // Configure the Arduino Nano pin as a pull-up input // The pull-up input pin is HIGH when the button is open and LOW when pressed. 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 the last state prev_button_state = button_state; }
  • Cliquez sur le bouton Upload dans l'IDE Arduino pour compiler et téléverser le code sur la carte Arduino Nano.
Téléversement de code de l'IDE Arduino
  • Ouvrez le moniteur série.
  • Appuyez et maintenez le bouton pendant quelques secondes, puis relâchez-le.
  • Essayez plusieurs fois.
  • Consultez le résultat dans le moniteur série.
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  

Parfois, vous n'avez appuyé et relâché le bouton qu'une seule fois. Néanmoins, l'Arduino Nano l'interprète comme de multiples pressions et relâchements. C'est le phénomène de rebond mentionné au début du tutoriel. Voyons comment y remédier dans la prochaine partie.

Bouton de lecture avec anti-rebond

Le code ci-dessous applique la méthode appelée « debounce » pour prévenir le phénomène de rebond.

/* * Ce code Arduino Nano a été développé par newbiely.fr * Ce code Arduino Nano 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-nano/arduino-nano-button-debounce */ #define BUTTON_PIN 2 // The number of the pushbutton pin const int DEBOUNCE_DELAY = 50; // The debounce time; increase if the output flickers int lastSteadyState = LOW; // The previous steady state from the input pin int lastFlickerableState = LOW; // The previous flickerable state from the input pin int button_state; // The current reading from the input pin // The following variables are unsigned longs because the time, measured in // milliseconds, will quickly become a bigger number than can be stored in an int. unsigned long lastDebounceTime = 0; // The last time the output pin was toggled void setup() { // Initialize the Serial to communicate with the Serial Monitor. Serial.begin(9600); // Configure the Arduino Nano pin as a pull-up input // The pull-up input pin is HIGH when the button is open and LOW when pressed. pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the switch/button: button_state = digitalRead(BUTTON_PIN); // check to see if you just pressed the button // (i.e. the input went from LOW to HIGH), and you've waited long enough // since the last press to ignore any noise: // If the switch/button changed, due to noise or pressing: if (button_state != lastFlickerableState) { // reset the debouncing timer lastDebounceTime = millis(); // save the the last flickerable state lastFlickerableState = button_state; } if ((millis() - lastDebounceTime) > DEBOUNCE_DELAY) { // whatever the reading is at, it's been there for longer than the debounce // delay, so take it as the actual current state: // if the button state has changed: if (lastSteadyState == HIGH && button_state == LOW) Serial.println("The button is pressed"); else if (lastSteadyState == LOW && button_state == HIGH) Serial.println("The button is released"); // save the the last steady state lastSteadyState = button_state; } }

Étapes rapides

  • Copiez le code ci-dessus et ouvrez-le avec l'IDE Arduino.
  • Cliquez sur le bouton Upload dans l'IDE Arduino pour compiler et téléverser le code vers l'Arduino Nano.
  • Ouvrez le moniteur série.
  • Continuez à appuyer sur le bouton pendant quelques secondes, puis relâchez-le.
  • Consultez le résultat sur 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 seule fois. L'Arduino Nano détecte cela comme une unique pression et relâchement. Le bruit est éliminé.

Nous l'avons simplifié - Code de Debounce de Bouton Arduino Nano avec Bibliothèque

Nous avons conçu une bibliothèque, ezButton, pour simplifier les choses pour ceux qui débutent, en particulier lorsqu'ils doivent gérer plusieurs boutons. Vous pouvez en savoir plus sur la bibliothèque ezButton ici.

Code Arduino Nano pour le Debouncing d'un Bouton Unique

#include <ezButton.h> ezButton button(2); // create ezButton object for pin 2; 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 de Debounce de Bouton pour Arduino Nano pour Plusieurs Boutons

/* * Ce code Arduino Nano a été développé par newbiely.fr * Ce code Arduino Nano 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-nano/arduino-nano-button-debounce */ #include <ezButton.h> ezButton button1(6); // créez un objet ezButton pour la broche 6; ezButton button2(7); // créez un objet ezButton pour la broche 7; ezButton button3(8); // créez un objet ezButton pour la broche 8; void setup() { Serial.begin(9600); button1.setDebounceTime(50); // définir le temps de debounce à 50 millisecondes button2.setDebounceTime(50); // définir le temps de debounce à 50 millisecondes button3.setDebounceTime(50); // définir le temps de debounce à 50 millisecondes } void loop() { button1.loop(); // IL FAUT appeler la fonction loop() en premier button2.loop(); // IL FAUT appeler la fonction loop() en premier button3.loop(); // IL FAUT appeler la fonction loop() en premier if(button1.isPressed()) Serial.println("The button 1 is pressed"); if(button1.isReleased()) Serial.println("The button 1 is released"); if(button2.isPressed()) Serial.println("The button 2 is pressed"); if(button2.isReleased()) Serial.println("The button 2 is released"); if(button3.isPressed()) Serial.println("The button 3 is pressed"); if(button3.isReleased()) Serial.println("The button 3 is released"); }

Le schéma du code ci-dessus : L'illustration du câblage pour le code : La représentation visuelle du câblage pour le code :

Schéma de câblage de plusieurs boutons Arduino Nano

This image is created using Fritzing. Click to enlarge image

Vidéo

Connaissances supplémentaires

  • La valeur de DEBOUNCE_DELAY varie en fonction des caractéristiques physiques de chaque bouton. Il est possible que différents boutons utilisent des valeurs différentes.

Extensibilité

La technique de filtrage peut être utilisée avec un interrupteur, un capteur tactile, et plus encore.

※ OUR MESSAGES

  • Please feel free to share the link of this tutorial. However, Please do not use our content on any other websites. We invested a lot of effort and time to create the content, please respect our work!