lehrkraefte:blc:math:formi:button-breadboard

Ist ein digitaler Input nicht verbunden (bzw. hängt einfach ein loser Draht daran) ist die Spannung nicht definiert. Schlimmer noch, variable elektrische Felder induzieren eine Spannung (v.a. 50Hz Wechselstrom) und der digitale Input kann wild zwischen 0 und 1 wechseln.

Im Falle eines Pushbuttons wird das eine Ende des Buttons auf GND oder 5V gehängt, und das andere Ende mit dem Input-Pin verbunden und zusätzlich über einen grossen Widerstand auf 5V oder GND, damit der Zustand auch bei offenem Schalter definiert ist.

Der Arduino hat interne Pullup-Widerstände, die man aktivieren kann. Man spart sich damit einen Widerstand in der Schaltung. Allerdings ist dann die Logik “vertauscht”, d.h. man liest eine Eins wenn der Button offen, und eine Null wenn er gedrückt ist.

   // Kurzform:
   pinMode(2, INPUT_PULLUP);
   // Alternative
   pinMode(2, INPUT);
   digitalWrite(2, HIGH); // Pullup aktivieren

Diese Schalter schliessen nicht immer sofort und vollständig, sondern können noch vibrieren, was als mehrere ganz schnelle Knopfdrücke missinterpretiert werden kann. Abhilfe kann eine Filterung mit Hilfe eines RC-Gliedes oder eine entsprechende Programmlogik sein.

Das “Bouncing” kann mit folgendem Programm visiualisert werden. Das ist besonder eindrücklich, wenn man zwei Drähte zusammenhält.

// GND auf eine Seite des Buttons, andere Seite auf Pin 2
// Oder Pin 2 und GND mit zwei Stecker berühren (oder einfach ein- und ausstecken).
 
void setup() {
  pinMode(2, INPUT_PULLUP);
  Serial.begin(115200);
  // Funktion aufrufen, wenn immer der Zustand ändert.
  attachInterrupt(digitalPinToInterrupt(2), click, CHANGE);
}
 
#define NUM 20
// volatile, damit im Interrupt verfügbar
volatile int pos = 0;
volatile long us[NUM];
 
// Interrupt Methode
void click() {
  if (pos<NUM) {
    us[pos++]=micros();
  }
}
 
void loop() {
  if (pos==NUM) {
     for (int i=0; i<NUM-1; i++) {
        Serial.print(us[i+1]-us[i]);
        Serial.print(" ");
     }
     Serial.println();
     pos = 0;
  }
}
  • lehrkraefte/blc/math/formi/button-breadboard.txt
  • Last modified: 2017/02/10 17:35
  • by Ivo Blöchliger