Taster abfragen und richtig entprellen
Monday, der 15. June 2015Wenn Sie einen Arduino mit einem Taster steuern möchten, stehen Sie vor der Herausforderung, den Taster richtig abzufragen und zu entprellen. Das Anschließen eines Tasters an den Arduino ist zwar einfach, aber die korrekte Erfassung der Tastendrücke erfordert spezielle Maßnahmen. In diesem Artikel werden wir Ihnen zeigen, wie Sie einen Taster mit dem Arduino verbinden und wie Sie Prellen effektiv verhindern können. Schauen wir uns gemeinsam an, wie Sie Ihren Arduino mithilfe eines Tasters steuern können.
Beim Auslesen von Tastern kommt es häufig zu einem Phänomen dass sich Prellen nennt. Dieses Prellen kann zu unerwünschten Effekten führen, wie mehreren Auslösungen eines Tastendrucks oder ungenauen Eingaben. Bevor wir uns aber damit genauer beschäftigen, lesen wir erst einmal einen Taster aus.
Zum Glück ist das Anschließen eines Tasters sehr einfach, und die Arduino-IDE bietet sogar einen vorgefertigten Sketch, den Sie unter
Beispiele -> 02.Digital -> Taster finden können.
Hier ist der Quellcode:
/* Button Turns on and off a light emitting diode(LED) connected to digital pin 13, when pressing a pushbutton attached to pin 2. The circuit: * LED attached from pin 13 to ground * pushbutton attached to pin 2 from +5V * 10K resistor attached to pin 2 from ground * Note: on most Arduinos there is already an LED on the board attached to pin 13. created 2005 by DojoDave http://www.0j0.org modified 30 Aug 2011 by Tom Igoe This example code is in the public domain. http://www.arduino.cc/en/Tutorial/Button */ // constants won't change. They're used here to // set pin numbers: const int buttonPin = 2; // the number of the pushbutton pin const int ledPin = 13; // the number of the LED pin // variables will change: int buttonState = 0; // variable for reading the pushbutton status void setup() { // initialize the LED pin as an output: pinMode(ledPin, OUTPUT); // initialize the pushbutton pin as an input: pinMode(buttonPin, INPUT); } void loop() { // read the state of the pushbutton value: buttonState = digitalRead(buttonPin); // check if the pushbutton is pressed. // if it is, the buttonState is HIGH: if (buttonState == HIGH) { // turn LED on: digitalWrite(ledPin, HIGH); } else { // turn LED off: digitalWrite(ledPin, LOW); } }
Neben einem Arduino braucht man natürlich noch einen Taster und einen Widerstand. Der Widerstand verbindet Pin 2 mit Masse und zieht die Spannung an dem Pin auf 0V. Wenn man den Taster betätigt wird der Pin an die Versorgungsspannung gelegt (5V) und die Spannung am Pin steigt quasi sofort auf 5V. Diese Spannung wird vom Arduino erkannt und kann über die Funktion digitalRead ausgelesen werden.
Zusätzlich zum Arduino benötigen Sie einen Taster und einen Widerstand. Der Widerstand verbindet Pin 2 mit Masse und zieht die Spannung an dem Pin auf 0V. Wenn Sie den Taster betätigen, wird der Pin an die Versorgungsspannung (5V) gelegt und die Spannung am Pin steigt quasi sofort auf 5V. Diese Spannung wird vom Arduino erkannt und kann über die Funktion digitalRead ausgelesen werden.
Der Sketch setzt Pin 2 in den Inputmodus und Pin 13 in den Outputmodus. An Pin 2 befindet sich der Taster und an Pin 13 ist auf dem Arduino bereits eine LED eingebaut. In der Loop-Schleife wird kontinuierlich über die Funktion digitalRead der Pin 2 überprüft. Die Variable buttonState wird dann auf 0 oder 1 gesetzt, je nachdem welchen Wert digitalRead zurückgibt. Wenn die Variable auf 1 gesetzt wird, wird die LED eingeschaltet, ansonsten wird sie ausgeschaltet.
Das funktioniert gut, aber es fehlt die Möglichkeit, zwischen An- und Aus-Zustand zu wechseln, wenn der Taster gedrückt wird.
Einzelne Tastendrücke
Um zu überprüfen, ob der Taster bereits gedrückt wurde, speichern wir dies in einer Variable. Hier ist ein Beispiel:
/* Button Turns on and off a light emitting diode(LED) connected to digital pin 13, when pressing a pushbutton attached to pin 2. The circuit: * LED attached from pin 13 to ground * pushbutton attached to pin 2 from +5V * 10K resistor attached to pin 2 from ground * Note: on most Arduinos there is already an LED on the board attached to pin 13. */ // constants won't change. They're used here to // set pin numbers: const int buttonPin = 2; // the number of the pushbutton pin const int ledPin = 13; // the number of the LED pin // variables will change: int buttonState = LOW; // variable for reading the pushbutton status int buttonread = 0; void setup() { // initialize the LED pin as an output: pinMode(ledPin, OUTPUT); // initialize the pushbutton pin as an input: pinMode(buttonPin, INPUT); Serial.begin(9600); } void loop() { // read the state of the pushbutton value: buttonread = digitalRead(buttonPin); // check if the pushbutton is pressed. // if it is, the buttonState is HIGH: if (buttonread == HIGH) { //Check if Button was pressed before and being pressed now if (buttonState == LOW) { // turn LED on: digitalWrite(ledPin, HIGH); buttonState = HIGH; Serial.println("Button pressed"); } } else { if (buttonState == HIGH) { digitalWrite(ledPin, LOW); buttonState = LOW; } } }
Zu Beginn wird buttonState mit LOW initialisiert. Diese Variable speichert, ob der Taster bereits gedrückt wurde (LOW zeigt an, dass noch nicht gedrückt wurde). Wenn der Taster gedrückt wird, wird die LED eingeschaltet und eine Meldung über den Serial Port ausgegeben. Auch beim Loslassen des Tasters bleibt die LED an.
Allerdings können mehrere Nachrichten über die serielle Schnittstelle auftreten, obwohl der Taster nur einmal gedrückt wurde. Dieses Verhalten sollte nicht auftreten, selbst wenn der Taster gedrückt gehalten wird.
Das obige Bild z.B. ist nach einem einzigen Tastendruck. Was ist passiert?
Prellen
Beim Betätigen des Tasters schließt man den Stromkreis, aber dies geschieht nicht sofort. Die mechanischen Bauteile im Taster sind nicht perfekt, und es kann eine Weile dauern, bis der Stromkreis vollständig geschlossen ist. Dieses Verhalten wird als “Prellen” bezeichnet. Um dieses Verhalten zu korrigieren, muss der Taster “entprellt” werden. Es gibt verschiedene Ansätze, sowohl elektrisch als auch softwaretechnisch.
Eine einfache Softwarelösung besteht darin, nach dem Einlesen des Tasters einen kurzen Moment zu warten und dann, falls dieser HIGH war, den Taster noch einmal einzulesen. Wenn der Taster immer noch auf HIGH ist, kann der Arduino sicher sein, dass es ein echter Tastendruck war.
if (buttonread == HIGH) { //Check if Button was pressed before and being pressed now delay(5); if ((buttonState == LOW) && (digitalRead(buttonPin)) ) { if (digitalRead(buttonPin)) { // turn LED on: digitalWrite(ledPin, HIGH); buttonState = HIGH; Serial.println("Button pressed"); } } }
Wie lange man genau warten muss, hängt von Fall zu Fall ab und ist nicht besonders kritisch. Für gewöhnlich reichen 5 bis 50 Millisekunden.