刘伟静,赵超泽,王 东,徐文丽,姚 宁,王小涛
(1.天津航天机电设备研究所,天津 300458;2.天津市宇航智能装备技术企业重点实验室,天津 300458;3.北京交通大学海滨学院,河北 廊坊 061100)
随着现代机械工程的快速发展,工业手柄[1-2]越来越多地应用于无人机、机器人[3]、移动车等。其中,工业手柄的摇杆[4]操作可实现设备移动的灵活性与稳定性。手柄控制方式分为无线和有线两种。无线手柄与有线手柄相比,具有较高的移动灵活性,且安装方便、操作简单、调试维护成本较低。因此,大部分领域使用无线手柄进行远程控制。文献[5]以STC89C52单片机为主控单元,设计了摇杆信号无线传输模块。该模块在模数转换器(analog to digital converter,ADC)模块初始化时读取的三组数据均为无效数据,且在检测数据时需在一定时间内关闭无线传输,因而增加了数据处理时间和设备能耗。文献[6]设计了一种便携式多功能无线游戏手柄。该手柄能准确输出控制命令,但同一时间从缓存区读取的11个字节不一定是同一个数据包中的,导致信道利用不充分甚至丢包。
本文从手柄软件设计入手,采用CC430F6137单片机[7]作为手柄控制器的核心部分,利用ADC采集摇杆偏移量,设置ADC采样参数,确保控制器每次均可采集到一个完整的数据包;通过对比的方式建立摇杆数学优化模型,以提高摇杆操作精度。
作为智能设备的上位机系统,无线手柄具有远距离遥控下位机的功能,可实现平移、转向、升降、翻转等动作。无线手柄操控方便,可靠性较高,能较好地满足使用者的要求。
单片机具有集成度高、可靠性高、控制功能强、功耗低的特点,是工业控制领域广泛使用的元件。德州仪器推出的射频芯片CC430延续了MSP430单片机的超低功耗设计,采用了CC1101[8]作为无线内核,成为新一代无线式单片机。因此,本文选用CC430F6137作为手柄控制核心单元。将CC430F6137中的13个I/O连接手柄按键,4个模拟量接口连接手柄摇杆。手柄显示屏采用并行通信模式。其中,手柄摇杆产生的模拟量信号通过ADC中断转换成数字量信号,并存入CC430F6137单片机寄存器内。解析该摇杆信号即可控制下位机的动作。手柄硬件结构如图1所示。
图1 手柄硬件结构框图
本文设计的手柄采用双轴摇杆模块。该模块由2个滑动变阻器[9]组成。拨动摇杆时滑动变阻器的阻值发生变化,对应的x、y轴电压值随之变化,进而产生x、y轴方向的偏移量。当摇杆不进行任何操作时,单片机ADC采集到的x、y轴的偏移量视为摇杆的原点。然而,由于滑动变阻器的不稳定性,摇杆原点会在一定范围内浮动,易产生手柄无操作但下位机动作的问题。因此,必须将摇杆原点限定在一定范围(即死区[10]范围)内,以防止危害事故的发生。本文以该特性为出发点优化摇杆死区,提高手柄操控性能。摇杆偏移量采集流程如图2所示。
图2 摇杆偏移量采集流程
在保证摇杆正常应用的前提下扩大摇杆死区范围,确定在不进行任何操作时摇杆采集点数始终保持在死区范围内。不同的死区设置方式具有不同的效果。下面解析摇杆死区分别设置为方形和圆形时的特点,并优化设计。
方形死区模型如图3所示。
图3 方形死区模型
当不操作摇杆时,设定摇杆x、y轴的实际偏移量分别为s、t(s>0,t>0)。死区范围设为:当x值满足a 摇杆在死区范围外,xvirtual、yvirtual轴正负方向的偏移量分别为1 024,即解析后的摇杆坐标范围为-1 024≤xvirtual≤1 024、-1 024≤yvirtual≤1 024。由此可以得到死区范围之外的角度计算方法,如式(1)所示。 (1) 式中:A为摇杆当前角度值。 当x、y值处于阴影区域2时,满足xvirtual=0或yvirtual=0,表示摇杆向正前、正左、正后、正右四个方向推动。 上述方式可在保证摇杆正常应用的前提下有效扩大死区范围,保证摇杆不会在非操作模式下发出错误信号。 以图3(a)的第一象限为例。当摇杆沿图3(b)中的虚线箭头方向推动时,摇杆角度会出现0°(OA)→90°(AB)→γ(0<γ<45°)的跳变,造成输出方向的突变,极易引起下位机方向突变,甚至死机。同理,在其他3个象限也会出现角度跳变现象。 满足(xvirtual-s)2+(yvirtual-t)2≤r2(r>0)的区域为死区范围。当摇杆处于死区范围内时,坐标设为O(0,0)。 死区范围之外的角度计算如式(1)所示。为判断摇杆向正前、正左、正后、正右四个方向的推动,设定: (2) 式中:0°<α<45°。 圆形死区模型如图4所示。 图4 圆形死区模型 根据式(1)、式(2)可知,该设置方法扩大了摇杆0°、90°、180°、270°四个方向的范围。圆形死区模型拨动方向如图4(b)中阴影区域2所示。 分析图4(b)中的第一象限可知,直行推动摇杆至死区范围外,不会出现角度跳变,消除了摇杆操作造成的下位机方向突变的问题。 摇杆采用圆形死区模型。本文采用自定义方式设置无线传输程序,采用6个字节的自由协议:帧头为0xAA;第2个字节为x轴坐标数据;第3个字节为y轴坐标数据;第4个字节为角度;第5个字节为校验位,应用偶校验方式;帧尾0xBB。 手柄发送数据流程如图5所示。 图5 手柄发送数据流程 本文应用CC430F6137单片机中的ADC中断构建程序。具体程序构建流程如下所述。 首先初始化ADC中断,然后通过配置寄存器,使能该中断。 void ADC_Init(void) |{|P2SEL=0xCF;//使能ADC 通道输入 ADC12CTL0=ADC12ON+ADC12MSC+ADC12SHT0_8; ADC12CTL1=ADC12SHP+ADC12CONSEQ_1+ADC12SSEL_3; ADC12MCTL0=ADC12INCH_0; ADC12MCTL1=ADC12INCH_1; ADC12MCTL2=ADC12INCH_2; ADC12MCTL3=ADC12INCH_3; ADC12MCTL6=ADC12INCH_6; ADC12MCTL7=ADC12INCH_7+ADC12EOS; ADC12IE=0x08; delayxms(100); ADC12CTL0 |=ADC12ENC; ADC12CTL0 |=ADC12SC; delayxms(100); } 在中断程序中应用无符号整型数组results[8]配置ADC中的0、1、2、3、6、7号寄存器,将x、y、z三轴坐标分别配置在results数组的1、0、6号寄存器中。具体如下。 results[0] = ADC12MEM0; //y轴坐标 results[1] = ADC12MEM1; //x轴坐标 results[2] = ADC12MEM2; //外部电压 results[3] = ADC12MEM3; //电池电压 results[6] = ADC12MEM6; //z轴坐标 results[7] = ADC12MEM7; x轴和y轴采用二维坐标,设置圆形死区。中心点设置方法为:采集20次x轴和y轴摇杆在起始点的坐标,取其平均值,设为中心点,例如(2 035,2 022)。以中心点为圆点,以Blind_Spot为半径,设置圆形死区。 z轴单独作为一维坐标。采集20次z轴摇杆在起始点的坐标,取其平均值,设为中心,例如2 050。以中心点为起点,上下取100,设置为死区范围,即z轴在(1 950,2 150)范围内的变化忽略不计。 具体程序如下。 if(zeroflag==0) //原点限制 { ShiftZeroX = results[1]; ShiftZeroY = results[0]; if ((pow((ShiftZeroX-2035),2)+pow((ShiftZeroY-2022),2))>=pow(Blind_Spot,2)) { ShiftZeroX=2035; ShiftZeroY=2022; } ShiftZeroZ = results[6]; if((ShiftZeroZ>2150)||(ShiftZeroZ<1950)) ShiftZeroZ=2050; } 摇杆坐标变化范围为0~4 096,在初始位置时在2 048上下变化。将中心(2 035,2 022)转换为原点(0,0),将上下1 024设置为摇杆的死区范围,超出1 024的部分记为1 024。其中,x、y轴坐标变换代码如下。 void XYConvert(int x,int y,int rocker) |{ if ((pow((x-2035),2)+pow((y-2022),2))>=pow(Blind_Spot,2)) { if((x>SZeroXN-1024)&&(x statex=x-SZeroXN; //x- else if(x statex=-1024.0; else if((x>SZeroXP)&&(x statex=x-SZeroXP; else if(x>SZeroXP+1024) statex=1024.0; else statex=0; if((y>SZeroYP)&&(y statey=y-SZeroYP; //y+ else if(y>SZeroYP+1024) statey=1024.0; //y+ else if((y statey=y-SZeroYN; //y- else if(y statey=-1024.0; //y+ else statey=0; } else { statex=0; statey=0; } _no_operation(); |} z坐标变换代码如下: |int ZConvert(int z,int rocker) |{ int q; if((z>SZeroZP)&&(z q=z-SZeroZP; //z+ else if(z>SZeroZP+1024) q=1024.0; //z+ else if((z q=z-SZeroZN; //z- else if(z q=-1024.0; //z- else q=0; return q; |} 本文应用工业手柄无线遥控全向移动转运车的方式,测试摇杆死区优化模型。试验选择周围障碍物较少、地面干净平整的场地,使转运车可全向移动。试验工业手柄发射功率为-10 dBm,最大发射半径为100 m,距离转运车5 m处。x轴和y轴的死区半径设置为100 mm。多次拨动摇杆并将角度值显示于液晶屏(liquid crystal display,LCD)上,观察转运车的移动方向是否与LCD上的角度信息一致。以x、y轴第一象限为例,说明圆形死区模型和方形死区模型的优劣。缓慢推动摇杆,观察x轴和y轴偏移量的变化。 角度数值变化如表1所示。 表1 角度数值变化 由表1可知,当设置圆形死区时,由0°变化到65°,无角度跳变发生;当设置方形死区时,转运车的移动方向由0°变化到90°,再跳变到65°。该跳变会引起转运车的行走角度突然发生变化,造成危险。而设置圆形死区时,无角度跳变的情况发生,消除了上述危险。 本文以CC430F6137作为手柄控制核心,根据工业手柄的可靠性建立摇杆数学模型,设定摇杆的死区模型,并分析该模型的优劣。针对摇杆信号的无线传输程序进行了分析设计,编写了主要的功能函数,实现了数据的转换和无线传输功能。该研究为后续的应用奠定了良好的基础。2.2 圆形死区模型
3 基于优化模型的无线传输程序
3.1 ADC中断初始化
3.2 配置ADC寄存器
3.3 设置摇杆死区
3.4 x、y、z轴坐标变换
4 试验验证
5 结论