Materialfuehrungsrollen


Google-Suche auf MEINE-SCHALTUNG.de :





Dauerkalender


Entprellung mit Arduino

Neben Hardwarelösungen bieten heutzutage Software mehrere Möglichkeiten, einen Kontakt (Taster oder Relais) zu entprellen, an. Die Softwaremethoden, trotz einiger Nachteile, sind einfacher zu realisieren und kostengünstiger. Es gilt dabei lediglich darauf zu achten, dass das Hauptprogramm nicht allzu stark zeitlich von den Entprell-Routinen beeinflusst wird. Hier ein kleines Arduino – Entprellungsprogramm (IDE).

Mit einem Taster wird eine Diode ein und ausgeschaltet. Beim Einschalten (Taster betätigt) und Ausschalten (Taster losgelassen) prellt der Kontakt. Der Vorgang ist zwar für uns nicht sichtbar, kann jedoch mit diversen Methoden festgestellt werden. Es gilt die Auswirkungen der Prellung zu unterbinden.

Eine passende Schaltung für den Programmtest könnte so aussehen:

Schema

In dem Beispiel werden jeweils die steigende und fallende Flanke am Eingang (PIN 40) vorrangig behandelt. Wird eine steigende Flanke erkannt (Taster war nicht gedrückt und wurde gedrückt), wird die den Ausgang repräsentierende Variable "Signal" auf HIGH gesetzt (Diode geht an). Gleichzeitig wird eine weitere Abfrage des Eingangs auf die in der Variable "Prellzeit" vorgegebene Zeit gesperrt. Die Aufgabe der Sperrung erledigt die Variable "Sperre", die dabei auf HIGH gesetzt wird. Erst nach Ablauf der Zeit wird die Abfrage des Eingangs wieder freigegeben ("Sperre" = LOW). Ist der Taster dann immer noch gedrückt, bleibt die Diode an. Wurde er losgelassen, geht die Diode aus.

Testschaltung

Testschaltung


Genauso wird die fallende Flanke (Taster war gedrückt und ist nicht mehr gedrückt) behandelt. Sobald sie erkannt wird, wird die Variable "Sperre" aktiviert. Der Eingang wird nicht mehr abgefragt. Die Freigabe erfolgt erst dann, wenn die Zeit "Prellzeit" abgelaufen ist.


  // ----------------------------------------------------------
  // Kontakt - Entprellung mit Arduino


  // ----------------------------------------------------------
  unsigned long Millis_Aktuell = 0;
  unsigned long Prellzeit = 20;
  unsigned long Zeit_Merker = 0;
  int Taster_Pin = 40;
  int LED_Ausgang = 42;
  bool Sperre;
  bool Signal;

  void setup() {
    pinMode (LED_Ausgang, OUTPUT);
    pinMode (Taster_Pin, INPUT_PULLUP);
    Serial.begin(9600);
  }

  void loop() {
    Millis_Aktuell = millis();

  // +++++ Zeitmerker +++++++++++++++++++++++++++++++++++++++++++++++++++
    if (Millis_Aktuell == 0) {
      Zeit_Merker = 0;
    }

  // +++++ Taster wurde betätigt ++++++++++++++++++++++++++++++++++++++++
    if (digitalRead(Taster_Pin) == LOW && Sperre == LOW && Signal == LOW) {
      Zeit_Merker = Millis_Aktuell;
      Sperre = HIGH;
      Signal = HIGH;
      Serial.println ("Taster wurde betätigt.");
    }

  // +++++ Taster wurde losgelassen +++++++++++++++++++++++++++++++++++++
    if (digitalRead(Taster_Pin) == HIGH && Sperre == LOW && Signal == HIGH) {
      Zeit_Merker = Millis_Aktuell;
      Sperre = HIGH;
      Signal = LOW;
      Serial.println ("Taster wurde losgelassen.");
    }

  // +++++ Prellzeit abgelaufen. ++++++++++++++++++++++++++++++++++++++++
    if (Sperre == HIGH && Zeit_Merker + Prellzeit < Millis_Aktuell) {
      Sperre = LOW;
      Serial.println ("Eingang-Abfrage freigegeben.");
    }

      digitalWrite (LED_Ausgang, Signal);
  }
  // ----------------------------------------------------------


Für Testzwecke kann man die "Prellzeit" höher stellen und das Programm testen. Bei ausreichend langer Prellzeit kann man die Prellung durch mehrfaches Betätigen des Tasters simulieren und die Reaktion des Programms beobachten.
Da in dem Programm die Anweisung "delay" nicht verwendet wird, wird das Programm für die "Prellzeit" nicht angehalten. Die Ausführung anderer Programmteile kann problemlos weiter erfolgen.


Weitere Themen:


Google-Suche auf MEINE-SCHALTUNG.de :


Home Impressum Datenschutz