Schrittmotor mit Endschalter und Notstop

Hallo liebe Leute,

ich bin dabei, den arduino dabei zu nutzen, die Tür eines Hühnerstalls per Tastendruck zu öffnen und zu schließen.
Die Tür schließt und bleibt beim Endschalter stehen. Allerdings möchte ich noch einen zweiten “Notstopschalter” einbauen der, ähnlich wie bei einer Aufzugtür funktionieren sollte. Wird dieser Notstopschalter ausgelöst, soll die Türe wieder öffnen.
Wie schaffe ich es in dem Code noch einen zweiten Schalter abzufragen während der Motor läuft?
Ich sitze schon seit Stunden an dem Problem. Ein zweites While geht ja leider nicht…

bin euch echt dankbar für eure Hilfe.

viele grüße,
Tom.

// Tür Zu
  if (digitalRead(TasterZu) == HIGH) {  //wenn Taster für schließen gedrück wird, dann
      digitalWrite(13, HIGH);
      for (int k = 30; k <= 150; k++) {  //langsamer Motoranlauf
       mystepper.setSpeed( k);          //Setze Geschwindigkeit des Motors auf 200 UPM
      mystepper.step(3);                //beim motoranlauf 3 Schritte pro geschwindigkeit
      }
    do {                                // mache dies in einer schleife bis while
      mystepper.setSpeed(150);          //Setze Geschwindigkeit des Motors auf 150 UPM
      mystepper.step(10);               //mache 10 Schritte
    
    }
    //if(digitalRead(TasterZuStop)==LOW || digitalRead(TasterNotStop)==LOW);
    
    // while((digitalRead(TasterZuStop)==LOW) || (digitalRead(TasterNotStop))==LOW); {
  while(digitalRead(TasterZuStop)==LOW); {
    
    digitalWrite(13, LOW);                   // LED für Bewegung Türe an
    digitalWrite(5, HIGH);                   // LED für TüreZu an
    delay(500);                              // warte 0,5 Sekunde
    mystepper.setSpeed(20);                  //Setze Geschwindigkeit des Motors auf 20 UPM
    mystepper.step(-200);                    // eine Umdrehung zurück um den Endschalter frei zu geben 
    delay(2500);                             // warte 21,5 Sekunden
    digitalWrite(5, LOW);                    // LED für TüreZu Aus
    digitalWrite(12, LOW);                   // Setze pin 12 auf low und spreche damit den ResetPin an
    
  }
  }
}

Schmeiß alle delay() raus.
mach die Zeitkontrolle mittels millis() siehe "blink without delay" in den Beispielen der IDE. und mache kleine SChritte abwärts sodaß jederzeit der Motor andersrum angesteuert werden kann.
Grüße Uwe

Und am Ende einer While-Anweisung gehört kein Semikolon.

Ach und lösche bitte den 2. Thread .

uwefed:
Schmeiß alle delay() raus.
mach die Zeitkontrolle mittels millis() siehe “blink without delay” in den Beispielen der IDE. und mache kleine SChritte abwärts sodaß jederzeit der Motor andersrum angesteuert werden kann.
Grüße Uwe

Die Delays habe mit der Bewegung des Motors nichts zu tun.
Die Hab ich eigentlich nur temporär eingebaut um besser beobachten zu können,

Danke,
Tom.

HotSystems:
Und am Ende einer While-Anweisung gehört kein Semikolon.

Ach und lösche bitte den 2. Thread .

