PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 2 Stepper laufen nicht gleichzeitig



fredyxx
24.05.2016, 12:39
Hallo,

ich versuche 2 Stepper nacheinander anzusteuern und wenn ich M2 durch ein LOW an PIN 2 stoppe, soll M3 laufen bis erneut ein LOW an PIN 2 erschient. Das ist der Code dazu



#include <CustomStepper.h> //Libraryaufruf

CustomStepper stepperM2(4, 5, 6, 7); // Wahl der Ausgänge für den Schrittmotor
CustomStepper stepperM3(8, 9, 10, 11); // Wahl der Ausgänge für den Schrittmotor

boolean M2solldrehen = false; // Variable, die bei true den Motor stoppt; kann beliebig heißen
boolean M3solldrehen = false;
boolean JustPin; // Variable für STOP , wenn LOW
float lzahn2_alt; // Ausfahrlänge von Zahnstange 2 nach Justierung 98
float lzahn3_alt; // Ausfahrlänge von Zahnstange 3 nach Justierung 68


int Motorwahl = 2; // Festlegung welcher Motor justiert werden soll


void setup()
{
Serial.begin (250000);
while (!Serial);

pinMode (2, INPUT);
digitalWrite(2, HIGH); //schaltet den PullUp-Widerstand ein

stepperM2.setRPM(6); // Wahl der Umdrehungen pro Minute
stepperM3.setRPM(12);

stepperM2.setSPR(4096); //Original = 4075.7728395; Wahl der Schritte pro Wellenumdrehung
stepperM3.setSPR(4096);

}

void loop() {

JustPin = digitalRead(2); // übernimmt den Status von PIN 2


//******************** Motor 2 ************************************************** **********

if (stepperM2.isDone() && M2solldrehen == false && Motorwahl == 2 ) { // einleiten des Vorgangs an die Library && Motorwahl == 2

stepperM2.setDirection(CW); // Zahnstange2 einfahren

stepperM2.rotateDegrees(5); //ergibt eine kurze Lauflänge der Zahnstange

if ( JustPin == LOW) { // bei LOW Motor STOP; LOW wegen internem PullUp-Widerstand
M2solldrehen = true; // stoppt den Motor
Motorwahl = 3; // wählt nun Motor 3

}

}


//******************** Motor 3 ************************************************** **********

Serial.print ("Motorwahl = ");
Serial.println (Motorwahl);

if (stepperM3.isDone() && M3solldrehen == false && Motorwahl == 3) { // einleiten des Vorgangs an die Library

Serial.println ("hier");

stepperM3.setDirection(CCW); // Zahnstange2 einfahren

stepperM3.rotateDegrees(5); //ergibt eine kurze Lauflänge der Zahnstange

if ( JustPin == LOW) { // bei LOW Motor STOP; LOW wegen internem PullUp-Widerstand
M3solldrehen = false; // stoppt den Motor
// Motorwahl = 3; // wählt nun Motor 3

}
}

stepperM2.run(); // muss unbedingt sein
stepperM3.run(); // muss unbedingt sein
}



Wenn ich den Teil für M3 unwirksam mache, läuft M2 und umgekehrt. Aber das volle Programm nicht.
Dann wird nur 1 x Pin 4 auf HIGH gesetzt, die Konsole druckt "Motorwahl = 2" , aber nur 1 x und das war's.
d.h. doch, dass das Programm nicht mehr läuft!?


Wieso klappt das in dem folgenden Beispiel mit 2 Motoren und im Original ja sogar mit 4en?



#include <CustomStepper.h>


CustomStepper stepper_VL(4, 5, 6, 7);
//CustomStepper stepper_HL(8,9,10,11);
CustomStepper stepper_HR(8, 9, 10, 11);
//CustomStepper stepper_VR(46, 48, 50, 52);


boolean rotate_li;
boolean rotate_deg_li;
boolean rotate_re;
boolean rotate_deg_re;
boolean vorwaerts;
boolean rueckwaerts;

