/*
>>> To make the speed difference between motors A, B and C,, just change speedAB and speedC variable value
>>> If you need more fast speed, just replace millis to micros() functions in code and also increase speedAB and speedC variable value
*/
#include <ezButton.h>
//stepper motor pulse pins
const int stepA = 11; // stepper A
const int stepB = 9; // stepper B
const int stepC = 5; // stepper C
// stepper motor direction pins
const int dirA = 10; // stepper A
const int dirB = 8; // stepper B
const int dirC = 4; // stepper C
const int buttonPin = 6; // button pin for control motors direction
int buttonState = LOW; // last status of direction button
unsigned long preTime1Forward = millis(); //previous time for motor A & B in forward direction
unsigned long preTime2Forward = millis(); //previous time for motor C in forward direction
unsigned long preTime1Reverse = millis(); //previous time for motor A & B in reverse direction
unsigned long preTime2Reverse = millis(); //previous time for motor C in reverse direction
int interval1Forward; // interval time (potentiometer value) for motor A & B in forward direction
int interval2Forward; // interval time (potentiometer value) for motor C in forward direction
int interval1Reverse; // interval time (potentiometer value) for motor A & B in reverse direction
int interval2Reverse; // interval time (potentiometer value) for motor C in reverse direction
ezButton button(buttonPin); // initialize button pin
// ****** YOU CAN CHANGE MOTOR SPEED FROM HERE ******
int speedAB = 10; // Stepper A and B speed, this value is mapped with potentiometer value
int speedC = 20; // Steppe C speed, this value also mapped with potentiometer value
// Note: AB=10 and C=20 means the speed of motor C is 50% of motor A and B
void setup() {
Serial.begin(9600);
pinMode(stepA, OUTPUT);
pinMode(stepB, OUTPUT);
pinMode(stepC, OUTPUT);
pinMode(dirA, OUTPUT);
pinMode(dirB, OUTPUT);
pinMode(dirC, OUTPUT);
pinMode(buttonPin, INPUT);
button.setDebounceTime(50); // direction control button debounce time
}
void loop() {
button.loop();
if(button.isPressed()) {
Serial.println("The button is pressed");
// toggle state of button
buttonState = !buttonState;
if (buttonState == 1){
Serial.println("Forward");
digitalWrite(dirA, LOW);
digitalWrite(dirB, LOW);
digitalWrite(dirC, LOW);
while(1){
unsigned long currentTime1Forward = millis(); // current time in milliseconds for control motor A & B
unsigned long currentTime2Forward = millis(); // current time in milliseconds for control motor C
digitalWrite(stepA, LOW);
digitalWrite(stepB, LOW);
digitalWrite(stepC, LOW);
interval1Forward = map(analogRead(A0), 0, 1023, 0, speedAB); // mapped value from potentiometer
//Serial.println(interval1Forward);
if(currentTime1Forward - preTime1Forward > interval1Forward){
digitalWrite(stepA, HIGH);
digitalWrite(stepB, HIGH);
preTime1Forward = currentTime1Forward;
}
interval2Forward = map(analogRead(A0), 0, 1023, 1, speedC);
if(currentTime2Forward - preTime2Forward > interval2Forward){
digitalWrite(stepC, HIGH);
preTime2Forward = currentTime2Forward;
}
while(interval1Forward == speedAB || interval2Forward == speedC){
Serial.println("Motor Stopped!");
speedAB = speedAB;
speedC = speedC;
interval1Forward = map(analogRead(A0), 0, 1023, 0, speedAB);
interval2Forward = map(analogRead(A0), 0, 1023, 1, speedC);
}
button.loop();
if(button.isPressed()){
Serial.println("Stopped!");
break;
}
}
}
if(buttonState == 0){
Serial.println("Reverse");
digitalWrite(dirA, HIGH);
digitalWrite(dirB, HIGH);
digitalWrite(dirC, HIGH);
while(1){
unsigned long currentTime1Reverse = millis(); // current time in milliseconds for control motor A & B
unsigned long currentTime2Reverse = millis();// current time in milliseconds for control motor C
digitalWrite(stepA, LOW);
digitalWrite(stepB, LOW);
digitalWrite(stepC, LOW);
interval1Reverse = map(analogRead(A0), 0, 1023, 0, speedAB); // mapped value from potentiometer
if(currentTime1Reverse - preTime1Reverse > interval1Reverse){
digitalWrite(stepA, HIGH);
digitalWrite(stepB, HIGH);
preTime1Reverse = currentTime1Reverse;
}
interval2Reverse = map(analogRead(A0), 0, 1023, 1, speedC);
if(currentTime2Reverse - preTime2Reverse > interval2Reverse){
digitalWrite(stepC, HIGH);
preTime2Reverse = currentTime2Reverse;
}
while(interval1Reverse == speedAB || interval2Reverse == speedC){
Serial.println("Motor Stopped!");
speedAB = speedAB;
speedC = speedC;
interval1Reverse = map(analogRead(A0), 0, 1023, 0, speedAB);
interval2Reverse = map(analogRead(A0), 0, 1023, 1, speedC);
}
button.loop();
if(button.isPressed()){
Serial.println("Stopped!");
break;
}
}
}
}
}