Accel Stepper help

Adafruit Ethernet, Motor, Proto, Wave, Datalogger, GPS Shields - etc!

Moderators: adafruit_support_bill, adafruit

Please be positive and constructive with your questions and comments.
Locked
User avatar
mdesrocher
 
Posts: 5
Joined: Wed Sep 24, 2014 5:28 pm

Accel Stepper help

Post by mdesrocher »

Hello,

Like many people I am really new to programming and doing anything like this, so please bear with me. I have a project in which I turn 3 steppers.
I am using Arduino mega with 3 motorshields and 4dsystems 43pt touch screen. I have already got the system working the way I want, but now I would like to turn all 3 steppers at the same time, obviously having to use Accel Stepper library. My question is there a simple way I can implement Accel Stepper into my current code? Or should I basically just start from scratch with Accel Stepper since my code is so dumbed down? I started putting in everything for Accel Stepper but then stopped when It came to the actual stepping functions. Thank you in advance for any type of help.

Code: Select all

#include <EEPROM.h>
#include <AccelStepper.h>
#include <Wire.h>
#include "utility/Adafruit_PWMServoDriver.h"
#include <Adafruit_MotorShield.h>

#include <genieArduino.h>
 
Adafruit_MotorShield AFMSbot(0x64);
Adafruit_MotorShield AFMSmid(0x62);
Adafruit_MotorShield AFMStop(0x61);


Adafruit_StepperMotor *myStepper1 = AFMSbot.getStepper(200, 1);
Adafruit_StepperMotor *myStepper2 = AFMSmid.getStepper(200, 1);
Adafruit_StepperMotor *myStepper3 = AFMStop.getStepper(200, 1);

void forwardstep1() {  
  myStepper1->onestep(FORWARD, DOUBLE);
}
void backwardstep1() {  
  myStepper1->onestep(BACKWARD, DOUBLE);
}
// wrappers for the second motor!
void forwardstep2() {  
  myStepper2->onestep(FORWARD, DOUBLE);
}
void backwardstep2() {  
  myStepper2->onestep(BACKWARD, DOUBLE);
}
// wrappers for the third motor!
void forwardstep3() {  
  myStepper3->onestep(FORWARD, DOUBLE);
}
void backwardstep3() {  
  myStepper3->onestep(BACKWARD, DOUBLE);
}

// Now we'll wrap the 3 steppers in an AccelStepper object
AccelStepper stepper1(forwardstep1, backwardstep1);
AccelStepper stepper2(forwardstep2, backwardstep2);
AccelStepper stepper3(forwardstep3, backwardstep3);

int terrain = 0 ;
int fuel = 1 ;
byte tpress;
byte fpress;
int flag;

Genie genie;
#define RESETLINE A10  
void setup()
{
  
  Serial1.begin(200000);  
  genie.Begin(Serial1);    

  genie.AttachEventHandler(myGenieEventHandler); 
  pinMode(RESETLINE, OUTPUT);  
  digitalWrite(RESETLINE, 0);  
  delay(100);
  digitalWrite(RESETLINE, 1);  

  delay (5000); 

  
  genie.WriteContrast(10); 

  genie.WriteStr(0, GENIE_VERSION);
  
  AFMSbot.begin(); 
  AFMSmid.begin();
  AFMStop.begin();
  
  stepper1.setMaxSpeed(100.0);
  stepper1.setAcceleration(100.0);
  stepper1.moveTo(1050);
    
  stepper2.setMaxSpeed(100.0);
  stepper2.setAcceleration(100.0);
  stepper2.moveTo(1050);

  stepper3.setMaxSpeed(100.0);
  stepper3.setAcceleration(100.0);
  stepper3.moveTo(1050); 

}

void loop()
{
  
  tpress = EEPROM.read(terrain);
  fpress = EEPROM.read(fuel);
  genie.DoEvents(); 

 
}


