If Abfrage in for Schleife: Ausgang soll immer dann auf HIGH schalten, wenn anderer Ausgang gerade auf LOW steht

Guten Abend,
ich betreibe einen Schrittmotor, der eine Welle immer um einen Schritt dreht und dann kurz stehen bleibt. Dies für eine komplette Drehung immer so weiter. Während dieser Stillstandsphase will ich ein Relais schalten.
Allerdings bekomme ich es noch nicht hin, dass das Relais immer dann schaltet, wenn der Motor steht, also bei (PUL, LOW).

Mit diesem beigefügten Code, schaltet das Relais am Anfang einmal und bleibt an. Ich muss die If-Abfrage irgendwie in die for Schleife einbinden oder? So wie es jetzt ist, wird die If Abfrage anscheinend nur einmal aufgerufen. Sie soll aber immer bei (PUL,LOW) das Relais auf HIGH schalten. Am liebsten wäre es mir sogar, wenn das Relais in der Mitte der (PUL,LOW) Phase schaltet, aber alles nach einander.

Danke im Voraus für die Hilfestellungen.

int DIR=4;
int PUL=5;
int ENA=6;
int Schritte;
float w;
int Relais=8;
int SchrittmotorStatus;


void setup()
{
Serial.begin(9600);

pinMode(DIR,OUTPUT); //Direction
pinMode(PUL,OUTPUT); //Puls
pinMode(ENA,OUTPUT); //Enable
pinMode(Relais,OUTPUT);

digitalWrite(ENA,LOW);
}

void loop()
{


digitalWrite(DIR,LOW); //Drehung im Uhrzeigersinn

for(Schritte= 1, w=1.8; Schritte <201; Schritte++, w+=1.8) //Schleife: 200Schritte/360° Drehung
{

SchrittmotorStatus = digitalRead(PUL);
if (SchrittmotorStatus==LOW)
digitalWrite(Relais, HIGH);
else
digitalWrite(Relais,LOW);

Serial.print("Schritt: ");
Serial.print(Schritte);
Serial.print(" Winkel: ");
Serial.print(w);
Serial.println("°");

digitalWrite(PUL,HIGH);
delay(300);
digitalWrite(PUL,LOW);
delay(300);

}
delay(500);
}

:slight_smile: (Du bist zu schnell für mich)

    SchrittmotorStatus = digitalRead(PUL);// <<<<<---+
    if (SchrittmotorStatus == LOW)  //               ^
      digitalWrite(Relais, HIGH);   //               |
    else                            //               |
      digitalWrite(Relais, LOW);    //               |
                                    //               ^
    Serial.print("Schritt: ");      //               |
    Serial.print(Schritte);         //               |
    Serial.print(" Winkel: ");      //               |
    Serial.print(w);                //               ^
    Serial.println("°");            //               |
                                    //               |
    digitalWrite(PUL, HIGH);        //               |
    delay(300);                     //               ^
    digitalWrite(PUL, LOW);         // >>>>>>>>>>>---+
    delay(300);

das verstehe ich nicht ganz, kannst du es nochmal erklären..

Achso die If Abfrage kommt bevor Pul überhaubt geschaltet wird ?

Aber wenn ich die If Abfrage nach dem schalten des PUL setzte, hindert das delay am schalten des Relais?

Das Delay ist also das Problem

Wenn ich seperate Funktionen erstelle, wie verknüpfe ich die, sodass das Ralais immer bei (PUL, LOW) auf HIGH geschaltet wird
Mit mehreren Funktionen habe ich noch nicht gearbeitet

Danke für deinen konkreten Lösungsvorschlag.
Ich habe es dirket getestet.
Das Relais schaltet zu Beginn und bleibt die 201 Schritte geschaltet und geht erst am Ende des Stillstands des Motors wieder aus. Also schaltet in den 201 Schritte nur einmal obwohl es 201 mal schalten soll.

Ich versuche mich mal in den Code reinzuhängen

und der Motor hat seine Geschwindigkeit geändert und dreht sich jetzt ziemlich schnell

So ganz verstehe ich nicht, was Du wirklich willst. Willst Du das Relais wirklich im Takt der Schritte ein ausschalten? Das wäre dann 300ms ein und 300ms aus? Das ist ganz schön schnell für ein normales Relais. Und wenn Du das tatsächlich so willst, warum schaltest Du es nicht einfach zusamen mit PUL ein und aus?

Genau ich möchte mit einem Schrittmotor eine Welle ganz langsam um einen definierten Winkel drehen und diese vermessen. Immer bei Stillstand soll über das Relais ein Messinterface geschaltet werden, wodurch eine Messuhr einen Hubwert in mm abliest. Da ich den Messwert im Stillstand aufnehmen möchte, soll es also bei (PUL,LOW) geschehen

Über (PUL,HIGH) habe ich es schon geschafft, indem ich das Puls Signal einfach abgezapft habe und auf das Relais geleitet habe aber dann wird immer ein Messwert mit der Messuhr abgelesen, wenn die Welle gerade dreht. Das gefiel mir nicht

Bei dem Versuch das Relais über (PUL,High) zu schalten, hat das Relais die Taktrate mitgemacht. Schafft es das normal nicht?

Na, dann steuer das relais doch einfach invertiert an:

    digitalWrite(PUL, HIGH);        //               |
    digitalWrite(Relais, LOW);
    delay(300);                     //               ^
    digitalWrite(PUL, LOW);         // >>>>>>>>>>>---+    
    digitalWrite(Relais, HIGH);

    delay(300);

Wobei der motor den Schritt ausführt, wenn PUL auf HIGH gesetzt wird. Wie lange er dafür braucht, hängt vom Motor und der zu bewegenden Masse ab, aber nicht von deinem delay(300); nach dem digitalWrite(PUL, HIGH);

Hängt natürlich vom Relais ab und geht evtl. auch auf die Lebensdauer des Relais. Ich weis ja auch nicht, wie oft Du das machst. Und es hängt auch davon ab, was das Relais schalten muss. Evtl. wäre da auf Dauer eine elektronische Schaltstufe besser.

damit funktioniert es tatsächlich.. zu einfach um drauf zu kommen

Ja manchmal denkt man einfach zu kompliziert ,,, :wink: :innocent:

Jaa damit klappt es genauso, wie die Lösung von MircoBahner. Was genau hat dieses "static" jetzt verändert??

Wenn einer dazu kommt, kann man immer noch auf 'ohne delay()' umstellen. aber die einfache zum PUL invertierte Ansteuerung des Relais funktioniert dann auch noch :wink: . Es gibt reichlich Anwendungen, die nie über den 'mit delay()' Zustand hinauskommen ....
Wenn das Relais einen Umschalt-Kontakt hat, könnte man auch einfach den anderen Kontakt nehmen - oder einen HW-Inverter verwenden ... oder ... es führen immer viele Wege nach Rom :sunglasses: - einfache und komplizierte ...

Ich werde noch einen Schalter einbauen, der den ganzen Mechanismus startet. Das sollte aber keine negativen Auswirkungen auf das delay haben oder?

Wohl eher nicht ... nur wenn Du während dem ganzen Ablauf noch was anderes machen willst, müssen die delay() raus.