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);
}
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.
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
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.
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 . 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 - einfache und komplizierte ...