Control velocity and acceleration of Quadstep board?

Hey I thought I'd share my code to control the quadstep motor board from an Arduino Mega using Max MSP - both codes are below.

My question - is it possible to control the acceleration and velocity of the stepper motors? The motors move very 'digitally'.

not really sure how to do it with the quadstep.h library.

Any thoughts would be great!

Hope at least my code is useful to someone using the max and the quadstep board.

/*
  SparkFun Electronics 2011
 Aaron Weiss, aaron at sparkfun dot com
 Beer-ware License: You can do whatever you want with this sketch.
 If we meet someday, you can buy me a beer.
 
 QuadSetpper Example Sketch. For use with an Arduino Mega2560 and 
 a 1.8 degree bipolar stepper motor.
 
 You must connect the STP pin for each motor as shown below.
 For rest of the pins, you choose where they go. 
 
 Motor1 STP pin: mega pin 11
 Motor2 STP pin: meag pin 5
 Motor3 STP pin: meag pin 6
 Motor4 STP pin: mega pin 46
 
 Library Usage: 
 
 motor_pins(x,y,z,l,m,n)
 x: motor channel number
 y: enable pin assignment
 z: direction pin assignment
 l: MS1 pin assignment
 m: MS2 pin assignment
 n: MS3 pin assignment
 
 motor_go(x,y,z,l)
 x: motor channel number
 y: step size: 1, 2, 4, 8, or 16
 z: increments for given step size
 for full step: 1 increment = 1.8deg
 for half step: 1 increment = 0.9deg and so on
 negaitve numbers rotate in the opposite direction
 l: torque/speed (0-10), 0 is high speed/low torque/low current
 10 is low speed/high torque/high current (2.0A max)
 
 stall(x)
 x: motor channel number
 */

// include the motor library
#include <quadstep.h>

// create an instance of the class motor
quadstep quadstep;


#include <string.h>

boolean stringComplete = false;  // whether the string is complete
char   strDelimiter []= ", ";
char*   p;
int     motor = 0, stpSize = 0, steps = 0, torque = 0;
char   str[] = "0001, 0001, 2000, 0008";
int i=0;

void setup() {
  Serial.begin(9600);

  // assign the pin connections
  quadstep.motor_pins(1,A1,36,A8,A9,A10); //ch 1
  quadstep.motor_pins(2,10,9,8,7,4);      //ch 2
  quadstep.motor_pins(3,22,23,24,25,26);  //ch 3
  quadstep.motor_pins(4,27,28,29,30,31);  //ch 4


}

void loop() {


  if (stringComplete) {

    if (p = strtok(str, strDelimiter))     { 
      Serial.print("motor = ");
      Serial.println(p);
      motor = atoi(p); 

    }

    if ( p = strtok(NULL, strDelimiter))    { 
      Serial.print("stpSize = ");
      Serial.println(p);
      stpSize = atoi(p); 
    }

    if ( p = strtok(NULL, strDelimiter))    { 
      Serial.print("steps = ");
      Serial.println(p);
      steps = atoi(p); 
    }

    if ( p = strtok(NULL, strDelimiter ))     { 
      Serial.print("torque = ");
      Serial.println(p);
      torque = atoi(p); 
    }
    quadstep.motor_go(motor,stpSize,steps,torque); 
    // clear the string:
    //char str[] = "0000, 0000, 0000, 0000";
    stringComplete = false;
  }





}


/*
  SerialEvent occurs whenever a new data comes in the
 hardware serial RX.  This routine is run between each
 time loop() runs, so using delay inside loop can delay
 response.  Multiple bytes of data may be available.
 */
void serialEvent() {



  while(Serial.available()) {
    // get the new byte:
    char inChar = (char)Serial.read();

    str[i] = inChar;
    i++;


    if (inChar == '\n') {
      stringComplete = true;      
      //      Serial.println("GOG"); 
      //      Serial.println(str); 
      i=0;
    }

  } 
}

Here is the Max MSP code too!