void myGenieEventHandler(void)
{
  genieFrame Event;
  genie.DequeueEvent(&Event);

  
  if (Event.reportObject.cmd == GENIE_REPORT_EVENT)
  
   if(Event.reportObject.object == GENIE_OBJ_4DBUTTON)
   {
  
     
     
     //*******************THIS IS WHERE I STOPPED IMPLEMENTING THE ACCEL_STEPPER......
  
  
  
     if (Event.reportObject.index == 2)
  {
      stepper1->step(1050, BACKWARD, DOUBLE);
      stepper1->release();
  } 
   if (Event.reportObject.index == 3)
  {
      myStepper1->step(1050, FORWARD, DOUBLE);
      myStepper1->release();
  } 
   if (Event.reportObject.index == 4)
  {
      myStepper2->step(1050, BACKWARD, DOUBLE);
      myStepper2->release();
  } 
   if (Event.reportObject.index == 5)
  {
      myStepper2->step(1050, FORWARD, DOUBLE);
      myStepper2->release();
  } 
   if (Event.reportObject.index == 6)
  {
      myStepper3->step(1050, BACKWARD, DOUBLE);
      myStepper3->release();
  } 
   if (Event.reportObject.index == 7)
  {
      myStepper3->step(1050, FORWARD, DOUBLE);
      myStepper3->release();
  } 
   if (Event.reportObject.index == 9)
  {
    EEPROM.write(0,0);
    EEPROM.write(1,0);
      
  } 
  
  
   }
      
        
   if (Event.reportObject.object == GENIE_OBJ_USERBUTTON)                
    {
      if (Event.reportObject.index == 3)                              
     
     {
        
        if(tpress==1)
        {
        genie.WriteObject(GENIE_OBJ_FORM, 3, 0);
        myStepper1->step(1050, FORWARD, DOUBLE);
        myStepper1->release();
        myStepper2->step(1050, FORWARD, DOUBLE);
        myStepper2->release();
        myStepper3->step(1050, FORWARD, DOUBLE);
        myStepper3->release();
        EEPROM.write(0,0);
        genie.WriteObject(GENIE_OBJ_FORM, 2, 0);
        }
       else if(tpress==2)
        {
        genie.WriteObject(GENIE_OBJ_FORM, 3, 0);
        myStepper1->step(2100, FORWARD, DOUBLE);
        myStepper1->release();
        myStepper2->step(2100, FORWARD, DOUBLE);
        myStepper2->release();
        myStepper3->step(2100, FORWARD, DOUBLE);
        myStepper3->release();
        EEPROM.write(0,0);
        genie.WriteObject(GENIE_OBJ_FORM, 2, 0);
        
        }
       else if(tpress==0)
        {
        genie.WriteObject(GENIE_OBJ_FORM, 3, 0);
        EEPROM.write(0,0);
        genie.WriteObject(GENIE_OBJ_FORM, 2, 0);
        
          
        }
        
        
       
          
   }
       
      if (Event.reportObject.index == 4)                              
      {
          if(tpress==0)
        {
        myStepper1->step(1050, BACKWARD, DOUBLE);
        myStepper1->release();
        myStepper2->step(1050, BACKWARD, DOUBLE);
        myStepper2->release();
        myStepper3->step(1050, BACKWARD, DOUBLE);
        myStepper3->release();
        EEPROM.write(0,1);
        
        }
       else if(tpress==2)
        {
        myStepper1->step(1050, FORWARD, DOUBLE);
        myStepper1->release();
        myStepper2->step(1050, FORWARD, DOUBLE);
        myStepper2->release();
        myStepper3->step(1050, FORWARD, DOUBLE);
        myStepper3->release();
        EEPROM.write(0,1);
        
        }
       else if(tpress==1)
        {
        EEPROM.write(0,1);
        }
        
       }
      if (Event.reportObject.index == 5)                              
      {
         if(tpress==0)
        {
        myStepper1->step(2100, BACKWARD, DOUBLE);
        myStepper1->release();
        myStepper2->step(2100, BACKWARD, DOUBLE);
        myStepper2->release();
        myStepper3->step(2100, BACKWARD, DOUBLE);
        myStepper3->release();
        EEPROM.write(0,2);
        
        }
       else if(tpress==1)
        {
        myStepper1->step(1050, BACKWARD, DOUBLE);
        myStepper1->release();
        myStepper2->step(1050, BACKWARD, DOUBLE);
        myStepper2->release();
        myStepper3->step(1050, BACKWARD, DOUBLE);
        myStepper3->release();
        EEPROM.write(0,2);
        }
       else if(tpress==2)
        {
        EEPROM.write(0,2);
        }
        
       }
  

   if (Event.reportObject.index == 0)                              
      {
        
        if(fpress==1)
        {
        myStepper1->step(1050, BACKWARD, DOUBLE);
        myStepper1->release();
        myStepper2->step(1050, BACKWARD, DOUBLE);
        myStepper2->release();
        myStepper3->step(1050, BACKWARD, DOUBLE);
        myStepper3->release();
        EEPROM.write(1,0);
        }
       else if(fpress==2)
        {
        myStepper1->step(2100, BACKWARD, DOUBLE);
        myStepper1->release();
        myStepper2->step(2100, BACKWARD, DOUBLE);
        myStepper2->release();
        myStepper3->step(2100, BACKWARD, DOUBLE);
        myStepper3->release();
        EEPROM.write(1,0);
        }
       else if(fpress==0)
        {
        EEPROM.write(1,0);
        }
        
        
       
          
   }
      if (Event.reportObject.index == 1)                              
      {
          if(fpress==0)
        {
        myStepper1->step(1050, FORWARD, DOUBLE);
        myStepper1->release();
        myStepper2->step(1050, FORWARD, DOUBLE);
        myStepper2->release();
        myStepper3->step(1050, FORWARD, DOUBLE);
        myStepper3->release();
        EEPROM.write(1,1);
        }
       else if(fpress==2)
        {
        myStepper1->step(1050, BACKWARD, DOUBLE);
        myStepper1->release();
        myStepper2->step(1050, BACKWARD, DOUBLE);
        myStepper2->release();
        myStepper3->step(1050, BACKWARD, DOUBLE);
        myStepper3->release();
        EEPROM.write(1,1);
        }
       else if(fpress==1)
        {
        EEPROM.write(1,1);
        }
        
       }
      if (Event.reportObject.index == 2)                              
      {
         if(fpress==0)
        {
        myStepper1->step(2100, FORWARD, DOUBLE);
        myStepper1->release();
        myStepper2->step(2100, FORWARD, DOUBLE);
        myStepper2->release();
        myStepper3->step(2100, FORWARD, DOUBLE);
        myStepper3->release();
        EEPROM.write(1,2);
        }
       else if(fpress==1)
        {
        myStepper1->step(1050, FORWARD, DOUBLE);
        myStepper1->release();
        myStepper2->step(1050, FORWARD, DOUBLE);
        myStepper2->release();
        myStepper3->step(1050, FORWARD, DOUBLE);
        myStepper3->release();
        EEPROM.write(1,2);
        }
       else if(fpress==2)
        {
        EEPROM.write(1,2);
        }
        
       }
  }
}

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

