这篇总结本来是十二月初要写的(比赛是十一月末),终于推到一月中旬放假才在我这里排上档…怪期末月喽。
如简介所说,这篇总结又叫《电子类比赛小车选购指南》,是根据这次星火杯比赛买车子的经历进行一个大的发散和总结。我将会从跑、控、看三个方面进行叙述,最后附加一些扩展功能。
如果你还没有接触过相关的比赛,通过这篇文章,大可减少踩坑的严重程度。

小车,最重要的功能是可以行进,也就是能跑。

我想应该没有人自己嗯搭车架子吧?一般大家都是从淘宝上买现成的车架子,配上自己的控制系统(或者直接买店家集成好的整车)。而店家一般都会给很多参数,没经验的人很容易被坑,下面就带大伙了解了解车架子的各种参数。

电机

电机是直接驱动轮子运动的部件,也直接决定了小车的运动性能。

直流减速电机

一般的平价车架配的都是直流减速电机(TT马达),对就是小黄:
直流减速电机

注意看电机头部的两个带圆孔的小铜片,这里是接线的地方(一个正极一个负极),有些店家不会给你事先焊接好,需要自己去焊,还很容易掉(一周能掉两次那种拉跨水平)。而有些店家不仅给你焊接好,还打上热熔胶和电机插头,不嗯造绝对断不了。所以买的时候记得问电机线到底是个什么情况。

带编码器的直流减速电机

编码器能够将电机的机械几何位移转化为脉冲信号或数字量。 也就是说,有了编码器,我们通过检测编码器输出的脉冲信号,就能获取电机转动角度、转速等相关信息。常用的是光电编码器(光学式)和霍尔编码器(磁式)。光电编码器是霍尔编码器精度的几十倍。

电动机旋转时,检测装置检测输出若干脉冲信号,为判断转向,一般输出两组存在一定相位差的方波信号。这两组信号就叫A相和B相,然后我们就可以通过单片机采集 AB 相的脉冲数据,根据脉冲换算即可得到电机位置数据啦。

一般来说,当需要用到闭环控制(比如PID)的时候,我们需要加装编码器。AB相编码器一般有四根线:VCC、GND、A相和B相,再加上我们电机的正负极两条线,控制一个电机+编码器一共是6条线,记得预留好足够的接口哦。

无刷电机

关键词:散热好、噪音低、寿命长、功能多、比较贵。

笔者没用过所以略去,深入了解可戳:【抢头条】迄今最全的无刷电机工作及控制原理分享-绝对…!

轮子

既然是车,那么打滑在所难免。有时廉价的轮胎会给你带来最接近于盲盒的行驶体验,让你的每一次转向角度都成为未知数。所以,对于轮胎和比赛场地的“契合程度”,还是需要我们慢慢去调整的。

普通轮子

普通轮胎之间也存在着差异。一是直径的差异,二是轮胎皮做工的差异。后者似乎更能单独拿出来说道说道。

首先是轮胎表面,当然是越涩摩擦力越大,购买时注意看轮胎花纹密度,也不要忘记看轮胎内部有没有减震海绵,有些真就是空的(悲痛)。

麦克纳姆轮

关键词:可以全方位移动、横向滑移、需要平整路面、方格循迹推荐。

详细了解戳:【学渣的自我修养】麦克纳姆轮浅谈

麦克纳姆轮图片

转向方式

差速转向

差速转向指的是车辆通过控制左右两个驱动轮的转速实现转向,当驱动轮转速不同时,即使无转向轮或者转向轮不动作,车身也会旋转。(也是坦克的转向原理)

舵机转向

根据控制方式舵机应该称为微型伺服马达。早期在模型上使用最多,主要用于控制模型的舵面,所以俗称舵机。舵机特点是接受一个简单的控制指令就可以自动转到一个比较精确的角度。

伺服:在讯号来到之前,转子静止不动;讯号来到之后,转子立即转动;当讯号消失,转子能即时自行停转。由于它的“伺服”性能,因此而得名——伺服系统。

闭环控制:闭环控制是指控制论的一个基本概念。指作为被控的输出量以一定方式返回到作为控制的输入端,并对输入端施加控制影响的一种控制关系。带有反馈信息的系统控制方式。

