瞿志二,袁良祺,吐鲁逊江·克热木,顾淑琪,夏润秋
(北京信息科技大学仪器科学与光电工程系,北京100192)
由于当前不断兴起的汽车无人驾驶技术,相应的智能车实验也更加受业内人士青睐[1],由此应运而生的各种智能小车比赛也接踵而至。智能小车的功能建立在使用者模块使用上,通常具有自动寻迹、寻光、跟踪、显示、避障、红外控制、语音控制等功能,智能小车不需要使用者实时的操控,可以根据既定的程序执行设置的要求。智能小车的出现代替了人们很多复杂而繁重的劳动,也运用在许多危险且人类无法出现的领域。随着智能小车智能化、模块化、通用化、普及化的实现,智能小车将运用在人类生活生产的方方面面。
2018 年7 月在北京理工大学举办全国大学生光电设计竞赛(“光电寻的竞技车”)要求制作一款“智能小车”要求完成自动寻找探测并追踪熄灭信标灯。因此基于OpenMV 和Arduino Teensy 开发出一套针对第六届全国大学生光电设计竞赛要求,使用寻光小车对12个同样形状、同样颜色、同样亮度、不同位置的信标灯进行熄灭作业。
Arduino 平台特点主要有:①成本廉价。②跨平台性。③图形化编程方式。④开源的硬件及软件[2],而且Arduino 只需要了解各个端口的作用和使用方法即可,不需要了解它的硬件结构设计,也不需要自己编写复杂的底层代码,使用方面很简单。
光电小车使用单片机作为主控模块,控制光电小车转动,从而控制光电小车行走与制动,还需要控制灭灯挡板的舵机的转动,使光电小车完成灭灯的功能,同时还需要控制测距模块,实现近距离的测距功能。并且需要使单片机与图像处理系统建立良好的通信环境,接收处理图像处理系统传递的方位信号,使光电小车实现自动追踪功能。光电小车的大体工作框架如图1 所示。
图1 光电小车工作框图
竞技车比赛常用舵机一般有两种如图2 所示,一种是飞思卡尔小车的普通轮舵机如图2(a)所示,一种是麦克纳姆轮小车的舵机如图2(b)所示。本系统所选用的是麦克纳姆轮小车的舵机。
图2 竞技车舵机选型
相比于飞思卡尔小车的普通轮舵机,麦克纳姆轮小车的舵机更加灵活,麦克纳姆轮是一种全向轮,能够使竞技车进行全方位的移动,可以在行进时节省很多时间,例如:对于侧方向的信标灯的追踪,理论上可以直接横向追踪,无需调转车头;探测信标灯时,飞思卡尔小车的普通轮舵机需要后轮锁死,前轮舵机控制方向,在通过前轮的驱动电机带动车身转动,寻找信标灯;而麦克纳姆轮舵机可以直接原地转弯,寻找信标灯,控制方法上更为简单、执行上更为快速。因此本文中选用麦克纳姆轮小车舵机作为竞技车的舵机。
麦克纳姆轮如图3 所示是瑞典麦克纳姆公司设计的一款能够实现前后移动、左右横移、斜前、斜后、原地旋转的轮胎,三个或以上的麦克纳姆轮之间的组合可实现平台的全方位自由移动。它的外形结构与常见的普通轮胎有所区别,麦克纳姆轮轮胎的外部轮廓是由许多倾斜成45 度角的小辊子组合而成的,虽然看上去这些小辊子之间有所间断,但它实际的外形上又符合理论圆周的形状,因此能够正常旋转。而车轮上的每个小辊子也可以自由旋转,通过辊子的与轮子整体的相对运动,再由多个轮子之间组合实现平台的全向运动。
在电机选择方面有两种不同的方案,直流有刷电机和步进电机这两种。直流有刷电机具有良好的启动性能和调速性能,控制电路简单,在自动化控制设备中得到了广泛的应用[3]且其结构简单、应用成熟、运行平稳、调速范围广、响应速度快、起动扭矩大、起制动效果好、成本低、过载能力强,因此系统中选用的是直流有刷电机。
图3 麦克纳姆轮
竞技车的舵机驱动模块本文中设计了两种驱动方案。一种是用L298 芯片作为驱动模块,另一种是用TB6612FNG 直流电机驱动芯片作为驱动模块。
TB6612FNG 是一种基于MOSFET 的H 桥集成电路。每个通道具有600 毫安的平均输出电流和1.2A峰值电流,这使其输出负载容量加倍。而且TB6612FNG 不需要外部散热片,外围电路搭建简单。只需要外部电源和滤波电容就可以直接驱动电机,这有利于减小系统尺寸和设计难度。对于PWM 信号,它支持高达100KHz 的频率,优于L298N 芯片。因此,本文中选用TB6612FNG 作为竞技车的驱动模块。
竞技车主控模块采用单片机控制,本系统所选用的是Arduino Teensy 3.2 单片机如图4 所示作为竞技车的主控模块。
图4 Arduino Teensy 3.2单片机
一般的Arduino 单片机在使用时都需要安装相应的驱动,而Arduino Teensy 3.2 单片机是不用安装驱动的,直接进行擦写、编程、调试即可,节省了部分操作。并且相较于常用的Arduino Mega 2560 单片机,Arduino Teensy 3.2 单片机的主频提升到了72MHz,Mega 2560仅为16MHz。而且较为重要的是Teensy 3.2 的内存提升到了64KB,Mega 2560 的内存仅为8KB,内存太小,可能会不够用。在程序方面Teensy 3.2 与Mega 2560的库文件兼容,编写上同样简单,因此选用内存更大的Arduino Teensy,如图5 所示是Arduino Teensy 3.2 引脚图。
图5 Arduino Teensy3.2引脚图
由于这一届光电竞赛要求竞技车停在LED 灯外围10 厘米的黑线外,不允许碰撞信标灯,所以需要设计一个测距系统。测距模式通常情况下分为超声波测距与红外测距。本系统选用的是HC-SR04 超声波传感器,外部形状如图6 所示。
图6 HC-SR04超声波传感器
HC-SR04 模块包括超声波发射器、接收器和控制电路。采用I/O 口TRIG 触发测距,给至少10μs 的高电平信号,模块自动发送8 个40KHz 的方波,并自动检测是否有信号返回,一旦检测到有回波信号则输出回响信号,回响信号的脉冲宽度与所测的距离成正比[4]。超声波探测器测距的计算公式:
式中L 为探测到的前方距离,T 为信号脉冲宽度,v 为声速,由此公式经过计算便可得到超声波探测器测量距离。
表1 HC-RS04 超声波测距模块电气参数表
这一届光电竞赛要求不能直接碰撞信标灯,需要在信标灯外10 厘米用挡板将信标灯挡灭,并且挡板伸出车体部分不得超过15 厘米。挡板设计方面有创意加分。经过多方查询,初步设计了三种方案。
方案一:水平方向旋转挡板。通过一个舵机控制,在水平方向向车头方向旋转出一定角度,实现灭灯。这种挡板可覆盖范围广,角度自由,可通过程序方面调整角度,以增大挡板覆盖面积,十分方便。
方案二:翻转挡板。由一个舵机控制,像风车一样从后向车头方向翻转至水平,实现灭灯。这种挡板覆盖面积比较固定,基本上是由挡板自身面积决定,难以更改。并且由于竞技车车身高度有所限制,只能向后水平放置,占用竞技车空间较大。
方案三:水平方向伸缩挡板。由一个舵机和传送带控制,水平向车头伸缩,实现灭灯。这种挡板和翻转挡板一样,覆盖范围由挡板本身大小决定。并且在设计上,相比于前两种挡板,这个方案的设计制作较为复杂。占用车体空间也不小。
水平伸缩挡板结构上先比方案一、方案二的挡板要复杂,并且如果信标灯坐标标定由偏差,水平伸缩挡板覆盖面积较小,可能会发生信标灯在覆盖面积外的情况,而无法实现灭灯功能;翻转挡板占的位置较大,在具体实施中会影响车身上的单片机、镜头,所以最后决定采用水平旋转挡板。占用面积小、结构简单、设计制作较为方便。由于是旋转控制,可通过程序上改变舵机旋转角度,以增加其覆盖面积,如图7 所示。
挡板设计安装在竞技车车头位置,在超声波探测器侧方,因为如果在超声波探测器正上方,理论上想要灭灯就需要至少旋转90 度,而安装在竞技车侧方一些,就可以减小灭灯所需的旋转角度,较少灭灯所需时间。
图7 挡板结构设计图
在挡板的外形设计上,本文中设计了几款不同的能够适应水平旋转的挡板形状。分别是:圆形挡板、T形挡板和扇形挡板。经过多次实验,发现圆形挡板最为合适,T 形挡板在信标灯坐标探测有所偏差,导致竞技车停在信标灯侧方时,会有无法挡住信标灯的情况;而扇形挡板在其他竞技车中使用较多,所以最终选用圆形挡板,如图8 所示。
图8 挡板形状设计图
挡板驱动舵机采用的是辉盛MG90 微伺服舵机(图9)进行控制。伺服舵机具有制动迅速、旋转惯量小、启动力矩大等特点,且可以使得挡板转动遮挡信标灯角度更加精确、快速。因此在挡板舵机选择上,采用了微伺服舵机。
图9 Mg90s微伺服舵机
竞技车电路部分由竞技车舵机模块、超声波测距模块、挡板舵机模块这三部分组成。
通过上一章竞技车的选材,最终确定了由Arduino Teensy 3.2 单片机作为竞技车的主控,分别控制这三个模块的运行。Arduino Teensy 3.2 单片机通过PWM 控制竞技车舵机模块的运行;超声波测距模块与Arduino Teensy 3.2 单片机的SDA 和SCL 端口相连;挡板舵机模块由Arduino Teensy 3.2 单片机的伺服电机控制端口控制。
根据竞赛规则,小车采用采用Arduino 做驱动,OpenMV 做图像处理。OpenMV 找到裁判灯并把中心坐标发给Arduino,Arduino 驱动电机找到裁判灯并控制舵机进行灭灯。Arduino 用了最新版本的Teensy 开发板,运行速度快。车轮为麦克纳姆轮,此轮的好处就是可以让小车不仅前后运行,还能左右平移,大大减少了小车在转弯时的时间,如图10 为小车寻的程序流程图。
图10 小车寻的程序流程图
竞技车控制方面本文中设计如下方案:开始时,给竞技车通电,Arduino 单片机控制竞技车开始原地旋转,直至Arduino 单片机接收到图像处理系统传输方位信号后,并对方位信号进行处理,在使竞技车在短时间内加速到最大速,朝向解析出的坐标方位行驶;超声波探测器同时开始工作,在超声波探测到距离信标灯50厘米时,竞技车开始迅速减速到设定运行速度,在超声波探测到距离信标灯10 厘米时,竞技车刹车,轮胎抱死,同时灭灯挡板复位,在竞技车停稳后,灭灯挡板伸出灭灯,停留1 秒,灭灯挡板再收回,竞技车再次启动,向后退一小段距离(大约50 厘米,防止竞技车做后续动作时碰撞信标灯),竞技车再次原地旋转,寻找下一个信标灯,重复以上动作,直到比赛结束。
OpenMV 程序的设计主要包括两个方面一个是色块的寻找,一个是数据的发送。在色块寻找方面,通过找到色块中心位置来判断裁判灯的位置。在竞赛场地,人眼看到裁判灯为红色,但是OpenMV 看到的不是红色,并且在场地也会有很多因素影响会影响色块的寻找。在寻找裁判灯是可以采用阈值来寻找色块再判断出色块中心位置x,y 的坐标。在发送数据方面,OpenMV 有两个串口通信接口,可以同时发送x,y 坐标的值。如果采用一个串口发送坐标的话,第一速度慢了,第二需要先将数据打包再发送,在Arduino 里也需要进行解压读数据。在Arduino 里也有两个串口,可以同时接收两组数据。
通过第六届全国大学生光电设计竞赛,基于本设计的光电寻的小车在47 秒内灭灯5 盏符合竞赛要求完成比赛获得二等奖。由于比赛时间紧任务重,小车还有用很多可以改进的地方,例如图像质量,电机扭力,车身在运动过程中颠簸导致图像不清晰,色块寻找算法本身存在的问题等。
图11 竞赛小车及硬件