Entferne ich das Semikolon, bekomme ich eine Fehlermeldung "expected ";" before "{" token

den Post versuche ich zu löschen, ich finde keine möglichkeit wie das funktioniert,

Danke,
Gruß Tom.

Den zweiten Post hab ich bereits gelöscht.

Entferne ich das Semikolon, bekomme ich eine Fehlermeldung "expected ";" before "{" token

Das können wir nicht nachvollziehen da Du nur einen Teil Deines Sketches gepostet hast.
Grüße Uwe

Danke fürs löschen uwefed.

hier mein kompletter Code:

#include <Stepper.h>
int TasterZu = 7;
int TasterZuStop = 6;
int TasterAuf = 4;
int TasterAufStop = 3;
int TasterNotStop = A0;



const int stepsPerRevolution = 200; //Auflösung schrittmotor 1,8Grad
Stepper mystepper(stepsPerRevolution, 8, 9, 10, 11); // Kontakte auf Uno


void setup() {
  mystepper.setSpeed(0);          //Geschwindigkeit Motor auf 0(Aus)
  pinMode(TasterAuf, INPUT);      // als Eingang setzten
  pinMode(TasterZu, INPUT);       // als Eingang setzten
  pinMode(TasterZuStop, INPUT);   // als Eingang setzten
  pinMode(TasterAufStop, INPUT);  // als Eingang setzten
  pinMode(TasterNotStop, INPUT);  // als Eingang setzten
  digitalWrite(12, HIGH);         //zum resetten nach endschalter! LOW=Reset
  pinMode(12, OUTPUT);            //muss NACH High gesetzt werden!!!
  pinMode(13, OUTPUT);            //Ausgang für LED Bewegungsanzeige
  pinMode(5, OUTPUT);             //Ausgang für LED Endposition Erreicht
  
}

void loop() {
// Tür Zu
  if (digitalRead(TasterZu) == HIGH) {   //wenn Taster für schließen gedrück wird, dann
      digitalWrite(13, HIGH);
      for (int k = 30; k <= 150; k++) {  //langsamer Motoranlauf
       mystepper.setSpeed( k);           //Setze Geschwindigkeit des Motors auf 200 UPM
      mystepper.step(3);                 //beim motoranlauf 3 Schritte pro geschwindigkeit
      }
   do {                                  // mache dies in einer schleife bis while
      mystepper.setSpeed(150);           //Setze Geschwindigkeit des Motors auf 150 UPM
      mystepper.step(10);                //mache 10 Schritte
    
    }
    
    
     while(digitalRead(TasterZuStop)==LOW); {
    
    digitalWrite(13, LOW);                   // LED für Bewegung Türe an
    digitalWrite(5, HIGH);                   // LED für TüreZu an
    delay(500);                              // warte 0,5 Sekunde
    mystepper.setSpeed(20);                  //Setze Geschwindigkeit des Motors auf 20 UPM
    mystepper.step(-200);                    // eine Umdrehung zurück um den Endschalter frei zu geben 
    delay(2500);                             // warte 21,5 Sekunden
    digitalWrite(5, LOW);                    // LED für TüreZu Aus
    digitalWrite(12, LOW);                   // Setze pin 12 auf low und spreche damit den ResetPin an
    
  }
  }
}

Die Do-While Schleife ist richtig mit dem Semicolon:
https://www.arduino.cc/en/Reference/DoWhile

Was soll die geschweifte Klammer nach dem Semicolon?

Grüße Uwe

uwefed:
Die Do-While Schleife ist richtig mit dem Semicolon:
do...while - Arduino Reference

Was soll die geschweifte Klammer anch dem Semicolon?

Grüße Uwe

Ok, sorry,
habe die nur als "While" betrachtet. Hier stimmt es so.

uwefed:
Die Do-While Schleife ist richtig mit dem Semicolon:
do...while - Arduino Reference

Was soll die geschweifte Klammer anch dem Semicolon?

Grüße Uwe

die Klammer hat sich wohl durch mein ständiges herumprobieren und umgeschreibe an der Ort temporär festgesetzt ;-).
hab sie gelöscht und eine am Ende des Codes.

Nachdem nun alle zufrieden sind, können wir uns vielleicht wieder dem Thema widmen :wink:

Und dann landen wir fast zwangsläufig bei einem Automaten, mit den Zuständen
Tür zu - warten auf Schalter
Anfang Öffnen - langsam
Öffnen - schnell bis Endschalter
Tür offen - warten bis Öffnungszeit abgelaufen und kein Notschalter
Tür schließen - bis Tür geschlossen

Das steht dann in loop(), mit einem switch(Zustand).

Die Zustände werden normalerweise der Reihe nach bearbeitet, die Bedingungen für das Wechseln zum nächsten Zustand steht schon in der Tabelle. Vom letzten Zustand geht's dann wieder an den Anfang.

Mit dem Notschalter kommt noch ein Vorspann davor, der den Notschalter prüft, und wenn der gedrückt ist in den Zustand "Anfang Öffnen" schaltet, sofern die Tür nicht bereits geöffnet wird oder offen ist.

DrDiettrich:
Die Zustände werden normalerweise der Reihe nach bearbeitet,

Gerade wollte ich eine Schrittkette mit switch empfehlen :wink:

Anderer Vorschlage wäre, deinen Notschalter auf einen Interrupt Pin zu legen.
Du könntest deinen Notstopp auf einen Interrupt Pin (2 und 3 beim UNO) setzen und programmierst eine Funktion, in der du die Tür wieder auf fahren lässt.
Da musst du aber aufpassen, dass dein Programm nicht wieder in die Zeile zurück springt, in der die Tür zu fährt.

https://www.arduino.cc/en/Reference/AttachInterrupt

Ich hab’ das mal so gelöst, indem ich eine bool Variable in der Funktion (die der Interrupt aufruft) auf false gesetzt habe. Und in der loop habe ich diese immer wieder auf true abgefragt, sodass das Programm nicht weiter gelaufen ist, sobald ich meinen Stoptaster gedrückt habe.
Wenn ich wiederum meinen Starttaster gedrückt habe, wurde die Variable auf true gesetzt und das Programm hat seinen normalen Gang genommen.

Dann hast Du einen Not-Halt programmiert, kein Not-Auf.

DrDiettrich:
Dann hast Du einen Not-Halt programmiert, kein Not-Auf.

Ist mir bewusst.
Das kann er ja anders gestalten.

Hallo und vielen Dank für eure Anregungen... ich denke da hab ich nun eine Weile zu googlen. ich glaube die Möglichkeit für den Notschalter einen InterruptPin zu belegen werde ich mir genauer anschauen.

Danke einstweilen für eure Ideen.

viele grüße,
Tom.

ich glaube die Möglichkeit für den Notschalter einen InterruptPin zu belegen werde ich mir genauer anschauen.

Kannsts du dir anschauen....

Ist aber selten nötig, für Schalter Interrupts zu verwenden.
Eigentlich nur, wenn ein AVR aus dem Tiefschlaf geholt werden soll.

Konsequent auf blockierende Dinge verzichten!
Das reicht.


Ablaufsteuerung
Meine Standardantwort zu Ablaufsteuerungen:
Eine Stichworte Sammlung für Google Suchen:
Endlicher Automat,
State Machine,
Multitasking,
Coroutinen,
Ablaufsteuerung,
Schrittkette,
BlinkWithoutDelay,

Blink Without Delay
Der Wachmann

Multitasking Macros
Intervall Macros

Combie hat wie immer Recht.

"Da nehm ich einen Interrupt" ist ein beliebter Anfänger-Designfehler.

Klar geht es, aber ...
Für Taster-Abfragen, Multitasking und parallele Code-Abarbeitung sind die Interrupts nicht gedacht.
Und damit so etwas einfacher zu realisieren ist, erst recht nicht.

combie:
Kannsts du dir anschauen....

Ist aber selten nötig, für Schalter Interrupts zu verwenden.
Eigentlich nur, wenn ein AVR aus dem Tiefschlaf geholt werden soll.

Konsequent auf blockierende Dinge verzichten!
Das reicht.


in dem Fall ist der Schrittmotor das blockierende Element... leider kann ich auf den nicht verzichten.
Am einfachsten wäre es, den NotStop mit dem gleichen Pin wie den Endschalter zu koppeln... dann bleibt er einfach stehen... aber wäre schon schön es zu realisieren, daß das Tor wieder öffnet...
Werde mich noch sehr viel lernen müssen :wink:

vielen dank,
gruß Tom.

in dem Fall ist der Schrittmotor das blockierende Element… leider kann ich auf den nicht verzichten.

Nicht der Schrittmotor blockiert, sondern die Software.

Das ist gar nicht so schwer wie es zunächst wirkt.

Schau dir den Beispielcode unter dem Link an und probier ein wenig herum.
Wenn du den verstehst, sollte es kein großes Problem sein, das bei dir einzubinden.