pid循跡小車的實現,arduino

幫我寫一個Arduino循跡小車的程序,小車前面有並列8個紅外發射接收傳感器,每個紅外發射接收傳感器爲1cm寬,地面循跡的線是大約2cm寬黑色的線,地面其他位置是白色的,要求循跡小車運行的速度快,使用pid算法控制速度實現精準的轉向

 

首先,我們需要定義紅外線傳感器的引腳和變量:

const int numSensors = 8;  // 傳感器的數量
const int sensors[numSensors] = {A0, A1, A2, A3, A4, A5, A6, A7};  // 傳感器的引腳
int sensorValues[numSensors];  // 保存傳感器的值

  接下來,定義PID算法中需要使用的變量:

float Kp = 0.2;  // 比例係數
float Kd = 0.1;  // 微分系數
float Ki = 0.05;  // 積分系數
float lastError = 0;  // 上一次的誤差
float totalError = 0;  // 總誤差

  在setup()函數中初始化引腳:

void setup() {
  for (int i = 0; i < numSensors; i++) {
    pinMode(sensors[i], INPUT);
  }
}

  在loop()函數中,讀取傳感器的值並計算PID輸出:

void loop() {
  // 讀取傳感器的值
  for (int i = 0; i < numSensors; i++) {
    sensorValues[i] = digitalRead(sensors[i]);
  }

  // 計算誤差
  float error = 0;
  float sum = 0;
  for (int i = 0; i < numSensors; i++) {
    error += (i - 3.5) * sensorValues[i];  // i - 3.5 是爲了讓誤差在[-3.5, 3.5]之間
    sum += sensorValues[i];
  }
  if (sum == 0) {  // 避免除0錯誤
    return;
  }
  error /= sum;

  // 計算PID輸出
  float pidOutput = Kp * error + Kd * (error - lastError) + Ki * totalError;
  lastError = error;
  totalError += error;

  // 控制小車運動
  int leftSpeed = 200 + pidOutput;  // 左輪的速度
  int rightSpeed = 200 - pidOutput;  // 右輪的速度
  if (leftSpeed > 255) {  // 速度限制在[0, 255]之間
    leftSpeed = 255;
  } else if (leftSpeed < 0) {
    leftSpeed = 0;
  }
  if (rightSpeed > 255) {
    rightSpeed = 255;
  } else if (rightSpeed < 0) {
    rightSpeed = 0;
  }
  analogWrite(3, leftSpeed);  // 控制左輪速度的引腳
  analogWrite(5, rightSpeed);  // 控制右輪速度的引腳
}

  其中,error表示當前的偏差,pidOutput表示PID算法計算出的控制量,leftSpeedrightSpeed表示左右輪的速度

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章