Control 8 steppers with Adafruit Motorshield

Post here about your Arduino projects, get help - for Adafruit customers!

Moderators: adafruit_support_bill, adafruit

Please be positive and constructive with your questions and comments.
Locked
User avatar
JulieNoa
 
Posts: 7
Joined: Wed Jul 14, 2021 4:03 am

Control 8 steppers with Adafruit Motorshield

Post by JulieNoa »

I am controlling 8 stepper motors (these ones: https://www.adafruit.com/product/918) with an adafruit motorshield v2. I want them to move separately and also all at the same time (ideally a timeline like this: two motors move for a few seconds, then one keeps on moving the other stops. Three other motors start to move. Then all eight motors move , and after a few seconds they all stop. Etc.). I got some code from the examples, but I know this is not the right way to do it (using AccelStep and delay for example). I post it below. Do I need something like millis? And how do I implement that exactly?

Thank a lot for your help.

Code: Select all

// Shows how to run three Steppers at once with varying speeds
//
// Requires the Adafruit_Motorshield v2 library 
//   https://github.com/adafruit/Adafruit_Motor_Shield_V2_Library
// And AccelStepper with AFMotor support 
//   https://github.com/adafruit/AccelStepper

// This tutorial is for Adafruit Motorshield v2 only!
// Will not work with v1 shields

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

Adafruit_MotorShield AFMStop(0x60); // Motorboard 1
Adafruit_MotorShield AFMSbota(0x61); // Motorboard 2
Adafruit_MotorShield AFMSbotb(0x71); // Motorboard 3
Adafruit_MotorShield AFMSbotc(0x68); // Motorboard 4

Adafruit_StepperMotor *myStepper1 = AFMStop.getStepper(2052, 1);
Adafruit_StepperMotor *myStepper2 = AFMStop.getStepper(2052, 2);
Adafruit_StepperMotor *myStepper3 = AFMSbota.getStepper(2052, 1);
Adafruit_StepperMotor *myStepper4 = AFMSbota.getStepper(2052, 2);
Adafruit_StepperMotor *myStepper5 = AFMSbotb.getStepper(2052, 1);
Adafruit_StepperMotor *myStepper6 = AFMSbotb.getStepper(2052, 2);
Adafruit_StepperMotor *myStepper7 = AFMSbotc.getStepper(2052, 1);
Adafruit_StepperMotor *myStepper8 = AFMSbotc.getStepper(2052, 2);

// you can change these to DOUBLE or INTERLEAVE or MICROSTEP!

void forwardstep1() {  
  myStepper1->onestep(FORWARD, SINGLE);
}
void backwardstep1() {  
  myStepper1->onestep(BACKWARD, SINGLE);
}
void forwardstep2() {  
  myStepper2->onestep(FORWARD, SINGLE);
}
void backwardstep2() {  
  myStepper2->onestep(BACKWARD, SINGLE);
}
void forwardstep3() {  
  myStepper3->onestep(FORWARD, SINGLE);
}
void backwardstep3() {  
  myStepper3->onestep(BACKWARD, SINGLE);
}
void forwardstep4() {  
  myStepper4->onestep(FORWARD, SINGLE);
}
void backwardstep4() {  
  myStepper4->onestep(BACKWARD, SINGLE);
}
void forwardstep5() {  
  myStepper5->onestep(FORWARD, SINGLE);
}
void backwardstep5() {  
  myStepper5->onestep(BACKWARD, SINGLE);
}
void forwardstep6() {  
  myStepper6->onestep(FORWARD, SINGLE);
}
void backwardstep6() {  
  myStepper6->onestep(BACKWARD, SINGLE);
}
void forwardstep7() {  
  myStepper7->onestep(FORWARD, SINGLE);
}
void backwardstep7() {  
  myStepper7->onestep(BACKWARD, SINGLE);
}
void forwardstep8() {  
  myStepper8->onestep(FORWARD, SINGLE);
}
void backwardstep8() {  
  myStepper8->onestep(BACKWARD, SINGLE);
}



// Now we'll wrap the 3 steppers in an AccelStepper object
AccelStepper stepper1(forwardstep1, backwardstep1);
AccelStepper stepper2(forwardstep2, backwardstep2);
AccelStepper stepper3(forwardstep3, backwardstep3);
AccelStepper stepper4(forwardstep4, backwardstep4);
AccelStepper stepper5(forwardstep5, backwardstep5);
AccelStepper stepper6(forwardstep6, backwardstep6);
AccelStepper stepper7(forwardstep7, backwardstep7);
AccelStepper stepper8(forwardstep8, backwardstep8);
MultiStepper steppers;


void setup()
{  
  Serial.begin(9600);
  AFMSbota.begin(); // Start the bottom shield
  AFMStop.begin(); // Start the top shield
  AFMSbotb.begin(); // Start the bottom shield
  AFMSbotc.begin(); // Start the bottom shield
   
  stepper1.setMaxSpeed(500.0);
  
  stepper2.setMaxSpeed(500.0);

  stepper3.setMaxSpeed(500.0);

  stepper4.setMaxSpeed(500.0);
 
  stepper5.setMaxSpeed(500.0);

  stepper6.setMaxSpeed(500.0);

  stepper7.setMaxSpeed(500.0);

  stepper8.setMaxSpeed(500.0);
  steppers.addStepper(stepper1);
  steppers.addStepper(stepper2);
   steppers.addStepper(stepper3);
  steppers.addStepper(stepper4);
   steppers.addStepper(stepper5);
  steppers.addStepper(stepper6);
   steppers.addStepper(stepper7);
  steppers.addStepper(stepper8);

 
}

void loop()
{

long positions[8]; // Array of desired stepper positions
  myStepper1->step(800, FORWARD, SINGLE);
myStepper1->release();
delay(10);

    myStepper2->step(1000, BACKWARD, SINGLE);
myStepper2->release();
delay(10);
myStepper1->step(800, FORWARD, SINGLE);
myStepper1->release();
delay(10);


     positions[7] = 100;
  positions[6] = -300;
      positions[5] = 200;
  positions[4] = -100;
     positions[3] = 500;
  positions[2] = -300;
     positions[1] = 400;
  positions[0] = -400;
  steppers.moveTo(positions);
  steppers.runSpeedToPosition(); // Blocks until all are in position
 
myStepper1->release();
myStepper2->release();
myStepper3->release();
myStepper4->release();
myStepper5->release();
myStepper6->release();
myStepper7->release();
myStepper8->release();
 delay(300);
      positions[7] = -600;
  positions[6] = 600;
      positions[5] = 800;
  positions[4] = -300;
     positions[3] = 1200;
  positions[2] = 1300;
     positions[1] = -500;
  positions[0] = -700;
  steppers.moveTo(positions);
  steppers.runSpeedToPosition(); // Blocks until all are in position
 
myStepper1->release();
myStepper2->release();
myStepper3->release();
myStepper4->release();
myStepper5->release();
myStepper6->release();
myStepper7->release();
myStepper8->release();
 delay(300);

  
 
}

User avatar
adafruit_support_bill
 
Posts: 88040
Joined: Sat Feb 07, 2009 10:11 am

Re: Control 8 steppers with Adafruit Motorshield

Post by adafruit_support_bill »

See the Accel_MultiStepper example in the library: https://github.com/adafruit/Adafruit_Mo ... tepper.ino

User avatar
JulieNoa
 
Posts: 7
Joined: Wed Jul 14, 2021 4:03 am

Re: Control 8 steppers with Adafruit Motorshield

Post by JulieNoa »

Thanks a lot for your quick reply. I know that example, but I do not understand how to get them to other positions, stop etc. When I run this example, they are just moving back and forward, and I want them to stop. Should I work with different kinds of ifs? And can I stop / release the motors as well?

User avatar
adafruit_support_bill
 
Posts: 88040
Joined: Sat Feb 07, 2009 10:11 am

Re: Control 8 steppers with Adafruit Motorshield

Post by adafruit_support_bill »

In the setup, you tell the motor how to make the first move:

Code: Select all

  stepper1.setMaxSpeed(100.0);
  stepper1.setAcceleration(100.0);
  stepper1.moveTo(24);
Then in your loop, when it gets to the end of the move, you tell it what you want it to do next:

Code: Select all

    if (stepper1.distanceToGo() == 0)
	stepper1.moveTo(-stepper1.currentPosition());
If you just want it to stop, you don't need to do anything. It will stop when distanceToGo is zero.

User avatar
JulieNoa
 
Posts: 7
Joined: Wed Jul 14, 2021 4:03 am

Re: Control 8 steppers with Adafruit Motorshield

Post by JulieNoa »

Thanks a lot for this explanation. I have a few other questions: if I want to stop all motors for a certain amount of time, how do I do that? I need to tell them in sole way for how much time they should stop. And my steppers get really hot. Can I release them also with this code?

User avatar
adafruit_support_bill
 
Posts: 88040
Joined: Sat Feb 07, 2009 10:11 am

Re: Control 8 steppers with Adafruit Motorshield

Post by adafruit_support_bill »

if I want to stop all motors for a certain amount of time, how do I do that?
Each motor will stop when its distanceToGo() reaches zero. Or if you stop calling the run() function. You can use the millis() function to time how long you before you start them moving again.
And my steppers get really hot. Can I release them also with this code?
AccelStepper does not support a release() function. But you can call the release function on the underlying Adafruit_StepperMotor object. e.g.,

Code: Select all

myStepper1->release();

User avatar
JulieNoa
 
Posts: 7
Joined: Wed Jul 14, 2021 4:03 am

Re: Control 8 steppers with Adafruit Motorshield

Post by JulieNoa »

This is really helpful! I am going to try all this. Many thanks for your help.

Locked
Please be positive and constructive with your questions and comments.

Return to “Arduino”