//Піни керування кроковим двигуном
#define STEP_PIN 3
#define DIR_PIN 2
#define ENABLE_PIN 4
// #define MS1 10
// #define MS2 9
// #define MS3 8
//Пін кнопки
#define start_button 6
//Тут можна налаштувати час повороту та паузи
#define move_forward_time 2000 //час прямого ходу до мсек
#define move_back_time 2000 //час зворотного ходу до мсек
#define pause_time 1000 //час паузи до мсек
#define frequency 2750 //Час між імпульсами у мксек. 1000 мксек = 1 мсек = 0.001 сек. Частота проходження імпульсів 1/0.001 = 1 кГц,
//Таймер для millis()
uint32_t timer = 0;
//Логічний прапор для робочого режиму
bool flag = 0;
void setup() {
pinMode(start_button, INPUT_PULLUP); //Підтягуємо кнопку до живлення
pinMode(STEP_PIN, OUTPUT); //Налаштовуємо піни керування
pinMode(DIR_PIN, OUTPUT);
pinMode(ENABLE_PIN, OUTPUT);
digitalWrite(ENABLE_PIN, HIGH); //Вимикаємо двигун, щоб не грівся
Serial.begin(9600);
Serial.println("Hi");
}
void loop () {
if (!digitalRead(start_button)) { //Якщо кнопку натиснуто
Serial.println("Start");
digitalWrite(ENABLE_PIN, LOW); //Вмикаємо двигун
flag = 1; //Активируємо прапор робочого режиму
timer = millis(); //Запускаємо таймер
}
if (flag) { //Если флаг активирован
digitalWrite(DIR_PIN, HIGH); //Задаємо напрямок обертання
///////////////////////////Для керування за допомогою кількості кроків//////////////
// for (int i = 0; i < 200; i++) { //Виконуємо необхідну кількість кроків 200 (використовується повний крок)
// digitalWrite(STEP_PIN , HIGH);
// delayMicroseconds(frequency);
// digitalWrite(STEP_PIN , LOW);
// }
// Serial.println("End");
// flag = 0;
///////////////////////////Для керування за допомогою часу///////////////////////
do { // Крутимо двигун move_forward_time мсек
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(frequency);
digitalWrite(STEP_PIN, LOW);
} while (millis() - timer < move_forward_time);
delay(pause_time); //Пауза pause_time мсек
timer = millis(); //Знову запускаємо таймер
digitalWrite(DIR_PIN, LOW); //Крутимо двигун move_back_time мсек
do {
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(frequency);
digitalWrite(STEP_PIN, LOW);
} while (millis() - timer < move_back_time);
Serial.println("End");
flag = 0; //Гасимо прапор
digitalWrite(ENABLE_PIN, HIGH); //Вимикаємо двигун, щоб не грівся
}
}