Endschalter programmieren

Hallo,
irgendwie stehe ich grad auf dem Schlauch bei einer eigentlich ganz einfachen Aufgabe.

Und zwar habe eine Schiene, einen Schlitten und je einen Endschalter am Ende. Wenn der Schlitten den Endschalter erreicht, soll der Motor ausgehen. Wenn ich den Einschalter drücke, soll der Motor wieder in die andere Richtung fahren.

Was ich bisher benutzt habe (Ein-/Ausschalten per Tastendruck, Richtungswechsel manuell über andere Taste):

    if (einaus ==0)   // Motor ausschalten,  wenn Einschalter auf Aus ist
    {
      digitalWrite(rechtslauf,LOW);
      digitalWrite(linkslauf,LOW);
      analogWrite(motoreinaus, 0);
    }
    else
    {

      if( richtung == 0)  // Rechtslauf einschalten
      {
        digitalWrite(linkslauf,LOW);
        digitalWrite(rechtslauf,HIGH);
        analogWrite(motoreinaus, pwmMotor);
      }
      else   // Linkslauf einschalten
      {
        digitalWrite(rechtslauf,LOW);
        digitalWrite(linkslauf,HIGH);
        analogWrite(motoreinaus, pwmMotor);
      }
    }
  case btnRICHTUNG:  // Taste für Richtungswechsel
    {

      switch (richtung)
      {
      case 0:
        {
          lcd.clear();
          richtung=1;
          delay(300);
          break;
        }
      case 1:
        {
          lcd.clear();
          richtung=0;
          delay(300);
          break;
        }
      }
      break;
    }

Ich hatte schon probiert über eine Oder-Bedingung (Einschalter aus oder Endlage ein) das Problem zu lösen. Der Motor geht zwar dann aus, wie ich ihn aber wieder anbekomme, fällt mir bei besten Willen nicht ein.

Meine Idee war es eine Variable zu erstellen, die 1 ist, sobald die Endlage erreicht ist und durch den Einschalter wieder auf 0 resettet wird. Da es sich ja um einen Schalter handelt, wird ja permanent ein Signal gesendet, die Variable ist also immer 1, egal was ich mache. Ich bräuchte irgendwie ein "Tasterverhalten".

Das mit dem Richtungswechsel wäre dann nämlich auch zu realisieren, da ja die Aktion nur einmal ausgeführt wird.

hi,

ich würd's von der logik her so realisieren:

1 variable für richtung.
wenn einschalter gedrückt wird {
wenn (richtung == links) AND (linker_schalter == aus) > motor ein
wenn (richtung == rechts) AND (rechter_schalter == aus) > motor ein
}
wenn (linker_schalter == ein) AND (richtung == links) > motor aus, richtung rechts
wenn (rechter_schalter == ein) AND (richtung == rechts) > motor aus, richtung links

ich will's jetzt nicht programmieren und ausprobieren, aber sollte doch funzen...

gruß stefan

Die beiden Endschalter gehen zum gleichen Eingang, es wird also nicht zwischen den beiden Schaltern unterschieden. Solang ein Richtungswechsel erfolgt, spielt das ja auch keine Rolle.

Ich würde außer SW-Endschalter auch Endschalter montieren die den Stronkreis des Motors unterbrechen. Die 2. Endschalter einfach etwas tiefer montieren sodaß sie nur bei versagen des Sketches ansprechen.
Grüße Uwe

hi,

dann mußt Du erstmal warten(abfragen), bis beide endschalter wieder auf aus sind, bevor Du sie wieder auf "ein" prüfst. oder nach dem einschalten ein sekündchen warten, bis Du prüfst.

oder schaltest Du mit dem einschalter auch aus? also nicht nur mit den endschaltern? dann wirst Du ohne unterscheidbare endschalter nicht auskommen. kann man nicht beide endschalter an einem analogen port mit veschiedenen widerständen parallel anschließen und so unterscheiden?

gruß stefan

Deine Richtungsvariable sollte vom Typ boolean sein.
Dann kannst du, wenn einer der Endschalter betätigt ist und du den Einschalter betätigst, schreiben ( richtung!=richtung)
Der Einschalter ist hoffentlich ein Taster?!

Diesen Taster musst du dann solange gedrückt halten ( kann auch sw-mässig sein ) bis der Schlitten den Endschalter wieder freigibt. Du musst also die Endschalter für einen kurzen Moment ignorieren...

Von der Siemens LOGO-Steuerung kenne ich eine Funktion die sich "Flankengetriggertes Wischrelais" bzw. Impulsausgabe nennt.

Also genau das, was ich brauche:
Kommt ein Signal an und wird gehalten(wie es bei meinem Endschalter der Fall ist), wird von der Funktion ein Impuls einer definierten Länge ausgegeben und so ein Taster simuliert.

Die Funktion, die ich für die Richtungswechseltaste benutze:

case btnRICHTUNG:
    {
      einaus = 0;
      digitalWrite(rechtslauf,LOW);
      digitalWrite(linkslauf,LOW);
      analogWrite(motoreinaus,0);
      delay(300);

      switch (richtung)
      {
      case 0:
        {
          lcd.clear();
          richtung=1;
          delay(300);
          break;
        }
      case 1:
        {
          lcd.clear();
          richtung=0;
          delay(300);
          break;
        }
      }
      break;
    }

Wie kann ich dafür sorgen, dass diese Funktion nur 1x ausgeführt wird, wenn der Endschalter betätigt ist?