Verfahren zwischen 2 Endschaltern

Hallo miteinander,

leider komme ich gerade nicht weiter und wollte fragen ob mir jemand helfen könnte.

Bei meinem Versuchsaufbau steuere ich über das Arduino Motor Shield einen Wagen mit Gleichstrommotor an. Auf der linken bzw. rechten Seite des Aufbaus befindet sich jeweils 1 Endschalter (Magnetschalter).

Zu meinen Problem:
Ist der rechte Endschalter (MagnetStatus1) erreicht, soll sich der Wagen wieder nach links bewegen und das solange, bis der linke Endschalter (MagnetStatus2) erreicht ist.
Die Abfrage, dass wenn der rechte Endschalter erreicht ist und der Wagen
dann nach links fahren soll habe ich so gelöst:

   if(MagnetStatus1 == 0) // && Keine Drehung der Kurbel
  {
   Serial.println("--> Wagen hat Endposition erreicht!");
   Serial.println("");
   Serial.println("Start Bremsung\n");
   // Pin für Bremse auf 'High' setzen, somit stopt der Motor schneller
   digitalWrite(Bremse_A, HIGH);  // Aktivieren der Bremse
   delay(1000);    
 
   Serial.println("Wagen bewegt sich nach links zur Anfangsposition:");
   digitalWrite(Bremse_A, LOW);    // Pin für Bremse auf 'Low' setztn, deaktiviert die Motorbremse erneut
   digitalWrite(Richtung_A, LOW);  // Pin für die Drehrichtung des Motors auf 'High' setzen --> Wagen fährt nach links
  
   analogWrite(PWM_A, 255);        // Geschwindigkeit des Motors setzen 
   W = 0; // Hier null setzten, da andere IF-Funktion somit nicht nacheinander ausgeführt wurde. 

  }

Wie schaffe ich es jetzt, dass dieser Code solange ausgeführt wird, bis der linke Endschalter (Magnetstatus2) erreicht ist???

Danke für eure Hilfe.

Wenn ich dich richtig verstehe, fährt er entweder nach links oder nach rechts ( oder macht eine Kurze Pause am Ende ).

Also musst du dir nur die aktuelle Richtung merken, und wenn ein Endschalter ansteht, in die richtige Richtung losfahren.

Dabei evtl. bedenken, dass bei ordentlicher Programmierung die Hauptaufgabe von loop darin besteht, nichts zu tun (weil sich nichts geändert hat). loop wird dadurch unheimlich schnell, und kann innerhalb weniger µs auf einen Zustandswechsel deiner Endschalter reagieren.

Danke für die schnelle Antwort.

Mein Problem besteht darin, dass ich nicht weis wie ich es Programmiertechnisch lösen soll, solange nach links zu fahren, bis die Zustandsänderung von MagnetSchalter2 kommt.

Frag mal agmue nach seinem endlichen Automaten :smiley:

Link

Einen endlichen Automaten halte ich hier schon für overkill ^^
Pseudocode:

int richtung = 1;
//...
loop:
if (richtung == 1){
  if (endschalterRechtsGedrückt)
    richtung = -1;
  else
    fahreNachRechts;
}else {
  if (endschalterLinksGedrückt)
    richtung = -1;
  else
    fahreNachLinks;
}

Hast du doch eigentlich schon:

 digitalWrite(Richtung_A, LOW);  // Pin für die Drehrichtung des Motors  --> Wagen fährt nach links 
   analogWrite(PWM_A, 255);        // Geschwindigkeit des Motors setzen ( aber nicht übertreiben ;)

Danach fährt er ewig weiter.

Problem ist eher, wie du ihn beim Start in Gang kriegst, wenn kein Endschalter ansteht.
( z.B. Einfach immer analogWrite(PWM_A, 255); ausgeben, ausser wenn du grade in der Endschalter-Pause im delay hängst)

Und dass du nur den Endschalter prüfst, auf den du zufährst.

bool Richtung; // true = nach links, false = nach rechts.
void loop () {
   bool alteRichtung = Richtung;
   if(alteRichtung && digitalRead(EndschalterLinks) == LOW) {
      bremsen();
      delay(1000);
      Richtung=false;
   }
   if(!alteRichtung && digitalRead(EndschalterRechts) == LOW) {
      bremsen();
      delay(1000);
      Richtung=true;
   }
     
   digitalWrite(Richtung_A, Richtung);  // das stört nicht, wenn es immer wiederholt wird
   analogWrite(PWM_A, 255);  // volle Pulle

(geht davon aus, dass die Endschalter über INPUT_PULLUP betrieben werden)

Nachtrag:Das (oder auch MGOS Vorschlag) ist ein Endlicher Automat !

Gehört nicht zum Thema, aber ich habe mich neulich weggeschmissen, als ich in einem anderen Zusammenhang las:

"Firlefanz wie Endschalter" - (c) by michael_x

:smiley:

Danke für dieses Bonmot!

Gruß, H.

ElEspanol:
Frag mal agmue nach seinem endlichen Automaten :smiley:

Link

Mit Gruß an die Besatzung vom Raumschiff Orion etwas Overkill:

enum Zustaende {WARTEN_AUF_START, FAHREN_NACH_RECHTS, RECHTER_ENDSCHALTER_ERREICHT, FAHREN_NACH_LINKS, LINKER_ENDSCHALTER_ERREICHT};
byte zustand = WARTEN_AUF_START;

Kann man wahrscheinlich auf drei Zustände reduzieren.

Nun muß ich aber erstmal sehen, ob die Frogs die Welt bedrohen.

Danke für die vielen schnellen Antworten:)

Waren sehr hilfreich! Werde es weiter versuchen;)

MfG Michael