就像这种(随便找的图):
随便找的舵机转向车图片
至于选择哪种转向方式就仁者见仁啦。

车架悬挂

在障碍赛(或者地形复杂的场地)中,大概率会出现剐蹭底盘、一侧轮子卡住空转、电机烧坏、翻车这一类的现象。这时,给车架加一个悬挂是不错的选择。

控制系统是小车的大脑。下面笔者会介绍几种比赛中常见的控制系统。

微控制器

大学期间正常的比赛(除了智能车竞速赛)用的都是单片机,如果你想进阶飞思卡尔那种智能车竞速赛,可能需要在画有两个主控芯片的板子上下点功夫。

STM32

STM32应该是最常用的板子了,教程很多,生态很丰富,有兴趣可以自行学习。这里推荐野火的教程文档:《STM32库开发实战指南》
b站上也有很多教程。

Arduino

Arduino UNO是稚晖君第一块入门的板子(也是俺的)。特点是啥也不会也能用,抄抄例程,改改参数就能实现自己想要的功能。更何况Arduino的生态太好了,无论是Arduino的各种库还是各种型号的开发板(包括值得一玩的esp系列),都具有很强的可玩性。推荐当作单片机启蒙来玩(也就是说对深入理解底层硬件没啥用,而且性能很是一般)。

MSP430

TI公司以节能著称的一款芯片,在电赛中广泛使用,不多介绍了。

摄像头板子作主控

对没错说的就是摄像头开发板。市面上有很多摄像头开发板,电赛中用得尤其多的就是openmv啦。最近崛起的国产摄像头开发板例如K210也是不错且性价比高的选择。

没错!我们可以使用摄像头开发板来驱动我们的小车。完全不了解?别急,在下面的摄像头分类中笔者会对常见的摄像头种类做介绍。

树莓派

树莓派其实更像个小电脑,以优越的图像处理性能著称。缺点是贵,富哥富姐随意。

STC51

51单片机想必大家都久仰大名。我的建议是,如果你没接触过51,可以试着用它做小车试试,接触过就别用了,你也知道它性能咋样,功能一多就寄,只能完成基本任务这样(比如行进转弯循迹避障)。

控制算法

PID

所谓 PID 控制,就是对系统偏差进行比例、积分以及微分的控制。PID 是闭环控制,因此需要有传感器测量我们需要控制的参数,并且反馈到我们的控制计算当 中,并且参与控制。PID 由 3 个单元组成,分别是比例(Proportion)单元、积分(Integral)单元、微分(Differential)单元。通过对这三个单元的处理计算输出给执行器,达到减小偏差最终实现收敛的过程。

比如要控制地面上无人机达到一个目标高度,需要经过加速、匀速、减速这几个过程,风阻和不确定的高度也是个问题。所以会在无人机上装一些高度传感器,当没有达到目标高度或者超过目标高度时,使用一定的算法进行控制,使无人机的高度最终收敛到这个目标高度,这就是闭环PID控制。

特殊情境下的算法

比如让小车通过碰撞走迷宫,我们将小车缩成迷宫中的一个点,可以使用各种搜索算法进行寻找出口,例如dfs、bfs等。所以控制类竞赛人的自我修养就是在日常学习中多积累算法的使用,不能说不参加ACM就完全不去了解数据类型与算法。

传感器是小车的眼睛。当我们需要完成一些比赛的任务时,传感器的选型是很关键的。

传感器

模拟/数字信号

简单来讲,模拟信号是连续的信号,而数字信号是离散的信号,两者之间可以进行互相转换。

模拟信号(Analog signal),简称A;数字信号(Digital Signal),简称D。

模拟信号是连续变化的量或者信号,生活中接触到的信号基本都是模拟信号。例如温度的变化、天体的运动、时间的流逝、动物的运动等等。数字信号则是将生活中的模拟信号采样、量化而来的结果,通常在直观理解中成阶梯状或方波状。从模拟信号转换为数字信号的过程称为A/D转换。

我们需要A/D转换,是因为微处理器只能处理被量化过后的数字信号。这个A/D转换模块既可以是存在于微处理器内部的,也可以是传感器自带的。我们将自带A/D转换器、输出数字信号的传感器称为数字传感器,将输出连续模拟信号、在输送给微处理器后仍需要微处理器进行A/D转换的,称为模拟传感器。一般来说,模拟传感器的精度比较高。

