Двигатели L298 с регулятором скорости
Proceeding – это часть кода, относящаяся к проблеме, с которой я прошу помощи. Я пытаюсь изменить скорость двигателей роботов с помощью ШИМ. Левая скорость двигателя может быть изменена числовым значением. Правый двигатель не работает. Любые идеи приветствуются. Код скорости двигателя находится в конце скетча. Любая помощь приветствуется.
//Ниже приведены символические константы. Вместо того, чтобы вводить бессмысленный номер контакта каждый раз, когда мы хотим что-то сделать, мы можем написать простое для понимания имя, которое представляет контакт, тогда компилятор заменит имена цифрами.
#define LeftMotorForward 8
#define LeftMotorBackward 9
#define LeftMotorSpeed 10
#define RightMotorForward 6
#define RightMotorBackward 7
#define RightMotorSpeed 5
#define USTrigger 3
#define USEcho 2
#define MaxDistance 100
#define LED 13
//Здесь мы создали два «объекта», один для сервопривода и один для ультразвукового датчика
Servo servo;
NewPing sonar(USTrigger, USEcho, MaxDistance);
//Ниже мы создаем целочисленные переменные без знака, которые мы будем использовать позже в коде. Они не подписаны, так как будут иметь только положительные значения.
unsigned int duration;
unsigned int distance;
unsigned int FrontDistance;
unsigned int LeftDistance;
unsigned int RightDistance;
unsigned int Time;
unsigned int CollisionCounter;
void setup() // Этот блок происходит один раз при запуске
{
Serial.begin(9600); // Я включил инициализацию последовательного порта, но закомментировал его, если вы хотите отлаживать и печатать информацию на последовательном мониторе, просто раскомментируйте
//Здесь мы устанавливаем режимы выводов. Поскольку мы будем отправлять сигналы с контактов, мы устанавливаем их как выходы.
pinMode(LeftMotorForward, OUTPUT);
pinMode(LeftMotorBackward, OUTPUT);
pinMode(LeftMotorSpeed, OUTPUT);
pinMode(RightMotorForward, OUTPUT);
pinMode(RightMotorBackward, OUTPUT);
pinMode(RightMotorSpeed, OUTPUT);
pinMode(LED, OUTPUT);
servo.attach(11); //Сервопривод подключен к контакту 4
}
void loop() // Этот блок повторяется, пока Arduino включен
{
servo.write(90); //Повернуть сервопривод лицом вперед
scan(); //Переходим к функции сканирования
FrontDistance = distance; //Устанавливаем переменную FrontDistance в значение расстояния, возвращаемое функцией сканирования
Serial.println("Front distance = ");
Serial.print(distance);
if(FrontDistance > 40 || FrontDistance == 0) //Если перед роботом ничего нет в пределах 40 см или значение расстояния равно 0 (что для библиотеки newping означает, что пинг не возвращался), тогда...
{
moveForward(); //Переходим к функции moveForward
}
else //иначе (если перед роботом что-то есть в пределах 40 см) то...
{
CollisionCounter = CollisionCounter + 1;
moveStop(); //Переходим к функции moveStop
navigate();
}
}
void moveForward() //Эта функция сообщает роботу двигаться вперед
{
Serial.println("");
Serial.println("Moving forward");
// Включаем левый мотор
digitalWrite (LeftMotorBackward, LOW);
digitalWrite(LeftMotorForward, HIGH);
//установить скорость
analogWrite(LeftMotorSpeed, 100);
// включаем правый мотор
digitalWrite(RightMotorBackward, LOW);
digitalWrite(RightMotorForward, HIGH);
// устанавливаем скорость
analogWrite (RightMotorSpeed, 75);
@Tom Evans, 👍1
Обсуждение3 ответа
Сначала попробуйте закомментировать
Servo servo;
строка и все остальные биты, использующие сервопривод. Если это работает, значит проблема в вас - используйте Mega, возможно, так как это позволяет использовать больше выходов PWM.
Если это не работает с удаленными битами Servo, сообщите об этом и включите модель Arduino, которую вы используете.
Удачи!
целое значение; for(value = 0 ; value <= 75; value+=5) // если значение <= 50, левый двигатель не вращается. >75 вращаются оба двигателя Serial.println(""); Serial.println("Двигаемся вперед"); AnalogWrite(LeftMotorSpeed, value); // значение int не влияет на скорость AnalogWrite (RightMotorSpeed, значение); // то же, что и LeftMotor), @Tom Evans
Спасибо, Энди. Я беру плату Mega и использую контакт 11 на Uno, чтобы избежать конфликта сервоприводов., @Tom Evans
Я прокомментировал все упоминания о сервоприводах, результаты те же. Закомментируйте код сервопривода, похоже, это не имеет значения. Происходит следующее: когда скорость управляется цифровым способом, скорость двигателя меняется. В 50 правый двигатель замедляется, а левый ОСТАНАВЛИВАЕТСЯ. Не знаю, что происходит.
//Эта функция сообщает роботу идти вперед
int value;
for(value = 0 ; value <= 75; value+=5)
//если значение <=50 левый мотор не крутится. >75 оборотов обоих двигателей
Serial.println("");
Serial.println("Moving forward");
analogWrite(LeftMotorSpeed, value);//целое значение не влияет на скорость
analogWrite(RightMotorSpeed, value);// то же, что и LeftMotor)
digitalWrite(LeftMotorBackward, LOW);
digitalWrite(LeftMotorForward, HIGH);
digitalWrite(RightMotorBackward, LOW);
digitalWrite(RightMotorForward, HIGH);
Теперь у вас работают оба двигателя, но они не вращаются с одинаковой скоростью? Распространенная проблема — **возможно** недостаточно тока, поступающего от аккумулятора. Смотрите ответ Джима., @Andy
Вы не отправляете команду скорости двигателю, вы отправляете ему аналоговое напряжение с помощью AnalogWrite. Если это напряжение слишком низкое, двигатель заглохнет. Более высокое значение должно заставить его вращаться быстрее. Если вы хотите, чтобы скорость контролировалась более точно, вам потребуются энкодеры на двигателях, определяющие скорость их вращения, или используйте шаговые двигатели.
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
- Как устранить шум от вентилятора 12 В с ШИМ-управлением на низкой скорости
- Arduino uno + cnc Shield v3 + драйвер шагового двигателя A4988 + AccelStepper?
- Как заставить сервопривод вращаться на угол больше 180°
- Почему Adafruit motor shield не крутит моторы?
- Как управлять 6 шаговыми двигателями с помощью Arduino?
- Пропорциональный контроль расхода воды
- L298N Dual Motor Controller Enable Pin имеет питание, но двигатели не работают
Также спросил [здесь](http://forum.arduino.cc/index.php?topic=382047), @Nick Gammon