对于循线来说,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的整体图