Код не выполняется надежно при активации кнопки

Я собрал следующий код для активации двигателя с помощью 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);
      }
    }

, 👍2


1 ответ


1

Bounce.fell() возвращает true, только если входные данные упали с момента последнего обновления(). Таким образом, ваш код будет работать только в том случае, если обе кнопки нажаты одновременно.

Я предлагаю вам записать время нажатия каждой кнопки и выполнить код, если время нажатия составляет менее 100 мс. Это должно обеспечить надежную работу.

Вы можете проверить, в этом ли проблема, просто удалив вызов debouncer2.fell(). Тогда код должен работать надежно при нажатии только кнопки 1.

,