对于循线来说,PID算法是非常好的方法,可以根据车相对黑线的位置自动调整轮子的速度,达到丝滑循线目的。网上也有很多关于PID的教程,但大多数都是用Arduino IDE 编程的,对于不会C语言的小白来说是有点困难的。Mixly 作为一个模块化编程软件,为广大爱好者提供了非常方便的环境,但现在网上关于用Mixly现实PID算法的教程比较少,所以对于会用Mixly但不太会C语言的小白来说,想用Mixly来实现PID控制是比较困难的。本人也是小白一个,喜欢用Mixly来编程,一开始也是不懂PID算法,还好,我会一点C语言(起码能看大概个明白),在网上看了很多关于PID的算法后,决定自己用Mixly来编一个PID算法。

        PID 算法在这里就不作详细介绍,网上有很多,可以去找,关于PID算法控制的理解,可以看看这个,理解他说循线原理可以了,其他不用管。

        乐高EV3 pid 巡线讲解01 -李航作品_哔哩哔哩_bilibili

驱动模块及接线

        本次使用的是L298N驱动模块,如图:

               

                                          图1                                                          图2

        两个都是L298N模块,我使用的是第二个,因为第二个接口多一点,还带有开关,当然也贵一点。

        根据L298N逻辑表,有两种方法实现PWM驱动

        第一种:

 

         拔掉A、B使能管的接帽,用ENA、ENB的使能管接PWM管脚控制调速,IN1、IN2、IN3、IN4用高低电平控制方向,这种接法最少只要两个PWM管脚,但要用到的接口就要6个,本来UNO的接口不多,所以我没有用这种。

        Mixly编程如图:

 

       第二种:

 

        A、B使能帽接上,IN1、IN2、IN3、IN4接上PWM管脚5、6、9、10,可以控制方向和调速。这种接法只要4个管脚,但4个都要PWM管脚。

        Mixly编程如图:

 

PID变量

        首先声明定义一些变量:kp,ki,kd 三个变量是控制P,I,D大小的系数。

        P是误差比例,即后面的error,用来控制两个电机的速度。

        I是积分,一般用于大转弯,弯度越大ki系数应越大,ki*I就会变大,电机的速度变大,顺利过弯。

        D是微分,是对接下来的路线的预判,具体赋值是连续两次误差的差如:上次误差是1,这次误差是1,两次的差是0,说明路线没有偏,两个电机的速度不用改变。

        error 是传感器识别黑线的位置,不同的位置财赋予不同的值,就需要调整两个电机的速度,两个电机有了不同的速度就形成误差。

        last_error 是记录上一次的误差,只要用于形成D。

        speed 为基础速度(自己设的)

由传感器得用的不用error 值

        这里用了三个灰度传感器,不同的情况赋予error不同的误差值。左右两边用正和负表示,至于是正还是负都可以,如左边为正,右边就为负,相反,左边为负,那右边就为正。对于不同的路线来说,急弯多的话传感器越多越好。

 

        010 没有偏离,error赋值为0 ,两个电机速度不用改变。

        100 中度右偏,error赋值为2 ,右电机中度加速,左电中度机减速。

        110 轻度右偏,error赋值为1 ,右电机轻度加速,左电机轻度减速。

        011 轻度左偏,error赋值为-1 ,右电机轻度减速,左电机轻度加速。

        001 中度右偏,error赋值为-2 ,右电机中度减速,左电机中度加速。

        000 脱线了,有可以是右偏后脱线,也有可以是左偏后脱线。  

             如果原来error为2 说明是右偏脱线,error赋值为3,右电机重度加速,左电重度机减速。

             如果原来error为-2 说明是左偏脱线,error赋值为-3,右电机重度减速,左电重度机加速。

PID 公式

        输出速度=P*kp + I*k i+ D*kd

 

        定义一个有返回值的函数:PID 最后输出 output_speed

        用传感器得到的值(error)赋值给P

        I 不断的累积每次的error,如果在急弯,这个I会积累得很快,一边轮子的速度试会增加得很快,面另一边的轮子则减少得很快,从而顺利过弯。

        D 为连续两次error的差

        根据公式,最终输出output_speed

电机速度调整,最终两电机输出不同的速度

 

  定义一个电机函数

        右电机速度:基础速度+上面的PID输出速度(speed+PID)

        左电机速度:基础速度-上面的PID输出速度(speed-PID)

        再设一个速度范围50-150

        最后执行就可以了。

 

        kp,ki,kd 这三个系数的调整,网上有关于它位的调整,还有口诀,不过个人觉得还是上面的视频讲的简单,弯度不大,整体路线比较圆滑的ki和kd都可以为0,如何直线摆动较大,增加一点kd,如果急弯较多可以增加一点ki,当然不同的路线要不同的数值,具体还是要根据路线一点一点地调整。

        最后放Mixly的整体图

 

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