Управление двигателями и сервоприводами с помощью L298N

Я использую L298N для управления двумя двигателями роботизированной машины, а также у меня есть сервопривод, управляющий HC-SR04. Двигатели и датчик работают вместе отлично, и сервопривод и датчик работают вместе отлично. Но когда я помещаю их вместе в код, работает только сервопривод. Код

#include <Servo.h>

// двигатель один
int enA = 9;    //включить ШИМ для правого двигателя
int rightFwd = 7;    //вправо вперед
int rightBack = 6;    //вправо назад
// мотор два
int enB = 10;   //включить ШИМ для левого мотора
int leftFwd = 5;    //влево вперед
int leftBack = 4;    //влево назад

//ультразвуковой датчик
int trig = 2;
int echo = 3;

//сервопривод для взгляда влево и вправо
//int servoPin = 8;

int runSpeed = 255;
int distance;
int leftDistance;
int rightDistance;
//int servoCenter = 100;
//int lookAngle = 60;

//Сервопривод серводвигателя;

void setup()
{
  Serial.begin(9600);
  pinMode(enA, OUTPUT);
  pinMode(enB, OUTPUT);
  pinMode(rightFwd, OUTPUT);
  pinMode(rightBack, OUTPUT);
  pinMode(leftFwd, OUTPUT);
  pinMode(leftBack, OUTPUT);
  pinMode(trig, OUTPUT);
  pinMode(echo, INPUT);
// pinMode(servoPin, OUTPUT);

// серводвигатель.attach(servoPin);
// серводвигатель.write(servoCenter);
}

void loop()
{
  test();
}

void goForward()
{
  Serial.println("Going forward");
  analogWrite(enA, runSpeed*3/4);
  analogWrite(enB, runSpeed*3/4);
  digitalWrite(leftBack,LOW);
  digitalWrite(leftFwd,HIGH);
  digitalWrite(rightBack,LOW);
  digitalWrite(rightFwd,HIGH);
}

void goBackward()
{
  Serial.println("Going backward");
  analogWrite(enA, runSpeed*3/4);
  analogWrite(enB, runSpeed*3/4);
  digitalWrite(leftBack,HIGH);
  digitalWrite(leftFwd,LOW);
  digitalWrite(rightBack,HIGH);
  digitalWrite(rightFwd,LOW);
}

void turnLeft()
{
  Serial.println("Turning left");
  analogWrite(enA, runSpeed*3/4);
  analogWrite(enB, runSpeed*3/4);
  digitalWrite(leftBack,HIGH);
  digitalWrite(leftFwd,LOW);
  digitalWrite(rightBack,LOW);
  digitalWrite(rightFwd,HIGH);
}

void turnRight()
{
  Serial.println("Turning right");
  analogWrite(enA, runSpeed*3/4);
  analogWrite(enB, runSpeed*3/4);
  digitalWrite(leftBack,LOW);
  digitalWrite(leftFwd,HIGH);
  digitalWrite(rightBack,HIGH);
  digitalWrite(rightFwd,LOW);
}

void allStop()
{
  Serial.println("Stopping");
  digitalWrite(leftBack,LOW);
  digitalWrite(leftFwd,LOW);
  digitalWrite(rightBack,LOW);
  digitalWrite(rightFwd,LOW);
}

int getDistance()
{
  // Получение расстояния от датчика
  long duration, distance;
  digitalWrite(trig,HIGH);
  delayMicroseconds(1000);
  digitalWrite(trig, LOW);
  duration=pulseIn(echo, HIGH);
  distance =(duration/2)/29.1;
  Serial.print(distance);
  Serial.println("CM");
  delay(10);
  return distance;
}

//int lookRight()
//{
// Serial.println("Смотрим направо\n");
// серводвигатель.write(50);
// задержка(500);
// расстояние int = getDistance();
// задержка(100);
// серводвигатель.write(servoCenter - lookAngle);
// задержка(100);
// серводвигатель.write(servoCenter);
// расстояние возврата;
//}
//
//int lookLeft()
//{
// Serial.println("Смотрим налево\n");
// серводвигатель.write(servoCenter + lookAngle);
// задержка(500);
// расстояние int = getDistance();
// задержка(100);
// серводвигатель.write(servoCenter);
// расстояние возврата;
// задержка(100);
//}

void test()
{
  getDistance();
  goForward();
  delay(1000);
  allStop();
  delay(1000);
  goBackward();
  delay(1000);
  allStop();
  delay(1000);
  turnLeft();
  delay(1000);
  allStop();
  delay(1000);
  turnRight();
  delay(1000);
  allStop();
  delay(1000);
// смотрим влево();
// lookRight();
}

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

Я вижу отсюда , что

На платах, отличных от Mega, использование библиотеки отключает функцию analogWrite() (ШИМ) на контактах 9 и 10, независимо от того, подключен ли к этим контактам сервопривод.

Я использую контакты 9 и 10 как контакты enA и enB соответственно для ШИМ двигателей, а сервопривод подключен к контакту 8.

Я создал код с нуля, тестируя каждую функцию по ходу дела, и все хорошо, кроме этой проблемы. Как мне это исправить?

, 👍2


1 ответ


Лучший ответ:

2

Комментарий, который вы нашли, также находится на странице библиотеки сервоприводов https://www.arduino.cc/en/Reference/servo и является сутью вашей проблемы.

На Uno вам придется изменить выводы ШИМ на 3, 5, 6 или 11, поскольку таймер, который обеспечивает ШИМ для выводов 9 и 10, теперь используется для библиотеки Servo.

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

В качестве альтернативы может быть доступна альтернативная библиотека Servo, которая не использует этот таймер (быстрый поиск в Google показал несколько кандидатов, но я не проверял).

,