Hello,
this is one of my first codes for running stepper motors connected to CNC shield.
Forgive me some extra code, but I'm using a template for all my experiments with CNC shield.
The idea of this code is to controll 2 stepper motors by serial commands. After typing number of steps, motors should run tohether, according to given values - for ex. "34,56".
But in this case, they don't. They do only one step.
Steppers must act at the same time.
Some of my first attempts gave me effect, that after putting a command, motor X moved, and after it finished, motor Y started its action.
My need is to move those motors at the same time, so after looking at the forum I've found millis() method which seemed to be solution for me.
Here is my code:
//step pins
#define X_stp 2
#define Y_stp 3
#define Z_stp 4
#define A_stp 12
//direction pins
#define X_dir 5
#define Y_dir 6
#define Z_dir 7
#define A_dir 13
//endstop pins
#define X_lim 9
#define Y_lim 10
#define Z_lim 11
#define A_lim 17
//enable pin
#define EN 8
//common speed
int spd = 5;
//number of steps per stepper
int allXpos = 96;
int allYpos = 96;
int allZpos = 96;
int allApos = 96;
//Direction values
int Xdir = 1;
int Ydir = 1;
int Zdir = 1;
int Adir = 1;
//steps to be taken
int Xsteps = 0;
int Ysteps = 0;
int Zsteps = 0;
int Asteps = 0;
//current position
int curXpos;
int curYpos;
int curZpos;
int curApos;
//position form command
int nxtXpos;
int nxtYpos;
int nxtZpos;
int nxtApos;
unsigned long nxtXMillis = 0;
unsigned long nxtYMillis = 0;
unsigned long speed = 5;
void setup() {
Serial.begin(115200);
Serial.setTimeout(5);
pinMode(EN,OUTPUT);
pinMode(X_stp,OUTPUT);
pinMode(X_dir,OUTPUT);
pinMode(X_lim, INPUT_PULLUP);
pinMode(Y_stp,OUTPUT);
pinMode(Y_dir,OUTPUT);
pinMode(Y_lim, INPUT_PULLUP);
pinMode(Z_stp,OUTPUT);
pinMode(Z_dir,OUTPUT);
pinMode(Z_lim, INPUT_PULLUP);
pinMode(A_stp,OUTPUT);
pinMode(A_dir,OUTPUT);
pinMode(A_lim, INPUT_PULLUP);
while (digitalRead(Y_lim) == 0)
stepY();
curXpos = 7;
curYpos = 7;
curZpos = 7;
curApos = 7;
}
void stepX()
{
if (millis() - nxtXMillis > speed)
{
nxtXMillis = millis();
digitalWrite(EN, 0);
digitalWrite(X_stp, 1);
digitalWrite(X_stp, 0);
}
}
void stepY()
{
if (millis() - nxtYMillis > speed)
{
nxtYMillis = millis();
digitalWrite(EN, 0);
digitalWrite(Y_stp, 1);
digitalWrite(Y_stp, 0);
}
}
void loop()
{
digitalWrite(EN, 1);
while (Serial.available() > 0)
{
int Xstp = Serial.parseInt();
for (int x=0;x<Xstp;x++)
stepX();
int Ystp = Serial.parseInt();
for (int y=0;y<Ystp;y++)
stepY();
}
}
After runnig this code my stepper/steppers take only one step after giving them some order via serial monitor. Millis control for stepping works fine, because homing at the setup does the job. There must be something wrong with my for() loop. At first glance, seems legit.... but I can't find an error.