基于Arduino用PID算法实现循迹小车

基于Arduino与PID算法 循迹小车的感受

//  本代码使用pid动态算法,“//后的部分是不用pid”,

const int IN_A1=3;
const int IN_A2=5;
const int IN_B1=6;
const int IN_B2=9;
const int sensor1=A1;
const int sensor2=A2;
const int sensor3=A3;
const int sensor4=A4;
const int sensor5=A5;
float Kp = 20, Ki = 0.01, Kd = 0.1;                    
float error = 0, P = 0, I = 0, D = 0, PID_value = 0;
float previous_error = 0;                
int DIN_A1 = 50;  
int DIN_B1 = 50;  
void setup() {
pinMode(IN_A1,OUTPUT);
pinMode(IN_A2,OUTPUT);
pinMode(IN_B1,OUTPUT);
pinMode(IN_B2,OUTPUT);
pinMode(sensor1,INPUT);
pinMode(sensor2,INPUT);
pinMode(sensor3,INPUT);
pinMode(sensor4,INPUT);
pinMode(sensor5,INPUT);
}
void loop() {
char num2,num3,num5,num1,num4;
num1=digitalRead(sensor1);
num2=digitalRead(sensor2);
num3=digitalRead(sensor3);
num4=digitalRead(sensor4);
num5=digitalRead(sensor5);
if(num1==0&&num2!=0&&num3!=0&&num4!=0&&num5!=0){
if(error<0){
  error=3.2;}
else{error=1.6;}
//analogWrite(IN_A1,90);
//analogWrite(IN_B1,30);
}else if(num2==0&&num1!=0&&num3!=0&&num4!=0&&num5!=0){
if(error<0){
  error=2;}
else{error=1;}
//analogWrite(IN_A1,80);
//analogWrite(IN_B1,40);
}else if(num4==0&&num2!=0&&num3!=0&&num1!=0&&num5!=0){
if(error>0){
  error=-2;}
else{error=-1;}
//analogWrite(IN_A1,40);
//analogWrite(IN_B1,80);
}else if(num5==0&&num4!=0&&num3!=0&&num2!=0&&num1!=0){
if(error>0){
  error=-3.2;}
else{error=-1.6;}
//analogWrite(IN_A1,30);
//analogWrite(IN_B1,90);
}else{
 error=0;
//analogWrite(IN_A1,70);
//analogWrite(IN_B1,70);
}
P = error;
I = I + error;
D = error - previous_error; 
PID_value = (Kp * P) + (Ki * I) + (Kd * D);
previous_error = error;
DIN_A1  += PID_value;
DIN_B1  -= PID_value;
if(DIN_A1>60){
  DIN_A1=60;}
if(DIN_B1>60){
  DIN_B1=60;}
if(DIN_B1<30){
  DIN_B1=30;}
if(DIN_A1<30){
  DIN_A1=30;}
analogWrite(IN_A1,DIN_A1);
analogWrite(IN_B1,DIN_B1);
}

我自己写完最大的感受就是,我感觉没用上PID

感应器传的慢 反应时间长等等问题迫使我把Kp的值调的极高,
这样看来其实就是在1ms间调成//后的数值,
由于最后速度限制,导致不会因为循环速度加到爆。

最终成功地
写成了 非PID 类型,哈哈哈学习使我快乐

  • 18
    点赞
  • 108
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
好的,我可以帮你解答这个问题。下面是一个基于ArduinoPID算法循迹小车的示例代码: ```C++ //定义引脚 int leftMotor1 = 2; int leftMotor2 = 3; int rightMotor1 = 4; int rightMotor2 = 5; //定义传感器引脚 int leftSensor = A0; int rightSensor = A1; //定义PID参数 double kp = 0.5; double ki = 0.1; double kd = 0.2; //定义偏差、误差和总误差 double error = 0; double lastError = 0; double integral = 0; double derivative = 0; //定义目标速度和当前速度 double targetSpeed = 100; double currentSpeed = 0; void setup() { pinMode(leftMotor1, OUTPUT); pinMode(leftMotor2, OUTPUT); pinMode(rightMotor1, OUTPUT); pinMode(rightMotor2, OUTPUT); Serial.begin(9600); } void loop() { //读取传感器数值 int leftValue = analogRead(leftSensor); int rightValue = analogRead(rightSensor); //计算偏差 error = leftValue - rightValue; //计算总误差 integral += error; //计算误差变化率 derivative = error - lastError; //计算控制量 double output = kp * error + ki * integral + kd * derivative; //更新速度 currentSpeed = targetSpeed - output; //控制电机运动 if (currentSpeed > 0) { digitalWrite(leftMotor1, HIGH); digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, HIGH); digitalWrite(rightMotor2, LOW); } else { digitalWrite(leftMotor1, LOW); digitalWrite(leftMotor2, HIGH); digitalWrite(rightMotor1, LOW); digitalWrite(rightMotor2, HIGH); } //输出调试信息 Serial.print("Left Value: "); Serial.print(leftValue); Serial.print(" Right Value: "); Serial.print(rightValue); Serial.print(" Error: "); Serial.print(error); Serial.print(" Output: "); Serial.println(output); //更新上一次误差 lastError = error; //短暂等待 delay(10); } ``` 该代码基于左右两个红外传感器对黑线进行循迹,使用PID算法控制小车的移动。其中kp、ki和kd分别表示比例、积分和微分系数,可以根据实际情况进行调整。在loop函数中,首先读取传感器数值,然后计算偏差、误差和总误差,接着计算控制量,更新速度,最后控制电机运动。同时,通过串口输出调试信息,方便调试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值