джойстик с правильными значениями 561
тот который ранее был тоже отлично работает не хуже
выкладываю сюда чтобы не потерять
#define ENABLE_PIN 8 // Пин для включения/выключения драйвера мотора
#define STEP_PIN 4 // Пин для подачи сигнала на шаговый мотор
#define DIR_PIN 7 // Пин для определения направления вращения мотора
volatile int joystickValue = 560; // Глобальная переменная для хранения значения джойстика
void setup() {
Serial.begin(115200); // Инициализация последовательного порта
pinMode(ENABLE_PIN, OUTPUT); // Установка пина включения драйвера как выход
pinMode(STEP_PIN, OUTPUT); // Установка пина шага как выход
pinMode(DIR_PIN, OUTPUT); // Установка пина направления как выход
digitalWrite(ENABLE_PIN, LOW); // Включаем драйвер мотора
// Настройка АЦП
ADMUX = (1 << REFS0) | (1 << ADLAR); // Опорное напряжение AVCC, ADC0
DIDR0 = 1 << ADC0D; // Отключаем цифровую часть АЦП для пина ADC0
ADCSRA = (1 << ADEN) | (1 << ADPS0) | (1 << ADPS2); // Включаем АЦП с делителем 1/32
}
void loop() {
// Обрабатываем джойстик
handleJoystick();
}
// Быстрое считывание 10-битного значения с АЦП
uint32_t ADCfast_10bit() {
uint32_t H, L;
ADCSRA |= (1 << ADSC); // Запускаем преобразование
while (ADCSRA & (1 << ADSC)); // Ждем завершения преобразования
L = ADCL; // Считываем младший байт
H = ADCH; // Считываем старший байт
return (H << 2) | (L >> 6); // Возвращаем 10-битное значение
}
void handleJoystick() {
// Обработка джойстика
uint32_t T; // Переменная для задержки
joystickValue = ADCfast_10bit(); // Считываем значение с джойстика
Serial.println(joystickValue); // Выводим значение joystickValue в последовательный порт
if (joystickValue >= 570) { // Если джойстик отклонен вправо
T = (uint32_t)map(joystickValue, 570, 1023, 255, 0); // Мапируем значение для скорости
digitalWrite(ENABLE_PIN, LOW); // Включаем драйвер мотора
digitalWrite(DIR_PIN, HIGH); // Устанавливаем направление
for (uint32_t i = 0; i < 4; i++) { // Выполняем несколько шагов
digitalWrite(STEP_PIN, HIGH); // Активируем шаг
delayMicroseconds(T); // Задержка для скорости
digitalWrite(STEP_PIN, LOW); // Деактивируем шаг
delayMicroseconds(T); // Задержка для скорости
}
}
else if (joystickValue < 550) { // Если джойстик отклонен влево
T = (uint32_t)map(joystickValue, 550, 0, 255, 0); // Мапируем значение для скорости
digitalWrite(ENABLE_PIN, LOW); // Включаем драйвер мотора
digitalWrite(DIR_PIN, LOW); // Устанавливаем направление
for (uint32_t i = 0; i < 4; i++) { // Выполняем несколько шагов
digitalWrite(STEP_PIN, HIGH); // Активируем шаг
delayMicroseconds(T); // Задержка для скорости
digitalWrite(STEP_PIN, LOW); // Деактивируем шаг
delayMicroseconds(T); // Задержка для скорости
}
}
if (joystickValue >= 1000) {
for (uint32_t i = 0; i < 6; i++) { // Выполняем несколько шагов
digitalWrite(STEP_PIN, HIGH); // Активируем шаг
delayMicroseconds(T); // Задержка для скорости
digitalWrite(STEP_PIN, LOW); // Деактивируем шаг
delayMicroseconds(T); // Задержка для скорости
}
}
}