Re: Accel Stepper help

Post by adafruit_support_bill »

Please explain what you want the system to do: What triggers motor movements and how they should move.

User avatar
mdesrocher
 
Posts: 5
Joined: Wed Sep 24, 2014 5:28 pm

Re: Accel Stepper help

Post by mdesrocher »

On the LCD there are 6 buttons that can be pushed. Basically the steppers are turning adjusters that have 7 full turns, which equates to the steppers needing to step 1050 to complete one turn on the adjuster. Each button push will, no matter what, turn all 3 steppers., from each button push the steppers will either go in increments of 1 full turn sometimes forward sometimes backward. I like how i have it working right now since i can go in and change the amount of turns and direction for each stepper in each if statement. Here is my code cleaned up now. I only need the accel stepper for the if statements including "userbuttons". The first block of "4dbuttons" are a calibration screen where i can move each stepper individually one turn in either direction.
also, only one button is pushed at a time. In the code you can see where it says //go to formX...its saying when that button is pushed go to a screen saying "stepping" while the steppers run, then after they are done it returns back to the main screen with the 6 buttons

Code: Select all

#include <EEPROM.h>

#include <Wire.h>
#include "utility/Adafruit_PWMServoDriver.h"
#include <Adafruit_MotorShield.h>

#include <genieArduino.h>

