Почему я не могу контролировать скорость двигателя? (М1 и Е1)

Когда комментируется myservo_1,myservo_2,myservo_3,myservo_4, я не могу контролировать скорость своего двигателя M1. Но только когда я раскомментирую myservo_1 и так далее, я снова могу управлять скоростью двигателя.

Кто-нибудь может мне помочь? Мои коды перечислены ниже:

#include <Servo.h>
Servo myservo_1;
Servo myservo_2;
Servo myservo_3;
Servo myservo_4;

int SensorL = 0;
int SensorR = 0;
int SensorM = 0;

#define E1 10
#define M1 12
#define E2 11
#define M2 13
int pos = 0;
int incomingByte = 0;

void setup()
{
  Serial.begin(9600);
  myservo_1.attach(9);
  myservo_2.attach(8);
  myservo_3.attach(7);
  myservo_4.attach(6);
  pinMode(SensorL, INPUT);
  pinMode(SensorR, INPUT);
  pinMode(SensorM, INPUT);
  pinMode(M1, OUTPUT);
  pinMode(M2, OUTPUT);
// pinMode(E1, OUTPUT);
// pinMode(E2, OUTPUT);
}

void loop()
{
  SensorR = digitalRead(2);
  SensorL = digitalRead(3);
  SensorM = digitalRead(5);

  if (SensorL == LOW && SensorR == LOW && SensorM == HIGH)
  {
    digitalWrite(M1, HIGH);
    digitalWrite(M2, HIGH);
    analogWrite(E1, 255);
    analogWrite(E2, 255);
    Serial.println(" FORWARD ");
    // задержка (1);
  }
  if (SensorL == HIGH && SensorR == LOW && SensorM == HIGH)
  {
    digitalWrite(M1, HIGH);
    digitalWrite(M2, LOW);
    analogWrite(E1, 255);
    analogWrite(E2, 255);
    Serial.println(" LEFT ");
    // задержка (1);
  }
  if (SensorL == LOW && SensorR == HIGH && SensorM == HIGH) //движемся вправо
  {
    digitalWrite(M1, LOW);
    digitalWrite(M2, HIGH);
    analogWrite(E1, 255);
    analogWrite(E2, 255);
    Serial.println(" RIGHT ");
    // задержка (1);
  }

  if (SensorL == HIGH && SensorR == HIGH && SensorM == HIGH) // стоп
  {
    digitalWrite(M1, HIGH);
    digitalWrite(M2, HIGH);
    analogWrite(E1, 0);
    analogWrite(E2, 0);
    Serial.println(" STOP ");
    // задержка (1);
  }

  if (SensorL == HIGH && SensorR == LOW && SensorM == LOW) //движемся влево
  {
    digitalWrite(M1, HIGH);
    digitalWrite(M2, LOW);
    analogWrite(E1, 125);
    analogWrite(E2, 125);
    Serial.println(" LEFT ");
    // задержка (1);
  }

  if (SensorL == LOW && SensorR == HIGH && SensorM == LOW) //движемся вправо
  {
    digitalWrite(M1, LOW);
    digitalWrite(M2, HIGH);
    analogWrite(E1, 125);
    analogWrite(E2, 125);
    Serial.println(" MoVE Right ");
    // задержка (1);
  }


  if (Serial.available() > 0)
  {
    incomingByte = Serial.read();
    {
      {
        if (incomingByte == 'J')//ОХРАНА ОТКРЫТА
        {
          myservo_1.write(0);
          Serial.println(" ARM OPEN ");
        }
        if (incomingByte == 'L')//ВЗЯТИЕ ЗАКРЫТИЯ
        {
          myservo_1.write(180);
          Serial.println(" ARM CLOSE ");
        }
        if (incomingByte == 'I')//ВООРУЖЕНИЕ
        {
          myservo_2.write(0);
          myservo_3.write(180);
          Serial.println(" ARM UP ");
        }
        if (incomingByte == 'K')//ВЗЯТИЕ
        {
          myservo_2.write(180);
          myservo_3.write(0);
          Serial.println(" ARM DOWN ");
        }
        if (incomingByte == 'U')//ПОВЕРНУТЬ ВЛЕВО
        {
          myservo_4.write(0);
          Serial.println(" ROTATE LEFT ");
        }
        if (incomingByte == 'O')//ПОВЕРНУТЬ ВПРАВО
        {
          myservo_4.write(180);
          Serial.println(" ROATE RIGHT ");
        }
        if (incomingByte == 'M')
        {
          myservo_1.write(90);
          myservo_2.write(90);
          myservo_3.write(90);
          myservo_4.write(90);
          Serial.println(" ALL STOP ");
        }
        if (incomingByte == 'N')//ARM STOP
        {
          myservo_1.write(90);
          Serial.println(" ARM STOP ");
        }
        if (incomingByte == 'B')//ВВЕРХ ВНИЗ СТОП
        {
          myservo_2.write(90);
          myservo_3.write(90);
          Serial.println(" UP DOWN STOP ");
        }
        if (incomingByte == 'V')//СТОП ВРАЩЕНИЯ
        {
          myservo_4.write(90);
          Serial.println(" ROTATION STOP ");
        }
        if (incomingByte == 'W')
        {
          digitalWrite(M1, HIGH);
          digitalWrite(M2, HIGH);
          analogWrite(E1, 200);
          analogWrite(E2, 0);
          Serial.println(" FORWARD ");
        }
        if (incomingByte == 'Z')
        {
          digitalWrite(M1, HIGH);
          digitalWrite(M2, HIGH);
          analogWrite(E1, 255);
          analogWrite(E2, 255);
          Serial.println(" FORWARD ");
          delay(100);
        }
        if (incomingByte == 'S')
        {
          digitalWrite(M1, LOW);
          digitalWrite(M2, LOW);
          analogWrite(E1, 255);
          analogWrite(E2, 255);
          Serial.println(" REVERSE ");
        }
        if (incomingByte == 'A')
        {
          digitalWrite(M1, HIGH);
          digitalWrite(M2, LOW);
          analogWrite(E1, 255);
          analogWrite(E2, 255);
          Serial.println(" LEFT ");
        }
        if (incomingByte == 'D')
        {
          digitalWrite(M1, LOW);
          digitalWrite(M2, HIGH);
          analogWrite(E1, 255);
          analogWrite(E2, 255);
          Serial.println(" TURNING RIGHT ");
        }
        if (incomingByte == 'X')
        {
          digitalWrite(M1, LOW);
          digitalWrite(M2, HIGH);
          analogWrite(E1, 0);
          analogWrite(E2, 0);
          Serial.println(" STOP MANAUAL ");
        }
        if (incomingByte == 'w')
        {
          digitalWrite(M1, HIGH);
          digitalWrite(M2, HIGH);
          analogWrite(E1, 125);
          analogWrite(E2, 125);
          Serial.println(" SLOW FORWARD ");
        }
        if (incomingByte == 's')
        {
          digitalWrite(M1, LOW);
          digitalWrite(M2, LOW);
          analogWrite(E1, 125);
          analogWrite(E2, 125);
          Serial.println(" SLOW REVERSE ");
        }
        if (incomingByte == 'a')
        {
          digitalWrite(M1, HIGH);
          digitalWrite(M2, LOW);
          analogWrite(E1, 125);
          analogWrite(E2, 125);
          Serial.println(" SLOW LEFT ");
        }
        if (incomingByte == 'd')
        {
          digitalWrite(M1, LOW);
          digitalWrite(M2, HIGH);
          analogWrite(E1, 125);
          analogWrite(E2, 125);
          Serial.println(" SLOW RIGHT ");
        }
      }
    }
  }
}

