#define STEP_PIN 16
#define DIR_PIN 17
const int stepsPerRevolution = 200; // adjust if microstepping
long currentStep = 0;
int pulseDelay = 800; // speed control (lower = faster)
String inputString = "";
void setup() {
pinMode(STEP_PIN, OUTPUT);
pinMode(DIR_PIN, OUTPUT);
Serial.begin(115200);
Serial.println("Stepper ready. Send angle or S<step>");
}
// Move relative steps
void moveSteps(long steps) {
if (steps == 0) return;
if (steps > 0) {
digitalWrite(DIR_PIN, HIGH);
} else {
digitalWrite(DIR_PIN, LOW);
steps = -steps;
}
for (long i = 0; i < steps; i++) {
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(pulseDelay);
digitalWrite(STEP_PIN, LOW);
delayMicroseconds(pulseDelay);
}
}
// Move to absolute step
void moveToStep(long targetStep) {
long stepsToMove = targetStep - currentStep;
moveSteps(stepsToMove);
currentStep = targetStep;
Serial.print("Now at step: ");
Serial.println(currentStep);
}
// Move to angle
void moveToAngle(float angle) {
long targetStep = (long)((angle / 360.0) * stepsPerRevolution);
moveToStep(targetStep);
Serial.print("Moved to angle: ");
Serial.println(angle);
}
void loop() {
while (Serial.available()) {
char c = Serial.read();
if (c == '\n' || c == '\r') {
processInput(inputString);
inputString = "";
} else {
inputString += c;
}
}
}
void processInput(String input) {
input.trim();
if (input.length() == 0) return;
// If starts with S → step command
if (input.startsWith("S") || input.startsWith("s")) {
long stepTarget = input.substring(1).toInt();
moveToStep(stepTarget);
}
else {
// Otherwise treat as angle
float angle = input.toFloat();
moveToAngle(angle);
}
}