Adafruit_MotorShield AFMSbot(0x64);
Adafruit_MotorShield AFMSmid(0x62);
Adafruit_MotorShield AFMStop(0x61);

Adafruit_StepperMotor *myStepper1 = AFMSbot.getStepper(200, 1); 
Adafruit_StepperMotor *myStepper2 = AFMSmid.getStepper(200, 1);
Adafruit_StepperMotor *myStepper3 = AFMStop.getStepper(200, 1);

int terrain = 0 ;
int fuel = 1 ;
byte tpress;
byte fpress;

Genie genie;
#define RESETLINE A10

void setup()
{
  Serial1.begin(200000);
  genie.Begin(Serial1);

  genie.AttachEventHandler(myGenieEventHandler);
  
  pinMode(RESETLINE, OUTPUT);
  digitalWrite(RESETLINE, 0);
  delay(100);
  digitalWrite(RESETLINE, 1);
  delay(5000);

  genie.WriteContrast(10);

 

  tpress = EEPROM.read(terrain); // Read Once at startup, to get last value
  fpress = EEPROM.read(fuel); // Read Once at startup, to get last value
  
  AFMSbot.begin();
  AFMSmid.begin();
  AFMStop.begin();

  myStepper1->setSpeed(400);
  myStepper2->setSpeed(400);
  myStepper3->setSpeed(400);
}

void loop()
{
  genie.DoEvents();
}

