Debouncing

Inhalt

  • Das Contatc-Bounce-Problem bei Buttons
  • Debouncing mittels Bibliothek

Einführung

Bauelemente, die Schaltkreise physisch schließen und öffnen (Taster, Schalter, Relais, Encoder, …) sind oft vom Problem des Bouncings betroffen. Dabei wird der elektrische Kontakt oft nicht sofort vollständig geöffnet oder geschlossen, sodass Sensoren manchmal mehrere Schaltvorgänge in einem sehr kurzem Zeitraum detektieren.

Contact Bounce (Quelle: Wikipedia)

Dieses Verhalten ist unerwünscht, weshalb hard- oder softwareseitig Maßnahmen getroffen werden um ein mehrfaches auslösen zu verhindern.

Die Bounce2-Bibliothek

Die Bounce2 Bibliothek bietet zwei Strategien um mit dem Bouncing-Phänomen umzugehen. Beide warten einen bestimmten Zeitraum um den Effekt des Bouncings zu ignorieren.

Das Wiki der Bibliothek beschreibt die Möglichkeiten:

Stable Interval

Nach der Beendigung des Bouncings muss der Zustand eine definierte Zeitdauer stabil gewesen sein, um abgeschlossen zu sein:

Bildquelle: Bounce2 Wiki
Lock-Out Interval

Durch Editieren der Header-Datei der Bibliothek kann ein weiterer Modus aktiviert werden. Durch ein Einfügen von #define BOUNCE_LOCK_OUT am Anfang der Bounce.h-Datei wird die Lock-out-Methode aktiviert. Diese reagiert sehr schnell. Nachteilig ist, dass der auftretende Noise bei zu kurzer Definition des zeitlichen Intervals nicht ausgelöscht wird.

Bildquelle: Bounce2 Wiki

Beispiel: Anwendung von Bounce2

Folgender Code basiert auf dem Beispiel Taster als Schalter, ist aber um die Bounce-Bibliothek erweitert. (Er setzt voraus, dass sie die Bibliothek auch installiert haben).

Code-Analyse

Zunächst wird mit #include <Bounce2.h>  die installierte Bounce2-Bibliothek eingebunden (stellen Sie sicher, dass sie auch installiert ist) und anschließend die Pin-Nummern in Variablen gespeichert (die Installation von Bibliotheken wird auf der Arduino Website oder auch hier behandelt).

Durch die Zeile Bounce debouncer = Bounce();wird ein Bounce-Objekt namens  debouncer  erstellt. Dieses Objekt wird wie eine Variable verwendet und bekommt später verschiedene Eigenschaften (z.B. welchem Pin es zugewiesen ist).

In setup()  wird zunächst der Input wie üblich erstellt ( pinMode(BUTTON_PIN,INPUT_PULLUP);). Im Anschluss wird dem Bounce-Objekt dieser Pin mittels debouncer.attach(BUTTON_PIN); zugewiesen. Über den Aufruf der Methode debouncer.interval(5);  wird dem Bounce-Objekt eine Wartezeit von 5 ms zugewiesen (in der weiteren Verwendung muss der Taster also 5 ms stabil sein, damit ein Zustandswechsel erkannt wird).

In loop()  wird der Taster mit dem Bounce-Objekt verwendet. Zunächst muss der Zustand des Buttons bei jeder Ausführung des loops mittels debouncer.update(); ausgelesen werden. Über debouncer.read();  wird nun der digitale Input ausgelesen und der Wert in einer Variable gespeichert (es ist keine Angabe des Pins notwendig, da debouncer bereits vorher einen Pin zugewiesen bekommen hat). Die Variable enthält nun den entsprechenden, gefilterten Wert des Tasters.

Weiterführende Links

  • https://en.wikipedia.org/wiki/Switch#Contact_bounce
  • http://playground.arduino.cc/Code/Bounce

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.