AccelStepper, zwei gleichzeitig, aber wie?

Hallo zusammen,

ich würde gerne in meiner sehr einfach gestrickten loop zwei Stepper "annähernd" simultan fahren lassen, aber irgendwie liegt es wohl an while oder if, dass sie immer nacheinander fahren. Ich hoffe ihr könnt mich bissl unterstützen.

Code

stepper2.moveTo(-300);                            // fahre Schubmotor zur Aufnahme
while (stepper2.currentPosition() != -300) 
stepper2.run();


  
stepper1.moveTo(270);                            // fahre Hülsenmotor zur aufnahme
while (stepper1.currentPosition() != 270)
stepper1.run();

muss ich evtl mit "distancetogo" arbeiten? Aber wie kombiniere ich die beiden Werte?

Sonnige Grüße aus der Oberpfalz

Christian

void fahre()
{
 stepper2.moveTo(-300);                            // fahre Schubmotor zur Aufnahme
 stepper1.moveTo(270);                            // fahre Hülsenmotor zur aufnahme
}


void loop()
{
 stepper2.run();
 stepper1.run();
}

Nach dem "fahre" mal aufgerufen wurde, bewegen sich beide Motoren gleichzeitig in die richtige Position. Die Kontrolle, ob die Position erreicht wurde, muss an anderer Stelle gemacht werden.

Wow, danke.

Brauch ich die Kontrolle überhaupt? Wenn doch der Befehl heißt: fahre 270.

if (stepper1.distanceToGo() != 0)

wäre dies ne Möglichkeit? oder fahren sie dann wieder nacheinander?

Brauch ich die Kontrolle überhaupt?

Das kann ich dir nicht sagen!
Denn ich kenne deine Maschine nicht.

Aber meist darf der nächste Ablauf erst eingeleitet werden, wenn die Position erreicht ist.

while (stepper2.currentPosition() != -300) stepper2.run();

Das blockiert den Sketch: Solange Position noch nicht erreicht, bewege Stepper2, sonst aber mache nichts. Da der Arduino kein Multitasking kennt, muß loop() möglichst blockadefrei programmiert werden.

schiltkamp: Brauch ich die Kontrolle überhaupt?

Was Du brauchst, ist eine Ablaufsteuerung (Schrittsteuerung, endlicher Automat, finite state mashine), oder sogar für jeden Stepper eine. Denn wenn Du die Position erreicht hast, soll sicherlich was passieren. Die einzelnen Schritte einer Ablaufsteuerung (Kohlekran mit KS=Kohleschaufel) als Beispiel:

enum ZUSTAENDE {SucheNull, Anfangsposition, KSrunter, KSschliessen, KSrauf, WKdrehen, WSrunter, WSoeffnen, WSrauf, KKdrehen};

Je nach Anwendung möchte man auch Endschalter und dergleichen abfragen und darauf reagieren.

Die maschine sind nur einfache unabhängige Linearschienen mit stepper.

Aber ich denke folgendes könnte möglich sein.

while ((stepper1.currentPosition() != 270) && (stepper2.currentPosition() != 370)){ stepper1.run(); stepper2.run(); }

Aber vielleicht habe ich auch einen kompletten Denkfehler.

Ohne Abfrage der Position, würde die loop wohl weiter laufen? Dann würde mir eine Position reichen.

Hallo agmue,

Ablaufsteuerung triff den Nagel auf den Kopf. Kannst du mir einen guten Link zum lesen sagen?

Bei mir sieht es ca so aus:

1fahre motor 1 vor 2fahre motor 2 vor 3fahre motor 2 zurück 4fahre motor 1 weiter vor 5relais an 6relais aus 7fahre motor 1 ganz zurück

2 und 3 dürfte gleichzeitig sein. Der Rest alles nacheinander.

schiltkamp: while ((stepper1.currentPosition() != 270) && (stepper2.currentPosition() != 370)){ stepper1.run(); stepper2.run(); } Aber vielleicht habe ich auch einen kompletten Denkfehler.

Leider ja, läuft nur solange, bis einer seine Position erreicht hat. while ist in der EDV (Programm fängt vorne an und hört hinten auf) geeignet, hier in loop() aber nicht. Streiche for, do, while mal vorübergehend aus dem Angebot.

schiltkamp: Ablaufsteuerung triff den Nagel auf den Kopf. Kannst du mir einen guten Link zum lesen sagen?

Einen Link ja, ob er gut ist, mußt Du entscheiden: Anleitung Ein Endlicher Automat entsteht

Anleitung: Endlicher Automat mit millis()

Ich verwende switch/case und kein OOP. Wenn Dich OOP interessiert, schau mal auf das Beispiel von RudiDL5, funktioniert prima.

Aber ich denke folgendes könnte möglich sein.

while ((stepper1.currentPosition() != 270) && (stepper2.currentPosition() != 370)){
stepper1.run();
stepper2.run();
}

Und wieder eine blockierende Schleife! Warum?

Und: Warum folgst du nicht meiner und der Empfehlung der Doku, die beiden *.run() in loop() unterzubringen?

Hier findest du ein Beispiel für eine Schrittkette, die Mutter aller Ablaufsteuerungen. https://forum.arduino.cc/index.php?topic=415229

Ich bemühe mich.

While ist ähnlich einer Zigarette, eine Sucht. Da muss ich erst mal raus kommen.

 // Test gleichzeitig   
fahre();
stepper2.run();
stepper1.run();

if (stepper2.distanceToGo() == 0){  ...

Ich hoffe so. Stepper2 benötigt mehr Zeit.

schiltkamp: While ist ähnlich einer Zigarette, eine Sucht. Da muss ich erst mal raus kommen.

Ging mir nicht anders, allerdings habe ich die Entziehungskur ohne Öffentlichkeit erledigt. Also Du bist nicht alleine :)

Noch ein Link: Steuerung eines Kamerasliders

Langsam wird es Licht

schiltkamp: Bei mir sieht es ca so aus:

1fahre motor 1 vor 2fahre motor 2 vor 3fahre motor 2 zurück 4fahre motor 1 weiter vor 5relais an 6relais aus 7fahre motor 1 ganz zurück

2 und 3 dürfte gleichzeitig sein. Der Rest alles nacheinander.

Bei Dir fehlen hier die Bedingungen. Wenn Du den Arduino mit Strom versorgst, soll sicherlich nichts passieren. Also

  1. Warten bis Startinformation, dann Bewegung starten.
  2. Warten bis Position1 erreicht, dann ...

und so weiter.