电小二新近结交了一位单片机爱好者,他想做一位好舅舅,于是踏进了为外甥制作超迷你自平衡小车玩具的坑,为的是证明身为电子工程师的TA有多厉害。一路走来,于他是技能成熟的过程,于小外甥是舅舅励志学习的故事,于我们也可以体会到他从想法到实物的设计思路及解决问题的策略方法。
让我们先来了解一下创客MCU起航制作“地心一号”自平衡小车的故事。
01 MCU起航的造小车故事
话说2016年,我的小外甥要上小学了,小豆丁有男孩子的动手实践天性,我就想给他做个电子玩具,激发他的学习热情。流水灯太low,四轴飞行器有螺旋桨危险,因此智能小车成为首选。四个轱辘的比比皆是,两轮自平衡小车才有成就感。于是,踏上了3年的慢慢制作路。我这三年不断踩坑,不断爬出来,过程中补齐了自己的基础知识,还提升了自己的硬件设计和软件工程能力。
故事是这样的......
时间拉回到2016年,网上可以找到两类方案:一是STM32+MPU6050,另一种是用Arduino做的。制作的先期过程是学习,我在自己动手前,买了个样机来研究。从此入了坑,不仅资料少,让我惊掉下巴的是,程序居然是用STM32的2.0的库写的。没经历过STM32库函数版本变动的同学是不会理解的,32的库从刚出来到现在相对稳定的3.5版本,变更了几次,每次都是大变样。我只好自己将整套程序用3.5的库重写一遍,意外收获是我对程序流程非常熟悉,为后续的调试打下基础。
再后来,我发现卖家的原理图和实际硬件不配套,电路没有留JTAG或者SW接口,只有一个串口下载的接口。好吧,注定我要自力更生为外甥造小车。
02 当我造小车时,我都在想什么?
很多单片机初学者都会有这样的灵魂拷问:学8位单片机好,还是学STM32好?其实不冲突。玩转STM8是更好使用 STM32的铺垫。
我的平衡小车主控芯片为什么选STM8,怎么入手?小车的设计要达到哪些要求?
STM32现在市面上非常流行,成为很多用人单位招聘技术人员的标配技能。但我想用STM8来实现我的平衡小车,一是因为8位单片机的性能可以达到;二是最俗的因素,8位单片机便宜!三,我认为会用STM32不代表牛逼,会用8位单片机不代表不牛逼,能把STM32的项目用8位单片机做出来,这才算牛逼!
那么为什么不用简单易学的Arduino?
Arduino是意大利的一名教师和一名晶体工程师发明的一个灵活性非常高的电子平台,非常易学好用。它常出现在很多中小学中的机器人课程中,从另一角度理解,中小学生都能学会的编程,有多难?那,能不能用它来做产品?
这就是个很严肃的问题了。做产品,除去首要因素成本,着重要考虑的是什么?
稳定性,稳定性,稳定性!!!如果稳定性不行,入门再简单,功能再强大,都是扯淡!Arduino的稳定性却备受争议。因为它最初因教学目的被设计出来,主要用途在DIY工具,中小学生兴趣课,还有一些玩具。国内很少有用它来做商业产品,鉴于Arduino和实际市场的主流单片机差别很大,为了有个好前途,不必在Arduino上花费太多时间。
小车的设计要达到哪些要求?以下几点是我的考量:
1、要有学习的意义,就是说这个板子不光能跑平衡小车,还要作为一个学习的开发板,这是最基本的。
2、选型方面要合理,就像我最开始说的,能用8位的单片机把32位的单片机的项目做出来,这才叫厉害,要尽量选择合适的资源。每一个元器件的选型都要有原因,有做产品的意识,同时要实现它的效果。
3、制作过程要尽量低成本。身为DIY爱好者,很多人会有这样的感觉,制作过程中通常是非常兴奋的,演示的时候也多巴胺爆棚,但是演示完了三天之后,很可能这个DIY作品就开始吃灰了。为了防止这的情况出现,或者说即便吃灰,由于它的价格也不高,不会心疼。所以我们尽量使用低成本的东西来实现。
4、组装过程要尽量简单。尽量避免太过复杂的组装过程,避免高手自嗨,降低动手门槛,对很多人才有学习的意义和提高的动力。
03 平衡小车的原理探索及制作过程中的坑
接下来的内容,将用较长的篇幅讲述平衡小车的原理探索,以及制作过程中踩过的坑。
先说选型。单片机选用的是STM8S103f6,20管脚,Flash空间只有8K ROM,1K的RAM。相比传统的51,它是8位单片机的性价比之王,功能强大,某宝有小巧的最小系统板可供选择。
角度传感器采用MP6050,参考资料多,价格合适。
电机驱动的部分,这里有两个选择,一个是L9110s,另外一个是TB6612。L9110S在过程中发现两个问题:一个是发热比较严重(据说后来新的芯片解决了发热的问题),加了散热片也不行;另一个是能量转换效率不高,同样用50%的占空比驱动电机,只用肉眼观察,TB6612比L9110S明显要快一点;三是组装不方便。最后选用TB6612。
选电池的时候,尤其要注意放电能力!
然后是电机,选中性能较好的N20电机。注意带码盘和不带码盘的电机价格差别有点大。
最后是轮胎,与N20电机配套,选中一款D字型的橡胶轮胎。
首先是搭建这个小车的结构,原型采用洞洞板,按照一定的尺寸评估整个车身的大小,然后用剪刀裁定的尺寸,然后使用铜柱进行多层的结构组装。近乎暴力的组装,造成外形自然不够美观。
可以看到左边是MPU6050,右边是STM8S的最小系统板。上下两层洞洞板,采用铜柱做固定。
问题来了,怎么确定这个新组装出来的结构可以用?方法是替换之前购买的平衡小车样机模块,进行组装。
第一坑出现了,如何用STM8来替换STM32来控制这个结构?STM32使用的是DMP方式读取MPU6050的角度,控制小车,是可以站立的;但换做STM8,使用原始数据转化为角度再去控制的话,几乎站不住。问题的核心在于,采用原始数据计算角度的方式,与DMP方式计算出的角度有一定的偏差。而这个偏差会导致当小车发生偏移时,电机无法快速响应,也就是反应速度不够。这时候就需要PID控制算法。我的方案是车身结构较小,电机扭距不够强,需要特殊方式提高响应速度,最直接的方式就是使用PID这个算法里面的参数I,也就是积分。积分的特性就是它会累积误差,时间越久累积的误差越大,它纠正的力度也就越大,此处的时间概念指是单片机的时间。几个循环过去,如果发现误差还在继续增加,那么它会产生非常强大的修正的力,这个力会作用在电机上,最终使小车的车身恢复平衡。到此,第一坑顺利解决,确定用STM8控制这个结构是可行的。
接下来,工作分两个方向同时进行,一个是电路板的绘制,使用Autumn Designer进行PCB板绘制;另外是程序的编写,STM8S的单片机的编程有很多参考例程,难度不大。程序的移植和编写时,因STM8S103F6这个芯片的flash非常小,无法使用DMP的方式读取比较高精度的数据。只能采用读取原始数据,然后解析的方式。
这时第二坑出现了,小车虽然站了起来,但是抖动和晃动明显,不平稳。怎么办?我对程序进行优化,如调节PID参数、调整程序循环周期、在PID算法的基础上做微调等等,最终采用卡尔曼滤波,调整了周期,小车从哆哆嗦嗦的状态,一下子变成了平稳的滑翔者!角度环已经没有问题了。
第三坑被卡在了位置环上。平衡小车的站立,至少需要两个环!一个是角度环,维持小车平衡。但是维持平衡还不够,你会看到它平衡的到处乱跑,不服从指挥。所以需要第二个环:位置环(也有人叫路程环)。它能让小车原地不动,或者按照我们的要求移动。原理也很简单,它会监测小车轮胎的转速和转向,从而对小车的移动进行纠正。有的还会做转向环,例如,有外力导致小车旋转了90°,需要把这个旋转纠正过来。
最终,通过使用一个红外反射式传感器ITR8307,做了个模块,利用轮胎自身的结构,组成了一个另类的测速装置,好似让轮胎自带编码器。如图:
轮胎内部自带白色牙齿(原谅我用“牙齿”这个词),共有12个。他们把红外反射模块固定在牙齿下面,当轮胎旋转时,牙齿会依次、间断的从传感器上面经过,出现的效果就是高、低、高、低电平的不断输出。单位时间内计算脉冲信号个数,速度有了~~~
注意这里的脉冲个数,上升沿12个、下降沿12个!轮胎转一圈只有24个!
然后是方向。这种编码器没法计算方向,我只需要在检测到高低电平的时候判断一下电机的驱动方向就行了。
路程环怎么搞?换个思路思考。小车的站立也要保持重心平衡,如果不平衡,那么就会往一个方向偏。在这个过程中,我要阻止外力对小车重心的破坏。
小车的平衡靠角度环可以实现,但是会偏。怎么不让它偏?
由于小车的车身质量分布并不均匀,导致小车水平的时候可能并不是它的平衡角,那就需要找到这个平衡角。小车维持平衡的角度,刚好是小车重心垂直过电机轴的角度。所以小车初始调试的时候,需要先找平衡角。
假设已经找到了平衡角,在平衡角状态下,外力导致小车向前走了7步,我可以通过码盘测速测出来。那么,怎么纠正?
重心!
是的,我可以让小车的重心平衡角向反方向增加0.7°。这样角度环为了维持平衡,会自动往反方向纠正。往回走一步,重心平衡角上面添加的误差少一点,回到原地,角误差清零。
这个想法抛弃了传统的路程环,重新设计了一种控制策略,转化为代码,编译、烧录、上电,小车以一个位置为原点,做往复运动!这种情况下,只需要把偏差和重心结合起来,使用PID的方式计算出一个纠正用的误差角,叠加到小车的平衡角上就行了。这种新的PID环,我把它叫做重心环。
04 地心一号迷你平衡小车的诞生
平衡小车的设计完成后,它的诞生还要三步走:
1、确定方案,画原理图、PCB,找工厂安排制板、焊接、组装;
2、编写教程;
3、给小车起个名字。
解决小车技术的一个关键点是重心环的出现,而《地心引力》是我最喜欢的电影之一,就叫地心一号吧,来看看地心一号美颜!
硬件方案如下:
STM8S103F6+MPU6050+TB6612+蓝牙串口模块+红外遥控
蓝牙串口模块在这里有两个功能:一个是调整PID参数的时候,可以终端界面无线;另一个就是在键盘界面控制小车的行驶方向。
加入我们,一起学习平衡小车课程!
电堂科技05 课程大纲及订阅用户权益
“地心一号”迷你平衡小车教程内容分两大部分:STM8基础教程 + 迷你平衡小车视频教程。
课 | 程 | 大 | 纲
* STM8S基础教程已完载* 小车视频教程将持续更新用户完成订阅后,将获得“地心一号”超迷你自平衡小车一辆,附送课程中涉及的小车示例代码。来吧,加入我们的线上系列课程《地心一号超迷你平衡小车 —— 基于STM8开发》,
>weixin.qq.com/r/ey4gONXE7IiTrZFb93tp (二维码自动识别)
课程链接
电堂科技