Управление двигателями и сервоприводами с помощью 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.
Я создал код с нуля, тестируя каждую функцию по ходу дела, и все хорошо, кроме этой проблемы. Как мне это исправить?
@Jim421616, 👍2
1 ответ
Лучший ответ:
Комментарий, который вы нашли, также находится на странице библиотеки сервоприводов https://www.arduino.cc/en/Reference/servo и является сутью вашей проблемы.
На Uno вам придется изменить выводы ШИМ на 3, 5, 6 или 11, поскольку таймер, который обеспечивает ШИМ для выводов 9 и 10, теперь используется для библиотеки Servo.
Это, вероятно, самый простой вариант, особенно если вы используете модуль L298, поскольку вы сможете просто поменять выводы.
В качестве альтернативы может быть доступна альтернативная библиотека Servo, которая не использует этот таймер (быстрый поиск в Google показал несколько кандидатов, но я не проверял).
- Как заставить сервопривод вращаться на угол больше 180°
- L298N Dual Motor Controller Enable Pin имеет питание, но двигатели не работают
- L298N, HC-05 Простой автомобиль с дистанционным управлением через Bluetooth, не работающий в Arduino
- 6 + 1 двигательей подключенных к arduino uno?
- Почему сервопривод вращается на 360 градусов?
- Как Arduino Uno может поддерживать до 12 сервоприводов, если у него всего 6 цифровых выводов ШИМ?
- L298N издает звуковые сигналы и дает сбой при получении определенных значений AnalogWrite
- PIN Arduino Vin не работает, но питание 5-вольтового контакта Arduino работает