arduino循迹小车代码l298n带PID
时间: 2025-06-23 19:42:49 浏览: 13
### Arduino循迹小车代码实现
对于带有L298N电机驱动器和PID控制器的Arduino循迹小车辆,可以设计如下所示的一个程序结构。此项目通常涉及传感器读取、计算偏差以及通过调整PWM信号来改变两个直流电动机的速度。
#### 初始化部分
定义必要的常量与变量用于存储引脚分配和其他参数设置:
```cpp
// 定义左侧红外线传感器连接到模拟输入A0
const int leftSensorPin = A0;
// 定义右侧红外线传感器连接到模拟输入A1
const int rightSensorPin = A1;
// 左轮电机控制引脚
int IN1 = 7;
int IN2 = 6;
int ENA = 5;
// 右轮电机控制引脚
int IN3 = 4;
int IN4 = 3;
int ENB = 9;
double Kp = 2, Ki = 5, Kd = 1; // PID系数设定
double prevError = 0, integral = 0;
```
#### 设置函数
配置各硬件组件的工作模式并初始化串口通信以便调试输出数据流:
```cpp
void setup() {
Serial.begin(9600);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(ENA, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
pinMode(ENB, OUTPUT);
analogWrite(ENA, 0); // 初始状态下停止左电机
analogWrite(ENB, 0); // 初始状态下停止右电机
}
```
#### 主循环逻辑
持续监测地面反射情况的变化趋势,并据此调节两侧行走机构之间的速度差异以保持直线行驶路径;当检测偏离中心位置时,则依据误差大小适当减速一侧或加速另一侧从而完成自动校正动作[^1]。
```cpp
void loop(){
int sensorValueLeft = analogRead(leftSensorPin);
int sensorValueRight = analogRead(rightSensorPin);
double error = (sensorValueRight - sensorValueLeft)/1023 * 100 ;
integral += error ;
double derivative = error - prevError ;
double output = Kp*error + Ki*integral + Kd*derivative ;
prevError = error ;
int speedDifference = constrain(output,-100,100);
int baseSpeed = 100-abs(speedDifference);
if(sensorValueLeft<50 && sensorValueRight>50){
forward();
setMotorSpeed(baseSpeed-speedDifference ,baseSpeed+speedDifference );
}
}
void forward(){
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);
digitalWrite(IN3,HIGH);
digitalWrite(IN4,LOW);
}
void stopMotors(){
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
}
void setMotorSpeed(int lspeed,int rspeed){
analogWrite(ENA,lspeed);
analogWrite(ENB,rspeed);
}
```
上述代码片段展示了如何构建一个简单的基于Arduino平台的小型移动机器人控制系统,该系统能够沿着预定轨迹前进而不会轻易偏移路线。值得注意的是,在实际应用过程中可能还需要考虑更多因素如环境光照强度变化对感测精度的影响等问题[^2]。
阅读全文
相关推荐


















