Линия после робота с использованием PID управления не работает
В настоящее время я делаю линию, следующую за роботом, используя PID-управление. Мой робот использует плату Arduino Uno, двигатель L298N, батарею 1 9V, 2 двигателя, 5 датчиков инфракрасного света TCRT 5000 для обнаружения черной линии на белой поверхности. Я успешно загрузил код, но мой робот ничего не сделал:
- Оба моих мотора вообще не работали.
- датчики не могли обнаружить линию. Датчики каким-то образом смогли определить расстояние между ним и землей только тогда, когда я поднял робота над землей.
- Проводные соединения в порядке. Когда я использовал мультиметр для измерения напряжения, то обнаружил, что от L298N нет напряжения на оба двигателя. Принципиальная схема, которую я использую: [![введите описание изображения здесь][6]][6]
И вот мой код:
float Kp = 1;
float Ki = 1;
float Kd = 1;
//setup speed of the motors
#define ENAspeed 200
#define ENBspeed 200
#define ENB 5 // Enable pin PWM of the Left motor
#define IN4 6 // pin of left motor
#define IN3 7 // pin of left motor
#define IN2 8 // pin of right motor
#define IN1 9 // pin of right motor
#define ENA 10 // Enable pin PWM of the Right motor
int Sensor[] = {A1, A2, A3, A4, A5};
float P = 0;
float I = 0;
float D = 0;
int Error = 0;
int Previous_Error, Previous_I;
int PID_value;
int Left_Speed, Right_Speed;
void setup(){
pinMode(9, OUTPUT);
pinMode(8, OUTPUT);
pinMode(7, OUTPUT);
pinMode(6, OUTPUT);
pinMode(5, OUTPUT);
pinMode(10, OUTPUT);
pinMode(A1, INPUT);
pinMode(A2, INPUT);
pinMode(A3, INPUT);
pinMode(A4, INPUT);
pinMode(A5, INPUT);
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
analogWrite(ENB, Left_Speed);
analogWrite(ENA, Right_Speed);
for (int i = 1; i <= 5; i++)
{Sensor[i];}
// reading the sensor if HIGH (Black line) or LOW (White line) line
Sensor[1] = digitalRead(A1);
Sensor[2] = digitalRead(A2);
Sensor[3] = digitalRead(A3);
Sensor[4] = digitalRead(A4);
Sensor[5] = digitalRead(A5);
}
void loop() {
//use analogwrite to run motor at adjusted speed
CalculateError();
Calculate_PID();
motor_control();
}
void CalculateError(){
if ((Sensor[1] == 1) && (Sensor[2] == 0) && (Sensor[3] == 0) && (Sensor[4] == 0) && (Sensor[5] == 0))
{Error = 4;}
else if ((Sensor[1] == 1) && (Sensor[2] == 1) && (Sensor[3] == 0) && (Sensor[4] == 0) && (Sensor[5] == 0))
{Error = 3;}
else if ((Sensor[1] == 0) && (Sensor[2] == 1) && (Sensor[3] == 0) && (Sensor[4] == 0) && (Sensor[5] == 0))
{Error = 2;}
else if ((Sensor[1] == 0) && (Sensor[2] == 1) && (Sensor[3] == 1) && (Sensor[4] == 0) && (Sensor[5] == 0))
{Error = 1;}
else if ((Sensor[1] == 0) && (Sensor[2] == 0) && (Sensor[3] == 1) && (Sensor[4] == 0) && (Sensor[5] == 0))
{Error = 0;}
else if ((Sensor[1] == 0) && (Sensor[2] == 0) && (Sensor[3] == 1) && (Sensor[4] == 1) && (Sensor[5] == 0))
{Error = -1;}
else if ((Sensor[1] == 0) && (Sensor[2] == 0) && (Sensor[3] == 0) && (Sensor[4] == 1) && (Sensor[5] == 0))
{Error = -2;}
else if ((Sensor[1] == 0) && (Sensor[2] == 0) && (Sensor[3] == 0) && (Sensor[4] == 1) && (Sensor[5] == 1))
{Error = -3;}
else if ((Sensor[1] == 0) && (Sensor[2] == 0) && (Sensor[3] == 0) && (Sensor[4] == 0) && (Sensor[5] == 1))
{Error = -4;}
//Special case
else if ((Sensor[1] == 0) && (Sensor[2] == 0) && (Sensor[3] == 0) && (Sensor[4] == 0) && (Sensor[5] == 0))
{if (Previous_Error = -4) {Error = -5;}
else if (Previous_Error = 4) {Error = 5;}}
else if ((Sensor[1] == 1) && (Sensor[2] == 1) && (Sensor[3] == 1) && (Sensor[4] == 1) && (Sensor[5] == 1))
{Error = 0;}
}
void Calculate_PID() {
P = Error;
I += Error;
//I = I + Previous_I;
D = Error - Previous_Error;
PID_value = (Kp * P) + (Ki * I) + (Kd * D);
I += Error;
Previous_I = I;
Previous_Error = Error;
}
void motor_control() {
//define new speed limitation for the engine
Left_Speed = constrain (Left_Speed, 0, 255);
Right_Speed = constrain(Right_Speed, 0, 255);
//calculating the effective motor speed:
if ((-5 < Error) and (Error < 0)){
Left_Speed = ENBspeed - PID_value;
Right_Speed = ENAspeed + PID_value;
}
if ((0 < Error) and (Error < 5)){
Left_Speed = ENBspeed + PID_value;
Right_Speed = ENAspeed - PID_value;
}
if (Error == 0){
Left_Speed = ENBspeed;
Right_Speed = ENAspeed;
}
}
Извините за мой плохой английский, если есть какая-то ошибка. Я совсем новичок в Arduino и заранее благодарю вас за вашу помощь.
@Nhật Chương Lê, 👍1
Обсуждение0
Смотрите также:
- Tower Pro MG996R сервопривод с высоким крутящим моментом 180 °, управляющий с помощью Arduino
- Как управлять 4 двигателями постоянного тока с помощью Arduino?
- Как сделать электронную присоску?
- Линия, следующая за проблемами робота
- Наилучший метод проектирования схемы с 20 кнопками
- Могу ли я подключить несколько устройств к одному контакту 5V и одному GND Arduino Uno R3
- Плавное сервомоторное движение роботизированной руки: постоянный ответ и решение
- Как изменить скорость нескольких сервоприводов, работающих одновременно с модулем PCA9685?
Батарея 9 В
... если это обычная блочная батарея, то она хороша только в очень слаботочных приложениях, таких как дымовая сигнализация, @jsotolaтак стоит ли мне использовать вместо этого батарейку типа 4 АА? Спасибо за вашу рекомендацию., @Nhật Chương Lê
- Оба моих мотора вообще не работали ... бессмысленно даже смотреть на ваш код ... во-первых, убедитесь, что вы можете управлять одним мотором ... напишите простой скетч для запуска одного двигателя, в одном направлении, на одну секунду, пауза одна секунда, затем повторите .... затем запустите в противоположном направлении .... затем запустите два двигателя .... каждый раз используйте простой скетч, который делает только одну вещь....... затем перейдите к датчикам.... загорается светодиод, указывающий, что датчик обнаруживает линию, ничего больше ... когда все компоненты заработают, тогда переходите к объединению компонентов, @jsotola
какое напряжение вырабатывают 4 элемента типа АА?, @jsotola
Да, может быть, мне стоит притормозить и попытаться сделать это шаг за шагом. 4AA ячейки, если подключены последовательно, то он будет производить выход 6V. Это тот ответ, который вы ищете?, @Nhật Chương Lê
я не говорю, что вам нужно притормозить ... я хочу сказать, что сначала вам нужно протестировать аппаратное обеспечение ... на данный момент вы не знаете, вызвана ли проблема аппаратным обеспечением или программным обеспечением ... что касается элементов типа АА, то я просто хотел убедиться, что вы знаете о напряжении, потому что вы сказали, что питаетесь с помощью батареи 9 В ... в любом случае, поскольку у вас, вероятно, все подключено, попробуйте заменить батарею, прежде чем приступать к тестированию двигателей и датчиков ... возможно, у вас на самом деле все уже работает, только власть голодала, @jsotola
ЛОЛ думаю проблема решена. Мне действительно понравилось то, что вы предложили, и оказалось, что аппаратное обеспечение, программное обеспечение, проводные соединения в порядке. Робот не двигается из-за 9-вольтовой батареи. Двигатели вращались, но не давали достаточной силы для перемещения робота. Спасибо за вашу помощь, но вместо этого я буду использовать ячейки 4AA., @Nhật Chương Lê