, 👍0


2 ответа


1

Библиотека Servo использует таймер 1 для отправки сигналов на сервоприводы. Но таймер 1 также используется для запуска ШИМ на контактах 9 и 10. Однако он не может работать одновременно.

Поскольку двигатель E1 использует контакт 10, а таймер 1 уже используется библиотекой сервоприводов, ШИМ и, соответственно, analogWrite не работает. р>

E2 использует контакт 11, который использует таймер 2 для ШИМ, поэтому на него это не влияет.

Поэтому переместите E1 на один из контактов ШИМ, кроме 9 и 10, и все должно снова заработать.

Однако я не знаю, почему M1 не работает.

,

Я изменил контакт для моего сервопривода 2 3 5 6, поэтому это не повлияет на контакты 9 и 10, но у кого бы он ни был, он все еще не работает должным образом, но мой E2 M2 все еще работает нормально. Есть ли другой метод устранения неполадок? Кстати большое спасибо!, @Eugene24Tab

Это не то, что я сказал. Вы можете использовать как библиотеку сервоприводов (неважно, какие контакты вы используете для сервоприводов), так и ШИМ на контактах 9 и 10. Поскольку вам **нужна** библиотека сервоприводов, вы не можете использовать контакты 9 и 10 для ШИМ. Таким образом, вам нужно изменить контакт для этого двигателя, который в настоящее время подключен к контакту 10. Замена контактов сервопривода здесь **не** помогает., @Gerben


0
  • Пожалуйста, исправьте свой код, есть несколько ошибок, например
    1. строки в начале цикла SensorR = digitalRead(2); SensorL = цифровое чтение (3); SensorM = цифровое чтение (5); нет никакого смысла.. как вы не определили 2,3,5 контакт как вход. И для приема аналогового ввода пожалуйста, измените контакты 2,3,5 и аналоговые контакты..
    2. Выводы двигателя M1 и M2 подключены 12,13, которые не являются контактами pwm, поэтому вы не можете использовать их для изменения скорости вашего двигателя. Пожалуйста, сделайте это код разумный....
,

E1 E2 используются контактами pwm для управления скоростью, а датчик ir определен как ввод выше., @Eugene24Tab