推荐学习路线

本小节给新手推荐一些学习方法和重点。

你可能感到迷茫:

想要制作一辆两轮自平衡小车,却不知道该从哪里入手...

这是新手在学习新知识时最先遇到的困难。如果有人指点一下,给出学习顺序,会使新手少走很多弯路。就好比没做过菜的你突然想煎一个荷包蛋,却在纠结着下锅的顺序——是先放油还是先放鸡蛋?如果你妈在旁边告诉你,应该先放油,然后再敲蛋下锅,那这次煎蛋的成功率将大大提高。

同样的道理,在制作两轮自平衡小车这件事情上也适用。虽说我不是一个学识渊博的人,但在制作两轮自平衡小车这件事情上经验比较丰富。如果按照重要性划分,我认为新手关注内容的顺序应该是

代码 > 电路 > 机械

为什么这么说?理由很简单但充分。

嵌入式系统都可以看作是由硬件和软件两大部分组成的,两轮自平衡小车也不例外。

两轮自平衡小车 = 硬件 + 软件

其中,硬件 = 机械 + 电路,软件即指代码。每一部分都重要,硬件是肉身,软件是灵魂,两者相互依赖。没有灵魂的肉身只是行尸走肉,失去肉身的灵魂无法表现自身价值。

由此替换,

两轮自平衡小车 = 机械 + 电路 + 代码

机械

机械其实很讲究,消费级产品通常会用电脑建模,打样出来验证,通过再量产。但是,在这里,两轮自平衡小车只是一个极客型产品,裸露出电路板才是真极客。机械机构不需要外壳,因此变得简单起来,能拼装起来即可。

电路

电路可以分为两大部分,

电路= 核心电路+ 扩展电路。

其中,核心电路 = 控制器 + 传感器 + 稳压电路 + 驱动电路。核心电路是制作两轮自平衡小车的必备电路。扩展电路则视不同需求添加,比如要实现超声波避障功能就添加超声波模块,要实现红外循迹功能就添加红外循迹模块。

电路可以是全部集成化设计到一块电路板上,也可以是购买或制作不同功能的模块再组合到一起。

在电路学习方面,要了解小车电路的组成,各个电路模块的作用。尤其需要深入了解核心电路的功能和作用。

举个例子,控制器电路部分的学习应该对照 Datasheet(规格书)了解每个引脚的在系统中的作用,比如 PA6 引脚复位后默认功能是 GPIO,可选复用功能有 SPI1_MISO/ADC12_IN6/TIM3_CH1 三种功能,但在小车的电路上只是作为 TIM3_CH1 功能使用,即 定时器 3 的 1 通道 PWM 输出。

再举个例子,传感器 MPU-6050 模块一共有 8 个引脚,但是在系统中只用到了 4 个引脚(VCC|GND|CLK|SDA)。VCC 和 GND 就不用多说了,供电给芯片工作,可不能想马儿跑又不让马儿吃草。还有另外两根线,这是因为 MPU-6050 芯片是一款通过 I2C 协议发送数据的数字传感器,I2C 协议则是两线式串行总线,CLK 和 SDA 是 I2C 总线的两根线,只需要连接这两根线就可以查询到 MPU-6050 芯片的数据。

搞清楚核心电路每个引脚的作用对理解代码有很大帮助。

代码

代码很关键。代码即程序。伟大的图灵奖获得者 Nicklaus Wirth 曾提出一条著名的公式:

程序 = 算法 + 数据结构。

这句话也常常出现在我们的编程学习课本上。

在同样的硬件上,优秀的软件(算法)通常表现更优异。比如,在参数都整定到位的情况下,模糊 PID 算法会比 标准 PID 算法好,前者鲁棒性更好,抗干扰能力更强,响应更迅速。因此,要花费更多的时间和精力在代码、算法上。

两轮自平衡小车是一种典型的欠驱动系统,核心的算法涉及到平衡控制和运动控制,难度偏中等。新手在学习算法过程中会不断接触到新概念,这也需要投入更多的时间精力才能获得更好的学习效果。算法没有最优解,只有更优解。经过学习一段时间,如果新手研究透彻原来的算法,可以尝试修改优化原算法,以得到更好的控制效果。

在写这本书的时候,我就有考虑到学习顺序和学习重点,并且把重点放在代码的编写部分,按照“代码 > 电路 > 机械”的理念进行编排,只要按着顺序往下阅读,就能循序渐进地制作出一辆两轮自平衡小车。

有对知识的渴望是很好的学习动力,但是我们应该了解自身的条件,一步一个脚印开始,不可以一下子就想象自己可以很快蜕变。对自己的成长给点耐心,让自己在学习中慢慢累积,最终会厚积薄发。

祝学习愉快。