Pages: [1]   Go Down
Author Topic: Endschalter programmieren  (Read 1203 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 43
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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):

Code:
    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);
      }
    }

Code:
  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.
Logged

Wien
Offline Offline
Edison Member
*
Karma: 23
Posts: 1664
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 43
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 236
Posts: 20273
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Wien
Offline Offline
Edison Member
*
Karma: 23
Posts: 1664
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Full Member
***
Karma: 2
Posts: 213
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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...


Logged

It's not my fault when my Posts are full of Errors. This stupid autocorrection from my browser is set up for german grammar.

Offline Offline
Newbie
*
Karma: 0
Posts: 43
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:

Code:
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?
Logged

Pages: [1]   Go Up
Jump to: