#include <AccelStepper.h>
int targets [10];
int moveIndex = 0;
int targetIndex = 0;
int currentAngle = 0;
AccelStepper stepper(AccelStepper::DRIVER, 4, 3);
void setup() {
stepper.setMaxSpeed(250);
stepper.setAcceleration(20);
TCCR1A = 0;
TCCR1B = 0;
TCCR1B |= (1 << CS10);
TIMSK1 |= (1 << TOIE1);
Serial.begin(9600);
Serial.println(F("Enter an angle between 0 and 360 degrees."));
}
void zeroStepper() {
long zero = stepper.currentPosition();
zero = zero >= 360 ? zero - 360 : zero < 0 ? zero + 360 : zero;
stepper.setCurrentPosition(zero);
}
void moveStepper(int angle) {
if (angle == currentAngle) {
return;
}
angle = angle > 360 ? 360 : angle < 0 ? 0 : angle;
int target = angle;
if (currentAngle > angle) {
zeroStepper();
if (currentAngle - angle > (360.0 - currentAngle) + angle) {
target = stepper.currentPosition() > 0 ? target + 360 : target;
}
}
else {
zeroStepper();
if (angle - currentAngle > (360.0 - angle) + currentAngle) {
target = (360.0 - angle) * -1.0;
}
}
currentAngle = angle;
stepper.moveTo(target);
}
ISR(TIMER1_OVF_vect) {
stepper.run();
}
void loop() {
if (Serial.available()) {
int angle = Serial.parseInt();
while (Serial.available()) {
Serial.read();
}
targets[targetIndex] = angle;
targetIndex++;
}
if (!stepper.isRunning() && moveIndex < targetIndex) {
moveStepper(targets[moveIndex]);
if (moveIndex < 9) {
moveIndex++;
}
else {
targetIndex = 0;
moveIndex = 0;
}
}
}