在这里插入图片描述

灵感来源

那年暑假,我刚加入机器人队,队长为我们所有人安排了暑期集训任务,就是要做一台自平衡小车,借此熟悉一下STM32,对机器人软硬件系统有一个初步的认识。但当时我有事情没能按时到学校,最后便错过了,我的队友们也最终栽在了玄学的PID调试上。虽然忙碌的大学生活让我时常感到有些喘不过气,但是我始终惦记着这台没有做成的小车。今天,我考完了研,拥有了充裕的时间和精力,知识和技术也有了一定积累,我感到自己再也没有什么理由不立即把它做出来了。

DIY全过程

最初我有过一个大胆的想法:小车的软硬件全部自己设计。但是事实说明并不实际,电路部分我可以勉强设计,要用到的模块我也大概了解,但是STM32的编程确乎超过了我的能力范围,所以最终决定还是在一个开源项目的基础上做一次自平衡小车的复现。

通过不懈搜索,我搜集到了一些开源的资料,包括各大论坛的、博主的、甚至飞思卡尔的;但都不尽人意,主要是没有一个对项目的系统的介绍,包括源代码;引脚定义也含糊,多数都没有注释;好在天无绝人之路,前任队长那里竟然有当时集训的材料,所以我的此次整个DIY都以这份珍贵的资料为基础。资料的获取方式我会在文末说明。

在这里插入图片描述

第一步 收集材料

要制作一台平衡小车,需要用到的硬件材料有:轮子、带编码器的直流电机、电机排线、面包板、杜邦线、STM32、稳压模块、蓝牙模块、电机驱动模块、陀螺仪模块、超声波模块、电池、底盘、螺栓、铜柱、固定轧带、开关等。下面是物料表:
在这里插入图片描述

材料都收集好后,第二步就是要把电路搭建起来。

第二步 搭建电路

参照如下电路图,利用已有的模块在面包板上搭建临时电路,注意按照一定顺序仔细接线,接线出错轻则导致bug重则直接损毁模块。
在这里插入图片描述

电路图十分清楚明白,这里我挑几点说明一下:

  1. 供电电路:实际中的供电电路其实就是稳压模块本身,它的输入是3S电池(约12V),输出可调,我们把它手动调到5V。事实上,整个系统除了驱动电路以外都使用5V供电。

  2. 红外模块:这个我们实际上没有用到,所以这部分电路可以忽略

  3. 驱动电路:驱动电路的能量来自电池,控制信号来自STM32单片机,它直接与电机相连实现驱动

    图纸所示的GND和接地符号初衷是表示数模接地分开,实际上是直接相连的。

  4. 3530电机:表示的实际上是一个接电机的端子。

面包板接线(部分)

面包板接线(部分)

第三步 烧录程序

烧录程序可以用USB也可以用SWD,如果你和我一样手边只有一个ST-link的话,也可以用杜邦线强行转成SWD,注意这样在Keil的设置里面还是要选择ST-link。在烧录之前有必要了解一下代码的基本逻辑,平衡小车的核心知识就在于平衡的原理以及代码实现,有关平衡原理部分可以参考资料里面的文档,网上也有丰富的教程,实际上对小车的平衡控制问题在动力学中就是一个一阶倒立摆问题。控制对象实际上就是小车的角度和速度,我们通过一个角度环(PD)和一个速度环(PI)让角度和速度尽量快的收敛到0,通过调整四个参数让振荡性和稳定误差尽量小的同时又能让响应时间尽量短。代码实现基本上就是按照这个控制思路来编写的,代码的作者将每个功能封装成了相对独立的函数并且有详细的注释,虽然我们不太可能从头自己编写一份这样的代码,但是以后可以复用代码除了main.c和upstandingcar.c的部分,加以修改实现别的功能。

成功烧录程序之后,你会发现小车会随着车身的摆动自行做调节,但是显然此时小车还不能实现直立。这是因为PID参数对于每一台车实际上都是不一样的,它会收到车体重心位置、陀螺仪放置位置以及车体质量分布等因素的影响,所以解铃还须系铃人,你的小车的PID参数还需要你来反复测试调整再测试才能确定。

搭建好的小车

在这里插入图片描述

细心的你可能发现了,这个小车看起来一改炸毛杜邦线风格,上面好像没有面包板。没错,第一版做出来我觉得杜邦线太多太乱了,而且验证了电路后也不需要修改了,杜邦线很松容易造成接触不良,所以我直接买了一个原理图一样的扩展版,和面包板基本是一样的,只是省去了杜邦线和稳压模块而已。当然还有别的原因,这个文末细讲。

第四步 调节PID参数

虽然我们时常把调PID调侃为“玄学工作”,因为各个参数之间存在耦合,所以看着小车在地下疯狂打转,却不知到应该变动PID哪个参数为好,甚至都不知道应该增大还是减小。其实,只要掌握了正确的调参顺序,理解每个参数对响应的影响机理,就不难调出让人满意的参数。

