#include <AccelStepper.h>
// Настройка шагового двигателя
// #define ENABLE_PIN 7
#define STEP_PIN 8
#define DIR_PIN 9
// Пины для кнопки и концевых датчиков
#define BUTTON_PIN 2
#define LIMIT_SWITCH_CW_PIN 3 // по часовой
#define LIMIT_SWITCH_CCW_PIN 4 // против часовой
// Настройки
#define STEPS_PER_REVOLUTION 200 // Шагов на оборот для NEMA 17
#define RPM 600 // Скорость в оборотах в минуту
#define STEPS_PER_MINUTE (STEPS_PER_REVOLUTION * RPM)
#define MOTOR_SPEED 600 // Скорость в шагов в секунду
AccelStepper stepper(AccelStepper::DRIVER, STEP_PIN, DIR_PIN);
// int counter = 0;
// int last_button_state = HIGH;
// int curr_button_state = HIGH;
volatile bool motorEnabled = true; // Флаг активности двигателя
volatile bool motorDirection = true; // Направление движения: true - по часовой, false - против часовой
void setup() {
// Настройка пинов
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(LIMIT_SWITCH_CW_PIN, INPUT_PULLUP);
pinMode(LIMIT_SWITCH_CCW_PIN, INPUT_PULLUP);
// pinMode(ENABLE_PIN, OUTPUT);
// digitalWrite(ENABLE_PIN, LOW);
// Настройка шагового двигателя
stepper.setMaxSpeed(MOTOR_SPEED);
stepper.setAcceleration(1000);
// Установка прерывания для кнопки
attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), toggleMotor, FALLING);
}
void loop() {
// Если мотор включен, двигаться
if (motorEnabled) {
if (motorDirection) {
if (digitalRead(LIMIT_SWITCH_CW_PIN) == LOW) {
// Остановить мотор при достижении концевого выключателя
motorEnabled = false;
stepper.stop();
motorDirection = false;
} else {
stepper.setSpeed(MOTOR_SPEED);
stepper.runSpeed();
}
} else {
if (digitalRead(LIMIT_SWITCH_CCW_PIN) == LOW) {
// Остановить мотор при достижении концевого выключателя
motorEnabled = false;
stepper.stop();
motorDirection = true;
} else {
stepper.setSpeed(-MOTOR_SPEED);
stepper.runSpeed();
}
}
}
}
void toggleMotor() {
// Переключение состояния мотора и направление
motorEnabled = true;
// motorEnabled = !motorEnabled;
// if (motorEnabled) {
// motorDirection = !motorDirection; // Переключить направление при каждом нажатии кнопки
// }
}