循迹传感器

红外/灰度传感器的区别

现在市面上的常规的红外传感器模块和灰度传感器模块都有模拟量和数字量。

红外循迹一般有发射端和接收端,其利用了发射端发射的红外线在不同颜色的物体表面具有不同的反射强度的特点,一般用于区分黑色物体与其他颜色的物体。

如遇到黑色物体时,红外光将会被吸收,接收端无法接收到红外线;遇到白色反光物体时,红外光将通过漫反射部分回到红外循迹的接收端。由其原理就可知,红外循迹的接收端上很容易受到诸如外界光的干扰,以及物体的表面反射特性的影响的。为此,如果想在比赛中使用,那必须加上遮光罩,用以阻碍外界光的干扰。

灰度循迹也有发射端和接收端(光敏电阻),不过与红外循迹的区别在于,灰度循迹检测的是不同颜色的深浅(灰度值),为此其可用于区分多种颜色(不止是黑色与其他颜色)。同样,灰度循迹的接收端也容易受到外界光的影响,为此在使用时,加上遮光罩效果更好。

如果是单纯的只是巡黑线的话,应该考虑模块离地面距离范围及稳定性。

(本人推荐带遮光罩的灰度。)

传感器路数的选择

要看赛道状况。如果线路有90度以上的拐弯,建议买三路及三路以上,我去年用的是五路,给大家看一下基本的逻辑循迹代码(arduino写的):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void Follow()
{
//低电平表明在白色区域,高电平表明压在黑线上
SR = digitalRead(SensorRight);
SL = digitalRead(SensorLeft);
SM = digitalRead(SensorMid);
SLL = digitalRead(SensorLLeft);
SRR = digitalRead(SensorRRight);
if (SM == HIGH)//00100
run(0); //调用前进函数
else if (SL == HIGH && SR == LOW)//01000/11000
// 左循迹红外传感器,检测到信号,表明车子向右偏离轨道,需要向左转
spin_left(0);
else if (SR == HIGH && SL == LOW)//00010/00011
// 右循迹红外传感器,检测到信号,表明车子向左偏离轨道,需要向右转
spin_right(0);
else if (SRR == HIGH && SR == LOW && SL == LOW && SLL == LOW && SM == LOW)//00001
spin_rright(0);
else if (SLL == HIGH && SL == LOW && SR == LOW && SRR == LOW && SM == LOW)//10000
spin_lleft(0);
else if ( SLL == LOW && SL == LOW && SR == LOW && SRR == LOW && SM == LOW)//00000
spin_lleft(0);
}

避障传感器:红外or超声波哪家强

红外测距速度快,但是太阳光一来你就测不准了。因为红外测距的原理是,一个红外LED发光,然后另外一个红外接收管测红外光的强度。

另外红外还有一个缺点,就是不同的面返回的光线强度不一样,黑色返回的数据要比白色低许多, 所以光线强度和距离不一定完全成正比,材料一换,对应的关系也就换了。

超声波测距也有许多缺点。 最大的一个缺点就是慢,如果你要测3米的距离,先不考虑声波能不能传回来,首先3*2/340就超过 10ms了,距离再远一点就没法测了,声音传不回来。

其次还有一个缺点就是必须是平面,请自行脑补45度面接收到声音之后打到一边的场景。

视觉解决方案

在近几年的比赛中,视觉是比较火热的方案。有些任务要求甚至不使用视觉模块就做不出来。在此有如下几个解决方案。

以openmv为首的各种视觉开发板

包括openmv、K210、英伟达jetson nano等。这些开发板既可以作为车子的主控,也可以作为子模块给主控制器发送串口信息,图像处理部分全部在这些视觉开发板上使用python编写,就不需要去stm32等板子上进行裸板开发了。使用串口(UART)与单片机进行通讯。

缺点是贵。貌似最便宜的是K210。

普通+opencv

opencv是个被广泛使用的视觉库。对微控制器的浮点运算性能要求比较高,就算是STM32F4系列也不太行。如果你使用的是单板电脑如树莓派等可以一试。

ccd摄像头

麻烦。需要在微控制器里面进行二值化然后处理。只搞过巡线,用C开发难度有点大。

就写到这里!终于填好坑啦!