void myGenieEventHandler(void)
{
  genieFrame Event;
  genie.DequeueEvent(&Event);

  if (Event.reportObject.cmd == GENIE_REPORT_EVENT)
  {
    if (Event.reportObject.object == GENIE_OBJ_4DBUTTON)
    {
      if (Event.reportObject.index == 2) // 4DButton2
      {
        myStepper1->step(1050, BACKWARD, DOUBLE);
        myStepper1->release();
      }
      if (Event.reportObject.index == 3) // 4DButton3
      {
        myStepper1->step(1050, FORWARD, DOUBLE);
        myStepper1->release();
      }
      if (Event.reportObject.index == 4) // 4DButton4
      {
        myStepper2->step(1050, BACKWARD, DOUBLE);
        myStepper2->release();
      }
      if (Event.reportObject.index == 5) // 4DButton5
      {
        myStepper2->step(1050, FORWARD, DOUBLE);
        myStepper2->release();
      }
      if (Event.reportObject.index == 6) // 4DButton6
      {
        myStepper3->step(1050, BACKWARD, DOUBLE);
        myStepper3->release();
      }
      if (Event.reportObject.index == 7) // 4DButton7
      {
        myStepper3->step(1050, FORWARD, DOUBLE);
        myStepper3->release();
      }
      if (Event.reportObject.index == 9) // 4DButton9
      {
        EEPROM.write(terrain, 0);
        tpress = 0;
        EEPROM.write(fuel, 0);
        fpress = 0;
      }
    }

    if (Event.reportObject.object == GENIE_OBJ_USERBUTTON)
    {
      if (Event.reportObject.index == 0) // UserButton0
      {
        genie.WriteObject(GENIE_OBJ_FORM, 4, 0); // Go to form 4
        if (fpress == 1)
        {
          myStepper1->step(1050, BACKWARD, DOUBLE);
          myStepper1->release();
          myStepper2->step(1050, BACKWARD, DOUBLE);
          myStepper2->release();
          myStepper3->step(1050, BACKWARD, DOUBLE);
          myStepper3->release();
          EEPROM.write(fuel, 0);
          fpress = 0;
        }
        else if (fpress == 2)
        {
          myStepper1->step(2100, BACKWARD, DOUBLE);
          myStepper1->release();
          myStepper2->step(2100, BACKWARD, DOUBLE);
          myStepper2->release();
          myStepper3->step(2100, BACKWARD, DOUBLE);
          myStepper3->release();
          EEPROM.write(fuel, 0);
          fpress = 0;
        }
        else if (fpress == 0)
        {
          EEPROM.write(fuel, 0);
          fpress = 0;
        }
        genie.WriteObject(GENIE_OBJ_FORM, 2, 0); // Go back to form 2
      }
      if (Event.reportObject.index == 1) // UserButton1
      {
        genie.WriteObject(GENIE_OBJ_FORM, 4, 0); // Go to form 4
        if (fpress == 0)
        {
          myStepper1->step(1050, FORWARD, DOUBLE);
          myStepper1->release();
          myStepper2->step(1050, FORWARD, DOUBLE);
          myStepper2->release();
          myStepper3->step(1050, FORWARD, DOUBLE);
          myStepper3->release();
          EEPROM.write(fuel, 1);
          fpress = 1;
        }
        else if (fpress == 2)
        {
          myStepper1->step(1050, BACKWARD, DOUBLE);
          myStepper1->release();
          myStepper2->step(1050, BACKWARD, DOUBLE);
          myStepper2->release();
          myStepper3->step(1050, BACKWARD, DOUBLE);
          myStepper3->release();
          EEPROM.write(fuel, 1);
          fpress = 1;
        }
        else if (fpress == 1)
        {
          EEPROM.write(fuel, 1);
          fpress = 1;
        }
        genie.WriteObject(GENIE_OBJ_FORM, 2, 0); // Go back to form 2
      }
      if (Event.reportObject.index == 2) // UserButton2
      {
        genie.WriteObject(GENIE_OBJ_FORM, 4, 0); // Go to form 4
        if (fpress == 0)
        {
          myStepper1->step(2100, FORWARD, DOUBLE);
          myStepper1->release();
          myStepper2->step(2100, FORWARD, DOUBLE);
          myStepper2->release();
          myStepper3->step(2100, FORWARD, DOUBLE);
          myStepper3->release();
          EEPROM.write(fuel, 2);
          fpress = 2;
        }
        else if (fpress == 1)
        {
          myStepper1->step(1050, FORWARD, DOUBLE);
          myStepper1->release();
          myStepper2->step(1050, FORWARD, DOUBLE);
          myStepper2->release();
          myStepper3->step(1050, FORWARD, DOUBLE);
          myStepper3->release();
          EEPROM.write(fuel, 2);
          fpress = 2;
        }
        else if (fpress == 2)
        {
          EEPROM.write(fuel, 2);
          fpress = 2;
        }  
        genie.WriteObject(GENIE_OBJ_FORM, 2, 0); // Go back to form 2  
      }
      if (Event.reportObject.index == 3) // UserButton3
      {
        genie.WriteObject(GENIE_OBJ_FORM, 3, 0); // Go to form 3
        if (tpress == 1)
        {
          myStepper1->step(1050, FORWARD, DOUBLE);
          myStepper1->release();
          myStepper2->step(1050, FORWARD, DOUBLE);
          myStepper2->release();
          myStepper3->step(1050, FORWARD, DOUBLE);
          myStepper3->release();
          EEPROM.write(terrain, 0);
          tpress = 0;
        }
        else if (tpress == 2)
        {
          myStepper1->step(2100, FORWARD, DOUBLE);
          myStepper1->release();
          myStepper2->step(2100, FORWARD, DOUBLE);
          myStepper2->release();
          myStepper3->step(2100, FORWARD, DOUBLE);
          myStepper3->release();
          EEPROM.write(terrain, 0);
          tpress = 0;
        }
        else if (tpress == 0)
        {
          EEPROM.write(terrain, 0);
          tpress = 0;
        }       
        genie.WriteObject(GENIE_OBJ_FORM, 2, 0); // Go back to form 2
      }
      if (Event.reportObject.index == 4) // UserButton4
      {
        genie.WriteObject(GENIE_OBJ_FORM, 3, 0); // Go to form 3
        if (tpress == 0)
        {
          myStepper1->step(1050, BACKWARD, DOUBLE);
          myStepper1->release();
          myStepper2->step(1050, BACKWARD, DOUBLE);
          myStepper2->release();
          myStepper3->step(1050, BACKWARD, DOUBLE);
          myStepper3->release();
          EEPROM.write(terrain, 1);
          tpress = 1;
        }
        else if (tpress == 2)
        {
          myStepper1->step(1050, FORWARD, DOUBLE);
          myStepper1->release();
          myStepper2->step(1050, FORWARD, DOUBLE);
          myStepper2->release();
          myStepper3->step(1050, FORWARD, DOUBLE);
          myStepper3->release();
          EEPROM.write(terrain, 1);
          tpress = 1;
        }
        else if (tpress == 1)
        {
          EEPROM.write(terrain, 1);
          tpress = 1;
        }
        genie.WriteObject(GENIE_OBJ_FORM, 2, 0); // Go back to form 2
      }
      if (Event.reportObject.index == 5) // UserButton5
      {
        genie.WriteObject(GENIE_OBJ_FORM, 3, 0); // Go to form 3
        if (tpress == 0)
        {
          myStepper1->step(2100, BACKWARD, DOUBLE);
          myStepper1->release();
          myStepper2->step(2100, BACKWARD, DOUBLE);
          myStepper2->release();
          myStepper3->step(2100, BACKWARD, DOUBLE);
          myStepper3->release();
          EEPROM.write(terrain, 2);
          tpress = 2;
        }
        else if (tpress == 1)
        {
          myStepper1->step(1050, BACKWARD, DOUBLE);
          myStepper1->release();
          myStepper2->step(1050, BACKWARD, DOUBLE);
          myStepper2->release();
          myStepper3->step(1050, BACKWARD, DOUBLE);
          myStepper3->release();
          EEPROM.write(terrain, 2);
          tpress = 2;
        }
        else if (tpress == 2)
        {
          EEPROM.write(terrain, 2);
          tpress = 2;
        }
        genie.WriteObject(GENIE_OBJ_FORM, 2, 0); // Go back to form 2
      }
    }
  }
}

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