调节角度增益P1

角度增益决定了反馈的线性倍数,直接反映就是小车的调节幅度,P1太小,小车反馈影响小,宏观上就是感觉软绵绵地像是醉汉一样;P1太大,小车反馈过度,会出现大幅度的震荡,就像停不下来的招财猫一样,P的作用就像一个弹簧,总是提供反方向的力,偏移的程度越大反馈也就越大;调节时第一步要把其他三个参数全部归零,P1从小到大(约1~200)调节,直到调整到某一个值,小车能够较大幅度地来回震荡,说明P1的值已经能够把小车修正回来了,此时可以再稍微加大一点P1,到此,小车出现了明显的超调,下一步就是解决超调问题。

调节角度微分D

角度微分D是对角度的变化率进行反馈,就是小车角度往哪个方向变化,D就要减小这种变化,从而让小车趋于稳定;D太小,达不到反馈的效果,小车仍然有明显的震荡;D太大,小车对角度的细小变化过于敏感,可能会出现高频振动,D的作用就像一个阻尼器,弹簧上加上阻尼,它才能快速地停下来;在P1的基础上,D从小到大增加(0.01~0.8),直到某一值时,小车能短暂平衡约5秒钟才倒下,并且也不会出现高频振动,D也就调整好了。但是此时小车会先平衡后沿着某个方向慢慢运动直到加速失衡,这是因为到目前为止我们只是通过PD角度环使得角度基本稳定在0°,但是小车速度并没有控制,所以微小的角度误差不断累积,最终变成小车向某个方向缓慢不断加速直至电机到达极限倒下。

调节速度积分I

为了解决这个问题,让小车能够在原地平衡,我们要引入速度环,与角度环的目标是角度为零不同,速度控制的目标是让小车速度为零。I会对速度进行积分,如果小车向某个方向长时间有一定速度的话,I会产生相反的越来越大的反馈从而让小车及时停下加速的举动。I也会对突然的加速比如人手突然推一下小车做出快速的响应,有助于小车稳定,I的作用就像一个质量快,它赋予了小车模型上的惯性,让小车是一个有一定惯性的实体而不是轻飘飘的像云朵一样;在PD的基础上,I从小到大增加(0.05~0.3)。一般来说,I在比较小时便可看到小车明显有改善,I在保证小车稳定的情况下应当尽可能小一点。

计算速度增益P2

没错,就是计算,在I确定好的情况下,直接P2=200*I即可,这是很多人实际调试总结的工程经验,此时的系统已经是一个具有复杂耦合的系统了,改变单一的参数会对角度和速度控制同时产生影响,只不过是哪边显著哪边不显著的问题。

下面列出我的最终参数,仅供参考:

参数数值
P1150
D0.53
P224
I0.12

第五步 蓝牙遥控

代码内已经写好了蓝牙控制的功能,甚至资料里面还有配套的手机APP。上电之后蓝牙模块会快速闪灯,显示处于等待状态,用手机蓝牙连接,一般密码为0000或1234,如果不是的话咨询店家;连接上了打开APP,资料里有使用教程,按图索骥即可。

手机蓝牙遥控界面在这里插入图片描述

值得一提的是这个APP还带在线调试PID参数的功能,可以极大提高我们调试的效率,再也不用反复烧写程序了。

实时调整PID参数

在这里插入图片描述

到此,平衡小车就制作完成了。知易行难,如果屏幕前的你有时间精力不妨也尝试一下,学习单片机的同时可以提高动手解决问题的能力。

实际效果展示:

自平衡小车DIY效果

Plus:

  1. 资料来源:亚博智能STM32平衡车(非广告,TB有很多类似的店) https://www.yahboom.com/study/bc-32 亚博开源了一部分资料,剩下一部分要求购买了它的产品才能获取。不必买整车,可以买一个扩展版(34.8¥),就可以获取全部的资料了,希望大家支持正版。当然平衡车的资料网上搜一搜还是非常多的,但是可能不如这个详尽,至少网上的源码肯定没有适配这个调PID的APP,所以需要自己写。我图方便直接买了,其实有一点违背DIY的初衷,大家有能力还是自己尝试写一写。
  2. 当然,如果你是作者的哥们,上一条可以忽略。
  3. 关于小车底盘,我是在AutoCAD中画好图纸,自己用切割机切的碳纤维板,如果你也拥有切割机的话可以正好练个手,如果没有的话可以画好图纸让淘宝定制也不是很贵,当然你也可以家里找一点材料手工做,如果不想弄这部分也可以亚博店里直接买。
  4. 关于为什么已经搭好面包板电路又买扩展版:这个除了为了获取亚博的资料外,更重要的原因是我想小车做好后过年让外甥女玩一玩,面包板接线易掉易短路不安全,封装整洁比较好。
  5. 喜欢可以点赞,比心 ❤️
Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