----------begin_max5_patcher----------
1804.3oc0atziSqCE.d8L+JrhzU5dk5T4G4I6FwJVbWwh6B.gRacaCjFWrcm
Y.D+2u9QZmPII0kIwsfPsMNING+4iOublue6MAyXOQEAfWAdG3la99s2bioI
cC2Te7MAaxeZdYtvbYAanBQ9JZvD64jzmjl1QS.oS.HXbh5y8msrnhNmsqxb
I35Fq1sonpjJEG0Hambeqn5VWxpjhhuQMsAmBqa1dkxutkZk7f.vGpO01b47
0EUq9HmNWZOaHNRcm.THQ+Ujta.3jovC2SwByHfM6S2kjDz3QWkuw7DBtmWj
WFnOwOt8V8GSbjVUzGUc6u.KIXFnHnMdfZkG3yjGyxqVELADTnIeOngjAmFq
9WT7DPrgRD7zHEqR6.OQCKdly1rgpjwegOL9W1QOC.AaCP3C.ZKmJTOmbYAq
polQB9vvWOjm.f0ezq9TJYZTHJNUooiM2PLYZFx1MXXGji3GxIjzshQGbjzr
ooDBIL7b.WSsM2AG1efC7VMAFa3gyr1ixbka3rjCz1ctgFXKY61LixCNHkbU
OJo7ORqxmURaRiVAmpohM61bZSbpG5gKDdll8zl6lTa86Yf1wZ+TyrPH5rV1
u+FrdQ5zLI7ph8uLeImCTIlNBDBaEpJoPP2ssoncBqDt.63r+7UziGw4DbrA
hg3WvbRSKPNMmj9G+bR3PLk3HcgMLEcBv5m3SEa4pwyRv6C9qo3ES.G+46CZ
0KYn6AyilFkEgTgP86DQeMvRMdP05lQc6GLdfC7pq7eduNCH0+uCC0BUGDxC
o6DaSvwrbOwnRgh6.MXegFHDpPi8y6B0.R8auwn1sKZ4jMqGW7+275Q39AK7
R.1qDtlYxG.4dbUDKJseYylnKvFkcQzXUKosnM5xhVbb3dmCNxVykSrJq5Zd
zCZSuDnEWC13KrNqAMDmsEjXQYchbmPm0Otry2tkVsPggyH+0AmigY1v+cVA
MpNeACOiR6KzGrm7VQ4bF+Ufhp4LtVPAOjWtiBVx3fMLIi+wUrKkqcbTrwqd
bh0EOoO8tvPun2sjy1H95lYrxWphG1EpLmUx31Vq8vjlAQYwFMs5egNQ4TRS
llDockaV9lXLR1U3inXuPwBIKuU9QFD98S0AdHQHwDlYXbeHDG4ED9sRvJNS
krk6KNwmqZ3jSs.cOWfFCgQj93BA6mb4nkZqXHnJPfyPEiblrY+VNr+694jJ
jDMmhrInjD0KmHdgSlTdA+VlyNQcJ6PQAq.PRclrg844i3GK44RVwK0FTOd1
JKD8uYT1XAHIjmMozEQB8z1PwKVshxA+sx2+6je3ezAALmJ.plWKuqjtTBly
pdPcqpvfDSAf6KKAx0TvBd9ipAGHWEQ1VNScOB8gOVnN+ZSjZfYTUmQA+a9S
.N8K6nBo.nlXrQan5q+as5hjqKDf8RwxBUPWS.ERfJzqEBUmCt+su9MuAbOP
x.4hOCtmuXWQEyDqRi9p0cikLbayQaqus1+pKrkcCXC6plVdZSE4zhpBopSU
CAgYZZUtT8qGMjdGuht.vpLyYrkKceKrGJngRpW.Xq.nMaDRXGPKzmNOfOuk
9WZWGDSOoSbzTNFbudNf9QyZdYw7OCVSUqmUqDmWxDTi9kfpeRfsLtLXL0bH
007KCYoQ+giEeIfBaqwblGYhc+8vwQtvjD+jaoQ03kl8H92L6w8qbrZIVKzc
lrMxO.QqF.xuXDgD1PGwt+KcQDTleV1Xpwvntxnd2SruIA0uNTcstXXGyR1p
UkzAZerQNkraaierU02l9uciRze15rNZ.cl9E0nky5vU5vntezNB24fu18os
hacV6COUwMSlWWLa.QVa.V6gjdS6.Q7TPWFWj4frXH7k9VBhO4VV6h9BAYqU
VVu5KdJsrWahrPETgPlOxQQTWw0C6NURuieOEEgfJuzUflj13kEsqBP6Xdcl
60jm0QuHxlmut8elQB1NUV30R69ZzBdVDVnxktnxr0DMtHc4vAnCWz5hEKnU
MUJVTHzdgLxOr0YKWkG8qbvIkG8aZrmjG8asaiGU6xiQnw9SdftHOP+Lek4x
7Uj2jG8qOna7g3G9j5p7bEs9JzepOIWYpy3qK7.upDGUD8mVbPX+IOtLag7G
ehxtplthRupDmPGjFr+TdhRtpnC9JSWFiFB4YSwhsLUtR0QmRvHcTuDj4KrJ
R38G87CZ3rNjMFifPyeIC3zzFi.yQiwHvkkLD+4cDQFChFaIZLrIQ0GMBDML
x0zc7CQItPTB97HJNDY1f7nrLCKyRd9vQfojeN6mAZLTKzw6K7diCGiwfKVe
w9KMFhKA9cjI5QWdNUZvGYvcT8N4x53ipswnZYzkxnPtxhT+HkrSulzZaFUu
IXVe4liN4JRacpx2t8AJWTKEFgOXS9mruQcl+Ntz+4FYOzHCAb5CE6udxs5d
6G29+z8VmmC
-----------end_max5_patcher-----------

Yes, you can. In principal you have to play the motor's own inertia against it.

For example to get a stepper to accelerate smoothly:

  1. Get it going at its base speed.
    Use only full steps for now. (microStepping + accel = tricky business).

  2. Once motor is at speed, slowly increase the speed of step pulses.

  3. Watch motor go faster and faster until you reach the supply voltage -vs- inductance barrier.
    (This barrier can be pushed with higher voltages.)

My quadstepper at 12volts driving nema23 steppers. Can start moving full steps at 100 Microseconds per pulse, and then (once already in motion) speed up to 2x speed by slowly shortening the pulse delay down to 50 Microseconds. But if i try to use the minimum 25 Microsecond rating from sparkfun's website to start with my motors will just sit and sing because I haven't given the run-up that they need to spin like that. (That and I myself need more voltage.)

If you need some code examples check out my stepMode() and stepLight() functions in my CNC controller project also posted here at: Arduino Forum