Entprellung mit ArduinoNeben 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:
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
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.
Google-Suche auf MEINE-SCHALTUNG.de :
|
|