Schaltlogik der Drehbewegung
Gesucht: Ist eine Logik, die bewirkt, dass der Drehantrieb stehen bleibt, wenn der Endlagenschalter ESDreh durch eine der Schaltnocken ausgelöst wird. Der Endlagenschalter schaltet auf Masse. Die Betätigung des Drehantriebs soll über einen Taster TDreh erfolgen, der ebenfalls auf Masse schaltet. Wenn der Taster beim Stopp wegen des Endlagenschalters einmal losgelassen wird, soll das nächste Drücken des Tasters die Drehung weitergehen. Wenn nach einer vorgegebenen Zeit dann die Endlage verlassen ist, soll die Bewegung fortgesetzt werden, solange der Taster gedrückt ist und bis die nächste Schaltnocke den Endlagenschalter auslöst, woraufhin wieder gestoppt wird.
Betätiger:
- TDreh – Taster für die Betätigung der Drehung (low active)
- ESDreh – Endlagenschalter, der durch die Schaltnocken ausgelöst wird (low active)
Variablen:
- Drehenable – erlaubt die Drehung, wenn HIGH
- Resumeflag – erlaubt die Drehung trotz aktiviertem Endlagenschalter
Out Motor:
- Ist das an den Motor tatsächlich gegebene Signal (PWM)
Signalbeispiel:
Beschreibung der Phasen der Logik
I:
Die Drehung ist erlaubt (Drehenable ist HIGH), der Taster ist aber nicht gedrückt. Der Motor wird nicht betätigt.
II.
Der Taster ist betätigt und die Drehung ist erlaubt. Der Motor erhält die PWM Signale.
III:
Der Endlagenschalter wird durch eine der Schaltnocken betätigt, der Motor hält an. Drehenable wird auf LOW gesetzt – die Drehung ist zunächst nicht mehr erlaubt. Weiterhin wird das Resumeflag auf HIGH gesetzt.
IV:
Der Taster wird losgelassen, was die Voraussetzung für das Weiterdrehen ist. Drehenable wird wieder HIGH gesetzt.
V:
Der Taster wird erneut betätigt und der Motor läuft wieder an, trotz des betätigten Endlagenschalters. Für das Resumeflag wird ein Timer gestartet.
VI:
Das Resumeflag bewirkt, dass der Endlagenschalter für eine gewisse Zeit (2 sec) ignoriert wird, die ausreicht, dass durch die Drehbewegung der Endlagenschalter wieder frei wird. Reicht die Zeit dafür nicht, bleibt der Motor noch mal stehen und man befindet sich in der gleichen Situation wie in Phase III. Die Timerzeit muss so gewählt werden, dass sie groß genug ist, dass der Endlagenschalter verlassen werden kann, darf aber andererseits nicht so groß sein, dass durch die Fahrt schon die nächste Schaltnocke anspricht.
VII:
Diese Phase gleicht der Phase II, nur dass evtl. die benachbarte Schaltnocke erreicht wurde.
VIII:
Diese Phase gleicht der Phase III auf der nächsten Schaltnocke.
Material:
- Drehantrieb mit mehreren Schaltnocken
- Zwei Taster
- Ein Endlagenschalter
- Arduino
- Breadboard
- Jumperkabel
Christian Rempel
25/07/24
Programmierbeispiel:
/* www.beerlecada.com Rotary Movement with intermediate stops on endswitch Autor: Christian Rempel Licence: one glass of red wine, when meet the author Date: 22/07/25 */ #define TLinks A0 // Taster #define TRechts A1 #define ESDreh 10 // Endswitch #define SDreh 3 // Motorcontrol PWM #define DDreh 5 // Motorcontrol Direction bool Drehenable = true; bool Resumeflag = false;// wenn true, wird die ESDreh ignoriert long Resumetimer; void moveLinks() { if (Drehenable) { digitalWrite(LED_BUILTIN, HIGH); // comment when tested digitalWrite(DDreh, LOW); delay(10); digitalWrite(SDreh, HIGH); } } void moveRechts() { if (Drehenable) { digitalWrite(LED_BUILTIN, HIGH); // comment when tested digitalWrite(DDreh, HIGH); delay(10); analogWrite(SDreh, 255); } } void StoppDreh() { digitalWrite(SDreh, LOW); digitalWrite(LED_BUILTIN, LOW); // comment when tested } void setup() { pinMode(TLinks, INPUT_PULLUP); pinMode(TRechts, INPUT_PULLUP); pinMode(ESDreh, INPUT_PULLUP); pinMode(SDreh, OUTPUT); // speed Dreh pinMode(DDreh, OUTPUT); // direction Dreh Resumetimer = millis(); } void loop() { // keine Taste gedrueckt, alles ist erlaubt (enabled) if (digitalRead(TLinks) && digitalRead(TRechts)) { Drehenable = true; } // Linksbewegung if (!digitalRead(TLinks)) { if (!Resumeflag && !digitalRead(ESDreh)) { // Wenn die Endswitch das erste Mal erreicht wird, stopt die Bewegung // Das Resumeflag wird true gesetzt StoppDreh(); Drehenable = false; Resumeflag = true; } moveLinks(); } else if ( digitalRead(TRechts)) { StoppDreh(); } //Rechtsbewegung if (!digitalRead(TRechts)) { if (!Resumeflag && !digitalRead(ESDreh)) { StoppDreh(); Drehenable = false; Resumeflag = true; } moveRechts(); } else if ( digitalRead(TLinks)) { StoppDreh(); } if (Resumeflag && digitalRead(TRechts) && digitalRead(TLinks)) { Resumetimer = millis(); // haelt den letzten Moment fest, wo keine der Rechts Links Tasten //gedrueckt ist und das Resumeflag gesetzt // Das Loslassen der Drehtasten erlaubt dann das Fahren trotz beteiligter Endswitch in beliebiger Richtung Drehenable = true; } // Wenn eine der beiden Tasten fuer 2 Sekunden gedrueckt wurde, // wird das Resumeflag wieder auf false gesetzt und der ESDreh wieder beruecksichtigt if ( Resumeflag && millis() - Resumetimer > 2000) { Resumeflag = false; // Der ESDreh muss nach zwei Sekunden verlassen sein } }