Запустить двигатель постоянного тока с помощью кнопки, используя Arduino Uno

Я пытаюсь запустить один двигатель постоянного тока с помощью кнопки. Что я хочу, так это то, что когда я нажимаю кнопку, мотор начинает работать в соответствии с моей потребностью, а когда я нажимаю снова, и только тогда, он останавливается, иначе он продолжит работать. Я пробовал с кодом ниже. Он работает, но проблема в том, что когда я нажимаю кнопку "Стоп", он не останавливается.

const int ENA_PIN = 6; // контакт Arduino, подключенный к контакту EN1 L298N
const int IN1_PIN = 7; // контакт Arduino подключен к контакту IN1 L298N
const int IN2_PIN = 8; // контакт Arduino подключен к контакту IN2 L298N
const int BUTTON_PIN = 2;
bool buttonState = false;
bool buttonBefore = false;
bool pressed = false;

// функция настройки запускается один раз, когда вы нажимаете сброс или питание платы
void setup() {
  // инициализируем цифровые контакты как выход, а контакт кнопки как вход
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  // задержка (100);
  pinMode(ENA_PIN, OUTPUT);
  pinMode(IN1_PIN, OUTPUT);
  pinMode(IN2_PIN, OUTPUT);
}

// функция цикла запускается снова и снова навсегда
void loop() {
  buttonState = digitalRead(BUTTON_PIN);
  if (buttonState > buttonBefore) {
    pressed = !pressed;
  }
  if (pressed) {
    digitalWrite(IN1_PIN, HIGH); // управляющий мотор А вращается по часовой стрелке
    digitalWrite(IN2_PIN, LOW);  // управляющий мотор А вращается по часовой стрелке
    analogWrite(ENA_PIN, 255); // контролируем скорость

    delay(2000); // вращать с максимальной скоростью 2 секунды по часовой стрелке

    // изменить направление
    digitalWrite(IN1_PIN, LOW);   // управляющий двигатель А вращается против часовой стрелки
    digitalWrite(IN2_PIN, HIGH);  // управляющий двигатель А вращается против часовой стрелки

    delay(2500); // вращать с максимальной скоростью 2,5 секунды против часовой стрелки

    analogWrite(ENA_PIN, 255); // контролируем скорость
  }

  buttonBefore = buttonState;  
}

, 👍0

Обсуждение

Почему вы используете задержки, когда вы не хотите делать что-либо по времени с двигателем? Задержки делают вашу кнопку невосприимчивой. Пожалуйста, взгляните на функцию millis() и пример BlinkWithoutDelay в Arduino IDE., @chrisl

добавьте переменную состояния... назовите ее как-нибудь вроде motorOn... кнопка устанавливает свое значение... мотор реагирует на свое значение, @jsotola

почему вы ожидаете, что двигатель остановится? ... ваша программа не содержит никакого кода, который останавливает двигатель, @jsotola

Как я это делаю, когда кнопка нажата и отпущена, дополняет флаг состояния двигателя и включает/выключает двигатель в соответствии с флагом. Это в основном то, что сказал jsotola. Обязательно устраните задержки, как упомянул Крис., @Gil

хорошо. Спасибо за ответ. Я попробовал это с кодом любви, и теперь он работает., @Kishan Boghara

В этом новом коде, когда я нажимаю кнопку, двигатель запускается и завершает цикл по часовой стрелке, против часовой стрелки, который я хочу, и останавливается. проблема в том, что когда я хочу начать снова, мне приходится нажимать кнопку 2 раза. какое-нибудь решение, чтобы запустить двигатель с одним нажатием снова?, @Kishan Boghara


1 ответ


0
const int ENA_PIN = 6; // контакт Arduino, подключенный к контакту EN1 L298N
const int IN1_PIN = 7; // контакт Arduino подключен к контакту IN1 L298N
const int IN2_PIN = 8; // контакт Arduino подключен к контакту IN2 L298N
const int BUTTON_PIN = 2;
int motorState = 0; // Двигатель изначально выключен
int buttonNew;
int buttonOld = 1;
//инт дт = 100;
// функция настройки запускается один раз, когда вы нажимаете сброс или питание платы
void setup() {
  Serial.begin (9600);
  // инициализируем цифровые контакты как выход, а контакт кнопки как вход
  pinMode(BUTTON_PIN, INPUT);
  // задержка (100);
  pinMode(ENA_PIN, OUTPUT);
  pinMode(IN1_PIN, OUTPUT);
  pinMode(IN2_PIN, OUTPUT);
}

// функция цикла запускается снова и снова навсегда
void loop() {
  buttonNew = digitalRead(BUTTON_PIN); //контакт кнопки будет считывать новое состояние кнопки
  // мы сделаем оператор if, чтобы состояние кнопки всегда менялось с 0 на 1
  if(buttonOld == 0 && buttonNew == 1){
    if(motorState == 0){
      digitalWrite(IN1_PIN, HIGH); // управляющий мотор А вращается по часовой стрелке
      digitalWrite(IN2_PIN, LOW);  // управляющий мотор А вращается по часовой стрелке
      analogWrite(ENA_PIN, 255); // контролируем скорость
  

      delay(2000); // вращать с максимальной скоростью 2 секунды по часовой стрелке

  // изменить направление
      digitalWrite(IN1_PIN, LOW);   // управляющий двигатель А вращается против часовой стрелки
      digitalWrite(IN2_PIN, HIGH);  // управляющий двигатель А вращается против часовой стрелки
      analogWrite(ENA_PIN, 255); // контролируем скорость
      delay(2500); // вращать с максимальной скоростью 2,5 секунды против часовой стрелки

      motorState = 1;
    }
    else{
      digitalWrite(IN1_PIN, LOW);
      digitalWrite(IN2_PIN, LOW);
      analogWrite(ENA_PIN, 0);
      motorState = 0; 
    }
  }
  buttonOld = buttonNew;
  // задержка (дт); //чтобы убрать дребезг
  
}
,