//Nucleo C031c6
#define stp 3
#define dir 2
#define btn1 5
#define btn2 6
#define POT A2
#define btn3 4
#define btn4 7
bool motorRunning = false;
void setup() {
pinMode(stp, OUTPUT);
pinMode(dir, OUTPUT);
pinMode(btn1, INPUT_PULLUP);
pinMode(btn2, INPUT_PULLUP);
pinMode(btn3, INPUT_PULLUP);
pinMode(btn4, INPUT_PULLUP);
}
void loop() {
// Обработка управления направлением
if (digitalRead(btn1) == LOW) {
digitalWrite(dir, HIGH); // Вперёд
delay(50); // Простой debounce
}
if (digitalRead(btn2) == LOW) {
digitalWrite(dir, LOW); // Назад
delay(50);
}
// Обработка запуска/остановки
if (digitalRead(btn4) == LOW) {
motorRunning = true; // Запуск
delay(200);
}
if (digitalRead(btn3) == LOW) {
motorRunning = false; // Остановка
delay(200);
}
// Если двигатель запущен — делаем шаги
if (motorRunning) {
digitalWrite(stp, HIGH);
// Считываем потенциометр: чем больше значение — тем МЕНЬШЕ задержка → БЫСТРЕЕ вращение
int potValue = analogRead(POT);
int stepDelay = map(potValue, 0, 1023, 20, 1); // ИНВЕРТИРОВАННЫЙ диапазон: от 20 мс до 1 мс
// Ограничиваем минимальную задержку, чтобы не было проблем с драйвером/двигателем
if (stepDelay < 1) stepDelay = 1;
delay(stepDelay);
digitalWrite(stp, LOW);
delay(stepDelay);
} else {
delay(10); // Экономим процессор, когда двигатель остановлен
}
}
#engine Simulation