// Подключаем библиотеки
#include <Arduino.h>
// Пины
const int dirPin = A2; // Пин DIR драйвера
const int stepPin = A3; // Пин STEP драйвера
const int vrXPin = A4; // Пин для горизонтального движения джойстика
const int vrYPin = A5; // Пин для вертикального движения джойстика
const int swPin = A6; // Пин для кнопки джойстика
// Переменные для скорости и количества шагов
int stepDelay = 1000; // Начальная задержка (скорость вращения)
int stepCount = 1; // Начальное количество шагов
bool motorRunning = false; // Состояние мотора
bool lastButtonState = HIGH; // Состояние кнопки для предотвращения дребезга
unsigned long lastDebounceTime = 0; // Время последней обработки кнопки
unsigned long debounceDelay = 50; // Задержка для устранения дребезга
void setup() {
// Инициализация пинов
pinMode(dirPin, OUTPUT);
pinMode(stepPin, OUTPUT);
pinMode(swPin, INPUT_PULLUP);
// Инициализация последовательного монитора
Serial.begin(9600);
}
void loop() {
// Считывание значений с джойстика
int vrX = analogRead(vrXPin); // Считывание горизонтального положения
int vrY = analogRead(vrYPin); // Считывание вертикального положения
int buttonState = digitalRead(swPin); // Считывание состояния кнопки
// Дебаунсинг кнопки
if (buttonState != lastButtonState) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (buttonState == LOW && lastButtonState == HIGH) { // Нажатие кнопки
motorRunning = !motorRunning; // Переключение состояния мотора
delay(500); // Задержка, чтобы избежать дребезга
}
}
lastButtonState = buttonState;
if (motorRunning) {
// Поворот мотора по часовой стрелке на один оборот
for (int i = 0; i < stepCount * 200; i++) {
digitalWrite(dirPin, HIGH); // Установка направления по часовой стрелке
digitalWrite(stepPin, HIGH);
delayMicroseconds(stepDelay);
digitalWrite(stepPin, LOW);
delayMicroseconds(stepDelay);
}
delay(500); // Задержка между оборотами
// Поворот мотора против часовой стрелки на один оборот
for (int i = 0; i < stepCount * 200; i++) {
digitalWrite(dirPin, LOW); // Установка направления против часовой стрелки
digitalWrite(stepPin, HIGH);
delayMicroseconds(stepDelay);
digitalWrite(stepPin, LOW);
delayMicroseconds(stepDelay);
}
delay(500); // Задержка между оборотами
}
// Управление скоростью по вертикали
if (vrY < 200) {
stepDelay = constrain(stepDelay + 10, 1, 1000); // Увеличение скорости
} else if (vrY > 800) {
stepDelay = constrain(stepDelay - 10, 1, 1000); // Уменьшение скорости
}
// Управление количеством шагов по горизонтали
if (vrX < 200) {
stepCount = constrain(stepCount - 1, 1, 1000); // Уменьшение шагов
} else if (vrX > 800) {
stepCount = constrain(stepCount + 1, 1, 1000); // Увеличение шагов
}
// Отладочная информация
Serial.print("Speed: ");
Serial.print(stepDelay);
Serial.print(" Steps: ");
Serial.println(stepCount);
}