Zwei Schrittmotoren mit Motor Shield V2.0 unabhängig voneinander steuern

Hi,

ich versuche mit 2 bipolaren Schrittmotoren eine Regelung für Warm- und Kaltwasser zu erstellen. Zur Steuerung verwende ich das Adafruit Motor Shield V2.0 und einen Arduino Uno.
Ich würde gerne mit beiden Motoren gleichzeitig auf unterschiedliche Positionen fahren. Mit der Adafruit_MotorShield()-Libary kann ich die Motoren allerdings nur nacheinander verfahren. Bei meiner Recherche bin ich auf die AccelStepper-Libary gestoßen, welche ich allerdings nicht ganz verstehe und ich nichts damit zum drehen bekomme.

Hat jemand ein Tipp wie man das grundsätzlich umsetzen könnte?

#include <Wire.h>
#include <Adafruit_MotorShield.h>

int SPU = 48;                                              //Schritte pro Umdrehung

Adafruit_MotorShield AFMS = Adafruit_MotorShield();         //Erstelle Motorshield

Adafruit_StepperMotor *Motor1 = AFMS.getStepper(SPU, 1);   //Erstelle Schrittmotor (Schritte pro Umdrehung, Anschluss 1 oder 2)
Adafruit_StepperMotor *Motor2 = AFMS.getStepper(SPU, 2);


void setup() {
  Serial.begin(9600);           
  Serial.println("Stepper test!");

  AFMS.begin();                                             // create with the default frequency 1.6KHz
  //AFMS.begin(1000);                                       // OR with a different frequency, say 1KHz
  
  Motor1->setSpeed(100);                                   // Motorgeschwindigkeit ... Umdrehungen pro Minute  
  Motor2->setSpeed(100);   
}

void loop() {
  if (Serial.available())
  {
    int RX = Serial.read();
    Serial.println(RX);
    if (RX == 49)                                      //bei Eingabe 1: 1 Umdrehung im Uhrzeigersinn
    {
      Serial.println("Clockwise");
      for (int i = 0; i<SPU; i++)
      {
      Motor1->onestep(FORWARD, DOUBLE);
      Motor2->onestep(FORWARD, DOUBLE);
      delay(10); 
      }
    }
    else if (RX == 50)                                 //bei Eingabe 2: 1 Umdrehung gegen den Uhrzeigersinn
    {
      Serial.println("Counterclockwise");
      for (int i = 0; i<SPU; i++)
      {
      Motor1->onestep(BACKWARD, SINGLE);
      Motor2->onestep(BACKWARD, SINGLE);
      delay(10); 
      }
    }
  }
}

Mit dem Code drehen sich die Motoren zumindest schonmal Optisch gleichzeitig, aber unterschiedliche Positionen kann ich so nicht anfahren.

HaubnerJ:
Mit der Adafruit_MotorShield()-Libary kann ich die Motoren allerdings nur nacheinander verfahren.

Bist Du sicher? Was passiert bei:

Motor1->step(100, FORWARD, SINGLE);
Motor2->step(150, FORWARD, SINGLE);

Schon getestet. Dann bewegt sich zuerst Motor1 um 100 Schritte und dann Motor2 um 150 Schritte.

Adafruit schreibt: “The step() function is synchronous and does not return until all steps are complete.”

Aber auch: “The oneStep() function is a low-level internal function called by step(). But it can be useful to call on its own to implement more advanced functions such as acceleration or coordinating simultaneous movement of multiple stepper motors.”

Was macht dies:

#include <Wire.h>
#include <Adafruit_MotorShield.h>

int schritte;

Adafruit_MotorShield AFMS = Adafruit_MotorShield();         //Erstelle Motorshield

Adafruit_StepperMotor *Motor1 = AFMS.getStepper(SPU, 1);   //Erstelle Schrittmotor (Schritte pro Umdrehung, Anschluss 1 oder 2)
Adafruit_StepperMotor *Motor2 = AFMS.getStepper(SPU, 2);


void setup() {
  Serial.begin(9600);
  Serial.println("Stepper test!");

  AFMS.begin();                                             // create with the default frequency 1.6KHz
  //AFMS.begin(1000);                                       // OR with a different frequency, say 1KHz

  Motor1->setSpeed(100);                                   // Motorgeschwindigkeit ... Umdrehungen pro Minute
  Motor2->setSpeed(100);
}

void loop() {
  if (schritte < 100) Motor1->onestep(FORWARD, DOUBLE);
  if (schritte < 150) {
    Motor2->onestep(FORWARD, DOUBLE);
    schritte++;
  }
  delay(10);
}

Aber auch: “If you want to have more of a ‘background task’ stepper control, check out AccelStepper library (install similarly to how you did with Adafruit_MotorShield) which has some examples for controlling three steppers simultaneously with varying acceleration.”

Hast Du schon mal AFMotor_MultiStepper.pde von AccelStepper probiert?

Okay, also dein Beispiel funktioniert schon einmal wie es soll. Danke. Mal schauen ob ich das in meinem Programm dann auch so umgesetzt bekomme. Denke das wird mit dieser Variante etwas schwerer/umfangreicher, da ich die Werte mit Formeln berechnen muss.

Das MultiStepper Beispiel ist noch auf dem Stand des MotorShield V1, weshalb ich es für das MotorShield V2 folgendermaßen umgeschrieben habe:

#include <AccelStepper.h>
#include <Adafruit_MotorShield.h>

Adafruit_MotorShield AFMS = Adafruit_MotorShield(); 

const int SPU = 48;
// two stepper motors one on each port
Adafruit_StepperMotor *motor1 = AFMS.getStepper(SPU, 1);
Adafruit_StepperMotor *motor2 = AFMS.getStepper(SPU, 2);

// you can change these to DOUBLE or INTERLEAVE or MICROSTEP!
// wrappers for the first motor!
void forwardstep1() {  
  motor1->onestep(FORWARD, SINGLE);
}
void backwardstep1() {  
  motor1->onestep(BACKWARD, SINGLE);
}
// wrappers for the second motor!
void forwardstep2() {  
  motor2->onestep(FORWARD, SINGLE);
}
void backwardstep2() {  
  motor2->onestep(BACKWARD, SINGLE);
}

// Motor shield has two motor ports, now we'll wrap them in an AccelStepper object
AccelStepper stepper1(forwardstep1, backwardstep1);
AccelStepper stepper2(forwardstep2, backwardstep2);

void setup()
{  
    stepper1.setMaxSpeed(200.0);
    stepper1.setAcceleration(100.0);
    stepper1.moveTo(24);
    
    stepper2.setMaxSpeed(300.0);
    stepper2.setAcceleration(100.0);
    stepper2.moveTo(1000000);
    
}

void loop()
{
    // Change direction at the limits
    if (stepper1.distanceToGo() == 0)
	stepper1.moveTo(-stepper1.currentPosition());
    stepper1.run();
    stepper2.run();
}

Ich wüsste nicht, was für einen Fehler ich gemacht haben könnte, aber bei mir tut sich nichts. :frowning: