
3.3 软件设计
Arduino虚拟现实感知小车的功能实现需要Arduino UNO R3主板、驱动模块、电源模块及其他硬件模块相互配合,统一协调。这就需要使用Arduino程序将各个模块连接成一个相互关联的系统。Arduino UNO R3主板相当于小车的大脑。Arduino程序就是这个大脑所拥有的思想,根据软件指令,控制各个模块完成自己的动作,从而最终完成任务所要求的动作。Arduino程序可以用PC端的Arduino IDE编译软件进行编写。
由于Arduino虚拟现实感知小车采用模块化多功能设计,各个控制系统之间相互独立(这是为了不让小车出现连带损害,小车不会因为一个系统故障而影响其他系统的正常工作),因此各个系统的控制程序也是相对独立的。模块化多功能设计的优点,首先是每个模块的程序结构相对简单,任务明确,易于编写、调试和修改;其次是程序可读性好,对特定模块的程序修改可局部进行,不会干扰其他模块的程序,有利于调试。另外,对于在程序中高频率使用的子程序,我们建立了子程序库,以便于在编写各个模块的程序时可以快速调用。
Arduino虚拟现实感知小车的程序主要由无线数据传输程序、模式识别程序、电动机驱动程序、舵机程序、各种传感器程序等组成。由控制端向小车的信号接收端发送指令,信号接收端将信息传给Arduino UNO R3主板,由Arduino UNO R3主板进行解码,进而执行相应的子程序。Arduino虚拟现实感知小车的程序总体设计图如图3.16所示。

图3.16 Arduino虚拟现实感知小车程序总体设计图
1.程序整体结构框架
Arduino虚拟现实感知小车的程序由7部分组成。其中,防护预警系统程序由6个传感器的相应程序组成。6个传感器采集到的信息由Arduino程序进行分析处理,发出相应的警报信号,同时将信息经无线数据传输模块发回控制端,供指挥员决策。Arduino虚拟现实感知小车程序整体结构框架如图3.17所示。

图3.17 Arduino虚拟现实感知小车程序整体结构框架
2.程序结构
Arduino语言以setup()函数作为程序初始化,以loop()函数作为循环。setup()函数用来初始化变量、管脚模式及调用库函数等,在整个程序运行过程中只执行一次。loop()函数是一个循环函数,函数内的语句周而复始地循环执行,功能类似C语言中的main()函数。
(1)遥控通信程序的实现
Arduino虚拟现实感知小车采用Arduino APC 220 USB无线数据传输模块与Arduino开源无线遥控手柄配合进行控制。Arduino开源无线遥控手柄的程序主要由初始化函数setup()和循环函数loop()组成,首先进行按键编码、定义、初始化,然后设置波特率,与无线数据传输模块建立通信协议,最后读取按键变化值,并发送数据。Arduino开源无线遥控手柄的程序流程图如图3.18所示。

图3.18 Arduino开源无线遥控手柄的程序流程图
无线数据传输模块接收到由Arduino开源无线遥控手柄发送的信息后,将信息传送给Arduino UNO R3主板,由Arduino UNO R3主板判断所接收到的信号,从而执行相应的动作。比如,Arduino UNO R3主板解析到接收的信号为djqj(电动机前进),就会控制小车向前移动。其相应的程序为

(2)电动机控制程序的实现
步进电动机是将电脉冲信号转变为线位移或角位移信号的开环控制部件。在不超载的情况下,步进电动机的停止位置、转速只取决于输入电脉冲信号的脉冲数和频率,不受负载变化的影响,当步进驱动器接收到一个电脉冲信号时,就会驱动步进电动机按设定的方向转动一个固定的角度(称为步距角)。其旋转是以固定的角度一步一步进行的,可以通过控制电脉冲信号的脉冲数来控制角位移,从而达到准确定位的目的;同时,可以通过控制电脉冲信号的频率来控制步进电动机转动的加速度和速度,从而达到改变速度的目的。步进电动机可以作为一种用于控制的特种电动机,利用其没有积累误差(精度为100%)的特点,广泛应用于各种开环控制。
Arduino程序通过调整PWM占空比来控制两组四个步进电动机的转速,即通过改变PWM的占空比来控制步进电动机的供电电压,从而控制步进电动机的转速,实现差速转向、切边转向、中心转向三种转弯模式。Arduino虚拟现实感知小车步进电动机驱动程序流程图如图3.19所示。

