赞
踩
那年暑假,我刚加入机器人队,队长为我们所有人安排了暑期集训任务,就是要做一台自平衡小车,借此熟悉一下STM32,对机器人软硬件系统有一个初步的认识。但当时我有事情没能按时到学校,最后便错过了,我的队友们也最终栽在了玄学的PID调试上。虽然忙碌的大学生活让我时常感到有些喘不过气,但是我始终惦记着这台没有做成的小车。今天,我考完了研,拥有了充裕的时间和精力,知识和技术也有了一定积累,我感到自己再也没有什么理由不立即把它做出来了。
最初我有过一个大胆的想法:小车的软硬件全部自己设计。但是事实说明并不实际,电路部分我可以勉强设计,要用到的模块我也大概了解,但是STM32的编程确乎超过了我的能力范围,所以最终决定还是在一个开源项目的基础上做一次自平衡小车的复现。
通过不懈搜索,我搜集到了一些开源的资料,包括各大论坛的、博主的、甚至飞思卡尔的;但都不尽人意,主要是没有一个对项目的系统的介绍,包括源代码;引脚定义也含糊,多数都没有注释;好在天无绝人之路,前任队长那里竟然有当时集训的材料,所以我的此次整个DIY都以这份珍贵的资料为基础。资料的获取方式我会在文末说明。
要制作一台平衡小车,需要用到的硬件材料有:轮子、带编码器的直流电机、电机排线、面包板、杜邦线、STM32、稳压模块、蓝牙模块、电机驱动模块、陀螺仪模块、超声波模块、电池、底盘、螺栓、铜柱、固定轧带、开关等。下面是物料表:
材料都收集好后,第二步就是要把电路搭建起来。
参照如下电路图,利用已有的模块在面包板上搭建临时电路,注意按照一定顺序仔细接线,接线出错轻则导致bug重则直接损毁模块。
电路图十分清楚明白,这里我挑几点说明一下:
供电电路:实际中的供电电路其实就是稳压模块本身,它的输入是3S电池(约12V),输出可调,我们把它手动调到5V。事实上,整个系统除了驱动电路以外都使用5V供电。
红外模块:这个我们实际上没有用到,所以这部分电路可以忽略
驱动电路:驱动电路的能量来自电池,控制信号来自STM32单片机,它直接与电机相连实现驱动
图纸所示的GND和接地符号初衷是表示数模接地分开,实际上是直接相连的。
3530电机:表示的实际上是一个接电机的端子。
烧录程序可以用USB也可以用SWD,如果你和我一样手边只有一个ST-link的话,也可以用杜邦线强行转成SWD,注意这样在Keil的设置里面还是要选择ST-link。在烧录之前有必要了解一下代码的基本逻辑,平衡小车的核心知识就在于平衡的原理以及代码实现,有关平衡原理部分可以参考资料里面的文档,网上也有丰富的教程,实际上对小车的平衡控制问题在动力学中就是一个一阶倒立摆问题。控制对象实际上就是小车的角度和速度,我们通过一个角度环(PD)和一个速度环(PI)让角度和速度尽量快的收敛到0,通过调整四个参数让振荡性和稳定误差尽量小的同时又能让响应时间尽量短。代码实现基本上就是按照这个控制思路来编写的,代码的作者将每个功能封装成了相对独立的函数并且有详细的注释,虽然我们不太可能从头自己编写一份这样的代码,但是以后可以复用代码除了main.c和upstandingcar.c的部分,加以修改实现别的功能。
成功烧录程序之后,你会发现小车会随着车身的摆动自行做调节,但是显然此时小车还不能实现直立。这是因为PID参数对于每一台车实际上都是不一样的,它会收到车体重心位置、陀螺仪放置位置以及车体质量分布等因素的影响,所以解铃还须系铃人,你的小车的PID参数还需要你来反复测试调整再测试才能确定。
细心的你可能发现了,这个小车看起来一改炸毛杜邦线风格,上面好像没有面包板。没错,第一版做出来我觉得杜邦线太多太乱了,而且验证了电路后也不需要修改了,杜邦线很松容易造成接触不良,所以我直接买了一个原理图一样的扩展版,和面包板基本是一样的,只是省去了杜邦线和稳压模块而已。当然还有别的原因,这个文末细讲。
虽然我们时常把调PID调侃为“玄学工作”,因为各个参数之间存在耦合,所以看着小车在地下疯狂打转,却不知到应该变动PID哪个参数为好,甚至都不知道应该增大还是减小。其实,只要掌握了正确的调参顺序,理解每个参数对响应的影响机理,就不难调出让人满意的参数。
角度增益决定了反馈的线性倍数,直接反映就是小车的调节幅度,P1太小,小车反馈影响小,宏观上就是感觉软绵绵地像是醉汉一样;P1太大,小车反馈过度,会出现大幅度的震荡,就像停不下来的招财猫一样,P的作用就像一个弹簧,总是提供反方向的力,偏移的程度越大反馈也就越大;调节时第一步要把其他三个参数全部归零,P1从小到大(约1~200)调节,直到调整到某一个值,小车能够较大幅度地来回震荡,说明P1的值已经能够把小车修正回来了,此时可以再稍微加大一点P1,到此,小车出现了明显的超调,下一步就是解决超调问题。
角度微分D是对角度的变化率进行反馈,就是小车角度往哪个方向变化,D就要减小这种变化,从而让小车趋于稳定;D太小,达不到反馈的效果,小车仍然有明显的震荡;D太大,小车对角度的细小变化过于敏感,可能会出现高频振动,D的作用就像一个阻尼器,弹簧上加上阻尼,它才能快速地停下来;在P1的基础上,D从小到大增加(0.01~0.8),直到某一值时,小车能短暂平衡约5秒钟才倒下,并且也不会出现高频振动,D也就调整好了。但是此时小车会先平衡后沿着某个方向慢慢运动直到加速失衡,这是因为到目前为止我们只是通过PD角度环使得角度基本稳定在0°,但是小车速度并没有控制,所以微小的角度误差不断累积,最终变成小车向某个方向缓慢不断加速直至电机到达极限倒下。
为了解决这个问题,让小车能够在原地平衡,我们要引入速度环,与角度环的目标是角度为零不同,速度控制的目标是让小车速度为零。I会对速度进行积分,如果小车向某个方向长时间有一定速度的话,I会产生相反的越来越大的反馈从而让小车及时停下加速的举动。I也会对突然的加速比如人手突然推一下小车做出快速的响应,有助于小车稳定,I的作用就像一个质量快,它赋予了小车模型上的惯性,让小车是一个有一定惯性的实体而不是轻飘飘的像云朵一样;在PD的基础上,I从小到大增加(0.05~0.3)。一般来说,I在比较小时便可看到小车明显有改善,I在保证小车稳定的情况下应当尽可能小一点。
没错,就是计算,在I确定好的情况下,直接P2=200*I即可,这是很多人实际调试总结的工程经验,此时的系统已经是一个具有复杂耦合的系统了,改变单一的参数会对角度和速度控制同时产生影响,只不过是哪边显著哪边不显著的问题。
下面列出我的最终参数,仅供参考:
参数 | 数值 |
---|---|
P1 | 150 |
D | 0.53 |
P2 | 24 |
I | 0.12 |
代码内已经写好了蓝牙控制的功能,甚至资料里面还有配套的手机APP。上电之后蓝牙模块会快速闪灯,显示处于等待状态,用手机蓝牙连接,一般密码为0000或1234,如果不是的话咨询店家;连接上了打开APP,资料里有使用教程,按图索骥即可。
值得一提的是这个APP还带在线调试PID参数的功能,可以极大提高我们调试的效率,再也不用反复烧写程序了。
到此,平衡小车就制作完成了。知易行难,如果屏幕前的你有时间精力不妨也尝试一下,学习单片机的同时可以提高动手解决问题的能力。
实际效果展示:
自平衡小车DIY效果
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。