arduino四路红外PID循迹小车

为了更好的采样我使用了arduino的中断,所以需要手动装一下中断库。主控是我自己画的,集成了驱动在板子上。但是其他驱动像L298N,TB6612都是可以代替的,更改下端口号即可。

代码如下:

#include <MsTimer2.h>
int sensor[5];
int moto1A = 5;   //我是四轮,左边两个电机并联,右边两个电机并联
int moto1B = 6;
int moto2A = 9;
int moto2B = 10;
int base = 100;   //基础速度
float err,last_err;
void moto_run(int x,int y);
void  line();
void  turn_left();
void  turn_right();
int  cacu_pwm();
void flash()           
{
    sensor[0]=digitalRead(A0); 
    sensor[1]=digitalRead(A1);
    sensor[2]=digitalRead(A2);
    sensor[3]=digitalRead(A3); 
    if(sensor[0] == 0&& sensor[1] == 0&& sensor[2] == 1&&sensor[3] == 0)  //0010
      err = 1;
    if(sensor[0] == 0&& sensor[1] == 0&& sensor[2] == 0&&sensor[3] == 1)  //0001
      err = 2;
    if(sensor[0] == 0&& sensor[1] == 1&& sensor[2] == 0&&sensor[3] == 0)  //0100
      err = -1;
    if(sensor[0] == 1&& sensor[1] == 0&& sensor[2] == 0&&sensor[3] == 0)  //1000
      err = -2;
}
int  cacu_pwm()            //pid运算部分
{
    int output;
    float kp=60,ki=0,kd=12;    //pid需要根据实际情况进行调节
    float P,I,D;
    P = err;
    I += err;
    D = err - last_err;
    output = kp*P + ki*I + kd*D; 
    last_err = err;
    return output;
}
void setup()
{
  Serial.begin(9600);
  pinMode(A0,INPUT);
  pinMode(A1,INPUT);
  pinMode(A2,INPUT);
  pinMode(A3,INPUT);
  pinMode(moto1A,OUTPUT);
  pinMode(moto1B,OUTPUT);
  pinMode(moto2A,OUTPUT);
  pinMode(moto2A,OUTPUT);
  MsTimer2::set(5, flash); //开启中断 5ms period
  MsTimer2::start();
}
void moto_run(int x,int y)           //电机控制部分
  {
     if(x>0)
     {
     analogWrite(moto1A,x); 
     analogWrite(moto1B,0); 
     }
     if(x<0)
     {
     analogWrite(moto1A,0); 
     analogWrite(moto1B,-x); 
     }
      if(y>0)
     {
     analogWrite(moto2A,y); 
     analogWrite(moto2B,0); 
     }
      if(y<0)
     {
     analogWrite(moto2A,0); 
     analogWrite(moto2B,-y); 
     }
  }
    void  line()   //直行
  {
    moto_run(100,100);  
  } 
    void  turn_left()   //左转
  {
    moto_run(-100,100);  
  } 
    void  turn_right()   //右转
  {
    moto_run(100,-100);  
  }
void loop()
{
     Serial.println(sensor[0]);
     Serial.println(sensor[1]);
     Serial.println(sensor[2]);
     Serial.println(sensor[3]);
     moto_run(base+cacu_pwm(),base-cacu_pwm());
}

  • 18
    点赞
  • 204
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 25
    评论
### 回答1: Arduino PID循迹小车是基于Arduino控制器并使用PID控制算法的一种自动化小车。PID控制算法是一种传统的自控算法,通过对误差信号进行比例、积分、微分运算来实现自动控制系统的稳定性和精度。 该小车的主要工作原理是通过搭载的光电传感器实时检测小车相对于轨迹线的位置信息,并通过PID算法来调整小车的速度和方向,使其保持在轨迹线上行驶。 在实际应用中,可以通过编写Arduino程序来实现PID算法的计算和控制,同时还可以根据需要添加其他的功能模块,如避障、遥控等。 此外,Arduino PID循迹小车也具有较高的可扩展性,例如可以通过添加蓝牙模块来实现小车的无线控制,或者通过添加摄像头模块来实现视觉循迹等功能。 总的来说,Arduino PID循迹小车具有操作便捷、灵活性高、功能模块多样等优点,因此在教学、科研以及科技爱好者之间广泛应用和推广。 ### 回答2: Arduino PID 循迹小车是一种可以自主寻路的小车。循迹小车通常由小车底盘、电源、主控板和循迹模块等部分组成。其中的循迹模块能够检测路线上的黑线,并将其转化为电信号,再通过主控板进行处理和计算,使小车能够根据线路的变化调整航向方向,从而实现自主行驶。 PID控制是循迹小车中非常重要的一部分,它是一种基于误差反馈的控制器。小车通过检测黑线的偏离情况来计算出偏离的误差值,然后利用PID控制算法对机器人的速度和方向进行实时调整。控制器的输出值经过放大电路后,被传输给电机,使小车得以实现平稳的曲线运动,提高了车辆稳定性和精度。 Arduino平台是一种开源的控制平台,具有体积小、价格低等优点,使用简单,适合初学者使用。使用Arduino及相关传感器组装智能循迹小车,可以让学生们更加深入地理解物理学和电路原理,并培养具备独立思考能力和创造力的控制工程师。在此过程中,他们不仅能够加强对计算机语言、模拟电子、数字电子等理论的掌握,更能带来实践操作的乐趣。 ### 回答3: Arduino PID循迹小车是一种基于Arduino开发板的智能小车,利用PID控制算法实现对小车行进路径的自动控制。该小车可以通过设置目标路径并使用编码器和红外传感器来检测路线,实时计算并调整动作控制来实现精准循迹。 PID控制算法是一种广泛应用于自动控制领域的调节算法,它可以进行动态调整,不仅适用于小车循迹,还适用于电机控制、温度控制等多种场景。循迹小车使用PID算法加速响应速度,控制精度更高,并完成了对转向、角度和速度的控制。 Arduino不仅提供了很多强大的控制算法和开发工具,还有很多模块可以用来实现不同的自由组合,如编码器、红外传感器、汽车遥控器等。这让使用Arduino开发自己的智能小车变得轻松可行。 通过学习基于Arduino平台的PID循迹小车,可以掌握基本的控制变量、算法和开发工具,并了解PID算法在自动控制中的应用和实现过程,为进一步深入学习和应用提供坚实的基础。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mxyflame871

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值