四路红外循迹小车代码弯道
时间: 2025-03-03 08:31:20 浏览: 54
### 四路红外循迹小车弯道行驶代码示例
对于四路红外循迹小车,在遇到弯道时,通过调整左右电机的速度差可以让小车顺利转弯。下面是一个基于 Arduino 的 C++ 代码示例,该程序能够使带有四个红外传感器的小车在检测到黑色轨迹线的情况下自动转向。
```cpp
// 定义常量和变量
const int leftMotorPin1 = 7; // 左侧电机控制引脚之一
const int leftMotorPin2 = 8;
const int rightMotorPin1 = 4; // 右侧电机控制引脚之一
const int rightMotorPin2 = 5;
int sensorPins[] = {A0, A1, A2, A3}; // 红外传感器连接至模拟输入口
bool lineSensors[4]; // 存储各传感器状态数组
long lastTime = millis(); // 上次调用的时间戳
float Kp = 1.0f, Ki = 0.0f, Kd = 0.0f; // PID参数设置
float errorSum = 0.0f, prevError = 0.0f; // 积分项与前一次误差初始化
void setup() {
pinMode(leftMotorPin1, OUTPUT);
pinMode(leftMotorPin2, OUTPUT);
pinMode(rightMotorPin1, OUTPUT);
pinMode(rightMotorPin2, OUTPUT);
Serial.begin(9600); // 初始化串行通信波特率为9600bps
for (int i=0 ;i<4;i++) // 设置所有传感器管脚模式为INPUT
pinMode(sensorPins[i], INPUT);
}
void loop(){
readLineSensors();
float position = calculatePosition(lineSensors); // 计算当前位置偏差
long currentTime = millis();
float deltaTime = (currentTime - lastTime)/1000.0f; // 时间间隔转换成秒单位
float error = -(position - 2.0f); // 设定目标位置位于中间两传感器之间
errorSum += error * deltaTime;
float dError = (error - prevError) / deltaTime;
float output = Kp*error + Ki*errorSum + Kd*dError; // 应用PID算法计算输出值
setMotors(output); // 调整马达速度以纠正路径偏离
delay(20); // 延迟一段时间再读取新的数据
lastTime = currentTime;
prevError = error;
}
void readLineSensors(){ // 获取当前各个传感器的状态
for(int i=0;i<4;i++){
bool state = digitalRead(sensorPins[i]) == LOW ? true : false;
lineSensors[i] = state;
}
}
float calculatePosition(bool sensors[]){
if(sensors[0]==true && sensors[1]==false && sensors[2]==false && sensors[3]==false){
return 0.0f;} // 当只有最左边的传感器被触发时返回最小偏移量
else if(sensors[0]==true && sensors[1]==true && sensors[2]==false && sensors[3]==false){
return 1.0f;}
else if(sensors[0]==false && sensors[1]==true && sensors[2]==false && sensors[3]==false){
return 2.0f;} // 中间左侧两个传感器均被激活则认为处于理想中心位置
else if(sensors[0]==false && sensors[1]==true && sensors[2]==true && sensors[3]==false){
return 3.0f;}
else if(sensors[0]==false && sensors[1]==false && sensors[2]==true && sensors[3]==false){
return 4.0f;}
else if(sensors[0]==false && sensors[1]==false && sensors[2]==true && sensors[3]==true){
return 5.0f;}
else if(sensors[0]==false && sensors[1]==false && sensors[2]==false && sensors[3]==true){
return 6.0f;} // 最右边的传感器单独工作表示最大正向偏移
else{
return 2.0f;} // 默认情况下假设车辆保持直线前进
}
void setMotors(float correction){ // 根据给定修正系数改变两侧电机转速实现转向功能
const unsigned char maxSpeed = 255;
byte speedLeft = constrain(maxSpeed-(correction), 0, maxSpeed);
byte speedRight = constrain(maxSpeed+(correction), 0, maxSpeed);
analogWrite(leftMotorPin1,speedLeft);
digitalWrite(leftMotorPin2,HIGH);
analogWrite(rightMotorPin1,speedRight);
digitalWrite(rightMotorPin2,HIGH);
}
```
上述代码实现了基本的功能需求,并且利用了PID控制器来优化跟踪效果[^2]。需要注意的是实际应用过程中可能还需要针对具体硬件平台做适当修改以及微调PID参数获得最佳性能表现。
阅读全文
相关推荐


