图3.19 Arduino虚拟现实感知小车步进电动机驱动程序流程图
差速转向是通过调节转弯时两侧步进电动机的转速,使得内侧步进电动机的转速大于外侧步进电动机的转速,从而完成转弯的。其转弯半径较大,适用于行进过程中及路面较宽阔情况下的转弯。切边转向是使内侧步进电动机的转速为零,外侧步进电动机的转速大于零,小车依靠外侧履带完成旋转式转弯。其转弯半径介于差速转向与中心转向之间,适用于道路较狭窄时的转弯、变向等。中心转向是使外侧步进电动机的转速大于零,内侧步进电动机的转速小于零,通过外侧前进、内侧后退的方式在原地完成转弯。其转弯半径是三种转弯模式中最小的,适用于狭窄地段的方向变更。Arduino虚拟现实感知小车步进电动机控制程序流程图如图3.20所示。

图3.20 Arduino虚拟现实感知小车步进电动机控制程序流程图
PWM(Pulse Width Modulation)是一种方波控制信号。其高电平的宽度在一个周期里所占的比例被称为占空比(Duty Cycle)。改变PWM的占空比,可以改变输出信号的平均电压。
Arduino UNO R3主板的3、5、6、9、10、11接口可以通过语句analogWrite(pin,duty-Cycle)来确定指定占空比的PWM。其中,pin的值在3、5、6、9、10、11接口中选择,dutyCycle的值在0~255之间,0代表占空比为0%,127代表占空比为50%,255代表占空比为100%。这种方式下,PWM信号的频率是固定的默认值,为1000Hz左右,在analogWrite(pin,dutyCycle)之后,占空比会一直保持不变,除非下一个analogWrite(pin,dutyCycle)执行。我们可以手动切换高电平和低电平,并在中间加入延时函数delay(),就可以实现自定义频率的PWM。
Arduino UNO R3主板有三个Timer,即Timer0、Timer1、Timer2。三个Timer都可以自定义调节频率,但各有特点。Timer0负责控制delay()等函数,如果改变Timer0的频率,就会导致计时函数不准确;Timer1的计数器是16位的,与Timer0、Timer2的8位计数器是不一样的;Timer2的频率可调挡位更多,有7挡预除数,我们选择Timer2。Arduino UNO R3主板离线存储的步进电动机调用函数为

小车在接收到遥控信号后,通过判断执行相应的动作。
(3)初始化部分源代码
Arduino语言的初始化部分由setup()执行。Arduino虚拟现实感知小车的初始化部分源代码为

3.编译环境
Arduino虚拟现实感知小车使用Arduino IDE进行编译。Arduino IDE是一款专业的Arduino开发工具,主要用于Arduino程序的编写和开发,拥有开放源代码的电路图设计,支持ISP在线烧录,兼容Flash、Max/Msp、VVVV、PD、C、Processing等多种程序,是广受欢迎的编译环境。Arduino语言是建立在C/C++语言基础上的,基本与C语言相通。其实也就是基础的C语言,Arduino语言只不过把与AVR单片机(微控制器)相关的一些寄存器参数、设置等都函数化了,不需使用者了解底层,有利于进行开发。
Arduino IDE的编程特色:
特色一:开放源代码的电路图设计,程序开发接口免费下载,也可依需求自己修改。
特色二:使用低价格的微处理控制器(ATmega8或ATmega128),可以采用USB接口供电,不需外接电源,也可以使用外部9VDC供电。
特色三:支持ISP在线烧录,可以将新的bootloader固件烧入ATmega8或ATmega128芯片,有了bootloader之后,即可通过串口或USBtoRs232更新固件。
特色四:可依据官方提供Eagle格式的PCB和SCH电路图简化Arduino模组,完成独立运作的微处理器控制,各种电子元器件的连接非常方便。
特色五:支持多种互动程序,如Flash、Max/Msp、VVVV、PD、C、Processing等。
特色六:利用Arduino可突破以往只能使用鼠标、键盘、CCD等输入装置的互动内容,可以更简单地达成单人或多人互动。
Arduino IDE界面截图如图3.21所示。

图3.21 Arduino IDE界面截图
所完成的Arduino虚拟现实感知小车的实物图如图3.22所示。

图3.22 Arduino虚拟现实感知小车的实物图