Go Down

### Topic: Control velocity and acceleration of Quadstep board? (Read 1 time)previous topic - next topic

#### divdog

##### Apr 01, 2012, 05:04 am
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.

Code: [Select]
`/*  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 motorquadstep quadstep;#include <string.h>boolean stringComplete = false;  // whether the string is completechar   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!

<pre><code>
----------begin_max5_patcher----------
1804.3oc0atziSqCE.d8L+JrhzU5dk5T4G4I6FwJVbWwh6B.gRacaCjFWrcm
cC2Te7MAaxeZdYtvbYAanBQ9JZvD64jzmjl1QS.oS.HXbh5y8msrnhNmsqxb
I35Fq1sonpjJEG0Hambeqn5VWxpjhhuQMsAmBqa1dkxutkZk7f.vGpO01b47
0EUq9HmNWZOaHNRcm.THQ+Ujta.3jovC2SwByHfM6S2kjDz3QWkuw7DBtmWj
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
krk6KNwmqZ3jSs.cOWfFCgQj93BA6mb4nkZqXHnJPfyPEiblrY+VNr+694jJ
jDMmhrInjD0KmHdgSlTdA+VlyNQcJ6PQAq.PRclrg844i3GK44RVwK0FTOd1
JKD8uYT1XAHIjmMozEQB8z1PwKVshxA+sx2+6je3ezAALmJ.plWKuqjtTBly
pdPcqpvfDSAf6KKAx0TvBd9ipAGHWEQ1VNScOB8gOVnN+ZSjZfYTUmQA+a9S
.N8K6nBo.nlXrQan5q+as5hjqKDf8RwxBUPWS.ERfJzqEBUmCt+su9MuAbOP
x.4hOCtmuXWQEyDqRi9p0cikLbayQaqus1+pKrkcCXC6plVdZSE4zhpBopSU
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-----------
</code></pre>

#### dewy721

#1
##### Apr 02, 2012, 01:46 amLast Edit: Apr 02, 2012, 02:05 am by dewy721 Reason: 1
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: http://arduino.cc/forum/index.php?topic=92561.new;topicseen#new

Go Up