Линия после робота с использованием 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 и заранее благодарю вас за вашу помощь.

, 👍1

Обсуждение

Батарея 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ê