幫我寫一個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算法計算出的控制量,leftSpeed
和rightSpeed
表示左右輪的速度