void setup()
{

rotate_li = false;
rotate_deg_li = false;
rotate_re = false;
rotate_deg_re = false;
vorwaerts = false;
rueckwaerts = false;


}

void loop()
{

if (stepper_VL.isDone() && rueckwaerts == false)
{
alle_stepper_rueckwaerts();

}

if (stepper_VL.isDone() && rueckwaerts == true && rotate_li == false)
{
rotieren_links();
}

if (stepper_VL.isDone() && rotate_li == true && vorwaerts == false)
{
alle_stepper_vorwaerts();

}

if (stepper_VL.isDone() && vorwaerts == true && rotate_re == false)
{
rotieren_rechts();
}

if (stepper_VL.isDone() && rotate_re == true && vorwaerts == true)
{
alle_stepper_vorwaerts();
}

stepper_VL.run();
// stepper_HL.run();
stepper_HR.run();
// stepper_VR.run();

}

/************************************************** *********/

void alle_stepper_vorwaerts()
{
stepper_VL.setRPM(12);
// stepper_HL.setRPM(12);
stepper_HR.setRPM(12);
// stepper_VR.setRPM(12);

stepper_VL.setSPR(4075.7728395);
// stepper_HL.setSPR(4075.7728395);
stepper_HR.setSPR(4075.7728395);
// stepper_VR.setSPR(4075.7728395);

stepper_VL.setDirection(CW);
stepper_VL.rotate(2);
// stepper_HL.setDirection(CW);
// stepper_HL.rotate(2);
stepper_HR.setDirection(CW);
stepper_HR.rotate(2);
// stepper_VR.setDirection(CW);
// stepper_VR.rotate(2);
vorwaerts = true;
}

void alle_stepper_rueckwaerts()
{
stepper_VL.setRPM(12);
// stepper_HL.setRPM(12);
stepper_HR.setRPM(12);
// stepper_VR.setRPM(12);

stepper_VL.setSPR(4075.7728395);
// stepper_HL.setSPR(4075.7728395);
stepper_HR.setSPR(4075.7728395);
// stepper_VR.setSPR(4075.7728395);

stepper_VL.setDirection(CCW);
stepper_VL.rotate(2);
// stepper_HL.setDirection(CCW);
// stepper_HL.rotate(2);
stepper_HR.setDirection(CCW);
stepper_HR.rotate(2);
// stepper_VR.setDirection(CCW);
// stepper_VR.rotate(2);
rueckwaerts = true;
}

void rotieren_links()
{
stepper_VL.setRPM(12);
// stepper_HL.setRPM(12);
stepper_HR.setRPM(12);
// stepper_VR.setRPM(12);

stepper_VL.setSPR(4075.7728395);
// stepper_HL.setSPR(4075.7728395);
stepper_HR.setSPR(4075.7728395);
// stepper_VR.setSPR(4075.7728395);

stepper_VL.setDirection(CCW);
stepper_VL.rotate(2);
// stepper_HL.setDirection(CCW);
// stepper_HL.rotate(2);
stepper_HR.setDirection(CW);
stepper_HR.rotate(2);
// stepper_VR.setDirection(CW);
// stepper_VR.rotate(2);
rotate_li = true;
}


void rotieren_rechts()
{
stepper_VL.setRPM(12);
// stepper_HL.setRPM(12);
stepper_HR.setRPM(12);
// stepper_VR.setRPM(12);

stepper_VL.setSPR(4075.7728395);
// stepper_HL.setSPR(4075.7728395);
stepper_HR.setSPR(4075.7728395);
// stepper_VR.setSPR(4075.7728395);



Gruß fredyxx

fredyxx
24.05.2016, 22:56
Hallo,

ich habe 2 Lösungen gefunden, vermag aber nicht zu sagen, ob die einigermaßen elegant sind.
Ich kann auch nicht erklären, wieso die obige Version nicht funktioniert.

Eine wesentliche Änderung ist, dass der Befehl " stepperM3.run();" erst dann durchlaufen werden darf, wenn die Aktion von Motor 2 beendet ist !!

Gruß

fredyxx