#include <AccelStepper.h>
#define MOTOR_INTERFACE_TYPE 1 // 1 = Драйвер (Step/Dir)
#define PIN_STEP 3
#define PIN_DIR 2
#define PIN_SENSOR 4
AccelStepper stepper(MOTOR_INTERFACE_TYPE, PIN_STEP, PIN_DIR);
enum State {
MOVE_COUNTER_CLOCKWISE, // Вращение против ЧС на -1000 шагов
MOVE_CLOCKWISE_2000, // Вращение по ЧС на +2000 шагов
CONTINUOUS_ROTATION, // Непрерывное вращение со скоростью 100 до датчика
STOPPED // Окончательная остановка
};
State currentState = MOVE_COUNTER_CLOCKWISE;
void setup() {
pinMode(PIN_SENSOR, INPUT_PULLUP);
// Настройки динамики мотора
stepper.setMaxSpeed(1000); // Максимальная скорость для разгона
stepper.setAcceleration(500); // Ускорение
// Старт: едем на -1000 шагов (Против ЧС)
stepper.moveTo(-1000);
}
void loop() {
switch (currentState) {
// 1. Вращение против ЧС на 1000 шагов
case MOVE_COUNTER_CLOCKWISE:
stepper.run(); // Разгон, движение и торможение до 0
if (stepper.distanceToGo() == 0) {
// Достигли -1000 шагов. Едем на +2000 шагов вправо (в абсолютную точку +1000)
stepper.moveTo(1000);
currentState = MOVE_CLOCKWISE_2000;
}
break;
// 2. Вращение по ЧС на 2000 шагов с замедлением
case MOVE_CLOCKWISE_2000:
stepper.run();
if (stepper.distanceToGo() == 0) {
// Проехали 2000 шагов. Устанавливаем целевую скорость 100 шагов/сек
stepper.setSpeed(100);
currentState = CONTINUOUS_ROTATION;
}
break;
// 3. Непрерывное вращение со скоростью 100 до датчика
case CONTINUOUS_ROTATION:
// Проверяем датчик (в Wokwi нажмите на кнопку/датчик)
if (digitalRead(PIN_SENSOR) == LOW) {
stepper.stop();
currentState = STOPPED;
} else {
// Просто вызываем runSpeed() — мотор будет бесконечно вращаться со скоростью 100
stepper.runSpeed();
}
break;
// 4. Остановка
case STOPPED:
// Мотор пришел в конечную точку
break;
}
}