Двигатель постоянного тока Arduino с 2 кнопками

У меня проблема с моим проектом Arduino, и я перепробовал все, чтобы ее исправить, но ничего не помогает.

Я пытаюсь повернуть свой двигатель постоянного тока с помощью двух кнопок:

  • одна кнопка предназначена для остановки/начала вращения с левой стороны, и;
  • второй предназначен для остановки/начала вращения с правой стороны.

Я не могу переключать состояния, и если двигатель вращается, я не могу его остановить. Скорость регулируется потенциометром и работает нормально, проблема только в кнопках. Я надеюсь, что кто-нибудь сможет мне помочь.

int enablePin = 11;
int in1Pin = 10;
int in2Pin = 9;
int switchPin = 7;
int switchPin1 = 6;
int potPin = 0;
int statusPin= 13;
boolean status;

void setup()
{
  pinMode(in1Pin, OUTPUT);
  pinMode(in2Pin, OUTPUT);
  pinMode(enablePin, OUTPUT);

  pinMode(switchPin, INPUT_PULLUP);
  pinMode(switchPin1, INPUT_PULLUP);

  pinMode(statusPin,OUTPUT);
  Serial.begin(9600);
}

void loop()
{
  digitalWrite(13,HIGH);

  int speed = analogRead(potPin) / 4;

  boolean reverse = digitalRead(switchPin);
  boolean reverse1 = digitalRead(switchPin1);

  if(reverse == false){
    status = true;
  }
  if(reverse1 == false){
    status == false;
  }

  setMotor(speed, status);
}

void setMotor(int speed, boolean reverse)
{
  analogWrite(enablePin, speed);

  digitalWrite(in1Pin, ! reverse);
  digitalWrite(in2Pin, reverse);
}

Я только что добавил вторую кнопку с краской, так что не путайтесь.

Fritzing diagram

, 👍0

Обсуждение

Вы пробовали простой скетч, который вращается вправо, и другой, который вращается влево, чтобы убедиться, что, по крайней мере, это работает ?, @Andre Courchesne

Кроме того, форматируйте и комментируйте свой код, который будет намного легче читать., @Andre Courchesne


1 ответ


1

В вашем коде кнопки управляют только направлением, но не включают и не выключают двигатель. Это можно сделать только с помощью потенциометра, который можно установить на нулевую скорость.

Чтобы действительно включить двигатель с помощью кнопок, вы должны добавить некоторую логику для контакта включения. Например, измените функцию setMotor() и задайте ей также логический параметр as, который указывает на включение двигателя:

void setMotor(int speed, boolean enabled, boolean reverse)
{
    if(enabled) analogWrite(enablePin, speed);
    else        analogWrite(enablePin, 0);
    digitalWrite(in1Pin, ! reverse);
    digitalWrite(in2Pin, reverse);
}

Вы можете задать соответствующую логическую переменную в функции loop (), как вы сделали с переменной состояния. Установите для этой новой переменной значение true в обоих операторах if кнопок. В качестве альтернативы вы можете сделать это встроенным вызовом setMotor (), написав:

setMotor(speed, reverse || reverse1, status);

| | - это логическая операция ИЛИ. Он возвращает значение true, если какой-либо из обоих операндов является истинным. Аналогичным образом вы можете отказаться от другого оператора if с переменной состояния:

setMotor(speed, reverse || reverse1, !reverse && reverse1);

! отрицает значение обратного и && выполняет логическое И. Вы можете сами решить, хотите ли вы использовать операторы if (которые немного легче читать) или эти логические операторы (которые более компактны).


Также вам следует использовать лучшие имена переменных. реверс и реверс 1 на самом деле не очень хорошо различаются. Лучше было бы наоборот и вперед.

,