Код не выполняется надежно при активации кнопки
Я собрал следующий код для активации двигателя с помощью Arduino Uno с помощью кнопок.
- Две кнопки должны быть нажаты одновременно, чтобы активировать двигатель на определенное количество шагов.
- затем, когда обе кнопки будут нажаты еще раз, двигатель начнет вращаться в обратном направлении, возвращая двигатель в исходное положение.
Код работает, но не при каждом нажатии кнопки. Я просмотрел каждую строку кода и не нашел проблемы. Я знаю, что соединения правильные, поскольку код иногда выполняется, но я не знаю, есть ли в коде ошибка, вызывающая ненадежный ответ, или у меня неисправные/дешевые кнопки с плохими соединениями.
#include <Bounce2.h> // Подключаем библиотеку Bounce2
// Определить подключения шагового двигателя:
#define dirPin 3
#define stepPin 2
#define motorEnablePin 4 // Контакт включения драйвера двигателя
#define buttonPin 8 // Кнопка, подключенная к контакту 8
#define buttonPin2 9 // Кнопка, подключенная к контакту 8
boolean motorRunning = false; // Флаг для отслеживания вращения двигателя
boolean oddRotation = true; // Флаг для отслеживания нечетных/четных вращений
// Создаём объект Bounce для кнопки
Bounce debouncer1 = Bounce();
Bounce debouncer2 = Bounce();
void setup() {
// Объявляем контакты как выходные или входные:
pinMode(stepPin, OUTPUT);
pinMode(dirPin, OUTPUT);
pinMode(motorEnablePin, OUTPUT); // Включить вывод в качестве вывода
pinMode(buttonPin, INPUT_PULLUP); // Используем внутренний подтягивающий резистор для кнопки
pinMode(buttonPin2, INPUT_PULLUP); // Используем внутренний подтягивающий резистор для кнопки
digitalWrite(dirPin, LOW); // Устанавливаем направление вращения CW/CCW
digitalWrite(motorEnablePin, HIGH); // Изначально отключаем драйвер двигателя
// Прикрепляем дебаунсёр к контакту кнопки
debouncer1.attach(buttonPin);
debouncer2.attach(buttonPin2);
debouncer1.interval(50); // Устанавливаем время устранения дребезга
debouncer2.interval(50);
}
void loop() {
// Обновляем дебаунсер
debouncer1.update();
debouncer2.update();
if (debouncer1.fell() && debouncer2.fell()) {
// Кнопка нажата, двигатель не работает, инициируем вращение двигателя
motorRunning = true;
oddRotation = !oddRotation; // Переключаем направление вращения
int stepsPerRevolution = 200; // Количество шагов за один полный оборот
int desiredRevolutions = 10; // Количество желаемых оборотов
int totalSteps = stepsPerRevolution * desiredRevolutions;
int stepCount = 0; // Счетчик сделанных шагов
// Устанавливаем направление вращения двигателя
digitalWrite(dirPin, oddRotation ? LOW : HIGH);
// Включаем драйвер двигателя
digitalWrite(motorEnablePin, LOW);
while (stepCount < totalSteps) {
// Вращаем двигатель
digitalWrite(stepPin, HIGH);
delayMicroseconds(600);
digitalWrite(stepPin, LOW);
delayMicroseconds(600);
stepCount++;
// Если желаемое количество оборотов достигнуто, останавливаем двигатель
if (stepCount >= totalSteps) {
// Отключаем драйвер двигателя
digitalWrite(stepPin, LOW);
digitalWrite(motorEnablePin, HIGH);
// Сбрасываем флаг остановки вращения двигателя
motorRunning = false;
}
}
// Отключаем драйвер двигателя при простое
digitalWrite(motorEnablePin, HIGH);
}
}
@chandler, 👍2
1 ответ
Bounce.fell() возвращает true, только если входные данные упали с момента последнего обновления(). Таким образом, ваш код будет работать только в том случае, если обе кнопки нажаты одновременно.
Я предлагаю вам записать время нажатия каждой кнопки и выполнить код, если время нажатия составляет менее 100 мс. Это должно обеспечить надежную работу.
Вы можете проверить, в этом ли проблема, просто удалив вызов debouncer2.fell(). Тогда код должен работать надежно при нажатии только кнопки 1.
- Двигатель постоянного тока Arduino с 2 кнопками
- Шаговый двигатель не изменяет направления движения!
- Нужна помощь в создании кода, который перемещает двигатель постоянного тока CW или CCW с помощью двух разных кнопок
- 2 кнопки нажаты одновременно, логика лифта
- Проблема с двигателем постоянного тока
- Как запустить 3 режима работы, для каждой операции есть отдельная кнопка для выбора режима в Arduino?
- Бот не активируется после нажатия кнопки
- Rasberry Pi, управляющий Arduino - считывает "призрачный" вход - не завершает логический цикл