Imagine | Develop | Create
Welcome v1.0 Stepper motor controller Commands: P - Program (ON Type, ON Distance, ON Speed, OFF Type, OFF Distance, OFF Speed) A - Move amount (Distance) T - Move To positon (Distance) S - Set setting (m1, m2, m3) D - Display details H - Help Type: 0 - Stop 1 - Move to position 2 - Move amount 3 - Continuously movingThe Arduino program and PCB is available from https://github.com/tinkersprojects/Stepper-Motor-Prototype-Tester
#include <AccelStepper.h> #include <EEPROM.h> //Pins #define Activepin 2 #define Enablepin 3 #define M1pin 4 #define M2pin 5 #define M3pin 6 boolean last_Activepin_state; boolean M1 = false; boolean M2 = false; boolean M3 = false; byte ActiveType = 2; long ActiveValue = 200; double ActiveSpeed = 200; byte NonActiveType = 2; long NonActiveValue = 200; double NonActiveSpeed = 200; AccelStepper stepper(1,7,8); void setup() { read(); Serial.begin(115200); Serial.println("Welcome v1.0 Stepper motor controller"); Help(); pinMode(Activepin, OUTPUT); pinMode(Enablepin, OUTPUT); digitalWrite(Enablepin,LOW); setSetting(); stepper.setEnablePin(13); stepper.setMaxSpeed(200.0); stepper.setAcceleration(100000.0); stepper.enableOutputs(); last_Activepin_state = !digitalRead(Activepin); } void loop() { serialRead(); runmotor(); } /****************** MOTOR CONTROL ******************/ void runmotor() { if(last_Activepin_state != digitalRead(Activepin)) { if(digitalRead(Activepin) == HIGH) { SetMotor(ActiveType, ActiveValue, ActiveSpeed); } else { SetMotor(NonActiveType, NonActiveValue, NonActiveSpeed); } last_Activepin_state = digitalRead(Activepin); } runsteps(); } void SetMotor(byte command, long Value, double Speed) { switch(command) { case 0: // Stop stepper.setMaxSpeed(0); stepper.setSpeed(0); stepper.move(0); break; case 1: // Move to position stepper.setMaxSpeed(Speed); stepper.setSpeed(Speed); stepper.moveTo(Value); while(!hasFinshedStepping()){runsteps();} break; case 2: // Move Amount from current loction stepper.setMaxSpeed(Speed); stepper.setSpeed(Speed); stepper.move(Value); while(!hasFinshedStepping()){runsteps();} break; case 3: // Move constly stepper.setMaxSpeed(Speed); stepper.setSpeed(Speed); stepper.move(Value); last_Activepin_state = digitalRead(Activepin); // needs to be set again break; case 4: // Move to position and can be interupeted stepper.setMaxSpeed(Speed); stepper.setSpeed(Speed); stepper.moveTo(Value); break; case 5: // Move Amount from current loction and can be interupeted stepper.setMaxSpeed(Speed); stepper.setSpeed(Speed); stepper.move(Value); break; } } void setSetting() { if(M1) digitalWrite(M1pin,HIGH); else digitalWrite(M1pin,LOW); if(M2) digitalWrite(M2pin,HIGH); else digitalWrite(M2pin,LOW); if(M3) digitalWrite(M3pin,HIGH); else digitalWrite(M3pin,LOW); } bool hasFinshedStepping() { return stepper.distanceToGo()!=0; } void runsteps() { stepper.run(); } /****************** COMPUTER INTERFACE ******************/ String inputString = ""; char menu = 0; char menuStep = 0; void serialRead() { while (Serial.available()) { char inChar = (char)Serial.read(); if(menu == 0) { if(inChar>='a')inChar = inChar - ('a'-'A'); menu = inChar; menuStep = 0; while((char)Serial.read() != '\n'){runmotor();} ReceiveCommand(0); inputString = ""; return; } else { if (inChar == '\n') { menuStep++; ReceiveCommand(inputString.toDouble()); inputString = ""; return; } else { inputString += inChar; } } } } void ReceiveCommand(double Value) { switch(menu) { case 'H': Help(); break; case 'P': Program(Value); break; case 'A': MoveAmount(Value); break; case 'T': MoveTo(Value); break; case 'S': Setting(Value); break; case 'D': Display(); break; } } void Program(double Value) { if((menuStep == 2 && Value == 3) || (menuStep == 5 && Value == 3)) menuStep++; switch(menuStep) { case 1: Serial.print("Enter ON Type:"); break; case 2: ActiveType = Value; Serial.println(Value); Serial.print("Enter ON Distance:"); break; case 3: ActiveValue = Value; Serial.println(Value); Serial.print("Enter ON Speed:"); break; case 4: ActiveSpeed = Value; Serial.println(Value); Serial.print("Enter OFF Type:"); break; case 5: NonActiveType = Value; Serial.println(Value); Serial.print("Enter OFF Distance:"); break; case 6: NonActiveValue = Value; Serial.println(Value); Serial.print("Enter OFF Speed:"); break; case 7: NonActiveSpeed = Value; menu = 0; Serial.println(Value); Serial.println("Save"); save(); break; } } void MoveAmount(double Value) { stepper.move(Value); menu = 0; } void MoveTo(double Value) { stepper.moveTo(Value); menu = 0; } void Setting(double Value) { switch(menuStep) { case 1: Serial.print("Enter M1:"); break; case 2: if(Value >0) M1 = true; else M1 = false; Serial.println(M1); Serial.print("Enter M2:"); break; case 3: if(Value >0) M2 = true; else M2 = false; Serial.println(M2); Serial.print("Enter M3:"); break; case 4: if(Value >0) M3 = true; else M3 = false; menu = 0; Serial.println(M3); Serial.println("Save"); save(); setSetting(); break; } } void Help() { menu = 0; Serial.println("Commads:"); Serial.println("\tP - Program (ON Type, ON Distance, ON Speed, OFF Type, OFF Distance, OFF Speed)"); Serial.println("\tA - Move amount (Distance)"); Serial.println("\tT - Move To positon (Distance)"); Serial.println("\tS - Set setting (m1, m2, m3)"); Serial.println("\tD - Display details"); Serial.println("\tH - Help"); Serial.println(); Serial.println("Type:"); Serial.println("\t0 - Stop"); Serial.println("\t1 - Move to position"); Serial.println("\t2 - Move amount"); Serial.println("\t3 - Continuously moving"); } void Display() { menu = 0; Serial.println("ON:"); Serial.print("\tType: "); Serial.println(ActiveType); Serial.print("\tDistance: "); Serial.println(ActiveValue); Serial.print("\tSpeed:"); Serial.println(ActiveSpeed); Serial.println(); Serial.println("OFF:"); Serial.print("\tType: "); Serial.println(NonActiveType); Serial.print("\tDistance: "); Serial.println(NonActiveValue); Serial.print("\tSpeed: "); Serial.println(NonActiveSpeed); Serial.println(); Serial.println("Settings:"); Serial.print("\tM1: "); Serial.println(M1); Serial.print("\tM2: "); Serial.println(M2); Serial.print("\tM3: "); Serial.println(M3); Serial.println(); } /****************** STORAGE ******************/ void read() { if(EEPROM.read(0) == 1) { M1 = EEPROM.read(1); M2 = EEPROM.read(2); M3 = EEPROM.read(3); String readString = ""; char letter = 0; for(int i = 20;i<2000;i++) { char CHAR = EEPROM.read(i); if(CHAR >= 'A' && CHAR < 'Z' && letter != 0) { switch(letter) { case 'A': ActiveType = readString.toInt(); break; case 'B': ActiveValue = readString.toInt(); break; case 'C': ActiveSpeed = readString.toDouble(); break; case 'D': NonActiveType = readString.toInt(); break; case 'E': NonActiveValue = readString.toInt(); break; case 'F': NonActiveSpeed = readString.toDouble(); break; case 'G': return; break; } } if(CHAR >= 'A' && CHAR < 'Z') { letter = CHAR; readString = ""; } else { readString += CHAR; } } } else { save(); } } void save() { EEPROM.write(0, 1); EEPROM.write(1, M1); EEPROM.write(2, M2); EEPROM.write(3, M3); String saveString = "A"+String(ActiveType); saveString += "B"+String(ActiveValue); saveString += "C"+String(ActiveSpeed); saveString += "D"+String(NonActiveType); saveString += "E"+String(NonActiveValue); saveString += "F"+String(NonActiveSpeed); saveString += "G"; for(int i = 0;i<saveString.length();i++) { EEPROM.write(20+i, saveString.charAt(i)); } }
Welcome v1.0 Stepper motor controller Commands: P - Program (ON Type, ON Distance, ON Speed, OFF Type, OFF Distance, OFF Speed) A - Move amount (Distance) T - Move To positon (Distance) S - Set setting (m1, m2, m3) D - Display details H - Help Type: 0 - Stop 1 - Move to position 2 - Move amount 3 - Continuously movingThe Arduino program and PCB is available from https://github.com/tinkersprojects/Stepper-Motor-Prototype-Tester