Re: Accel Stepper help

Post by adafruit_support_bill »

You don't really need AccelStepper to do that. You can move all the motors together using the regular library:

Code: Select all

for (int i = 0; i < 1050; i++)
{
   myStepper1->onestep(FORWARD, DOUBLE);
   myStepper1->onestep(FORWARD, DOUBLE);
   myStepper1->onestep(FORWARD, DOUBLE);
   delay(step_interval);
}

User avatar
mdesrocher
 
Posts: 5
Joined: Wed Sep 24, 2014 5:28 pm

Re: Accel Stepper help

Post by mdesrocher »

oh well thats pretty darn simple, thanks for the help!

User avatar
mdesrocher
 
Posts: 5
Joined: Wed Sep 24, 2014 5:28 pm

Re: Accel Stepper help

Post by mdesrocher »

Got it all hooked up and running, works. Only issue i see now is that running them all at once kind of bogs down the steppers, their speed is definitely slower now. Suggestions?

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

Re: Accel Stepper help

Post by adafruit_support_bill »

You can increase the I2C bus speed as described in the tutorial/FAQ. You can also implement my 'quickstep" hack as described in this thread:
http://forums.adafruit.com/viewtopic.ph ... ep#p292119

User avatar
mdesrocher
 
Posts: 5
Joined: Wed Sep 24, 2014 5:28 pm

Re: Accel Stepper help

Post by mdesrocher »

Ok ill try that out, thanks for the help and quick response!

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

Return to “Arduino Shields from Adafruit”