劉偉靜,趙超澤,王 東,徐文麗,姚 寧,王小濤
(1.天津航天機(jī)電設(shè)備研究所,天津 300458;2.天津市宇航智能裝備技術(shù)企業(yè)重點(diǎn)實(shí)驗(yàn)室,天津 300458;3.北京交通大學(xué)海濱學(xué)院,河北 廊坊 061100)
隨著現(xiàn)代機(jī)械工程的快速發(fā)展,工業(yè)手柄[1-2]越來(lái)越多地應(yīng)用于無(wú)人機(jī)、機(jī)器人[3]、移動(dòng)車(chē)等。其中,工業(yè)手柄的搖桿[4]操作可實(shí)現(xiàn)設(shè)備移動(dòng)的靈活性與穩(wěn)定性。手柄控制方式分為無(wú)線(xiàn)和有線(xiàn)兩種。無(wú)線(xiàn)手柄與有線(xiàn)手柄相比,具有較高的移動(dòng)靈活性,且安裝方便、操作簡(jiǎn)單、調(diào)試維護(hù)成本較低。因此,大部分領(lǐng)域使用無(wú)線(xiàn)手柄進(jìn)行遠(yuǎn)程控制。文獻(xiàn)[5]以STC89C52單片機(jī)為主控單元,設(shè)計(jì)了搖桿信號(hào)無(wú)線(xiàn)傳輸模塊。該模塊在模數(shù)轉(zhuǎn)換器(analog to digital converter,ADC)模塊初始化時(shí)讀取的三組數(shù)據(jù)均為無(wú)效數(shù)據(jù),且在檢測(cè)數(shù)據(jù)時(shí)需在一定時(shí)間內(nèi)關(guān)閉無(wú)線(xiàn)傳輸,因而增加了數(shù)據(jù)處理時(shí)間和設(shè)備能耗。文獻(xiàn)[6]設(shè)計(jì)了一種便攜式多功能無(wú)線(xiàn)游戲手柄。該手柄能準(zhǔn)確輸出控制命令,但同一時(shí)間從緩存區(qū)讀取的11個(gè)字節(jié)不一定是同一個(gè)數(shù)據(jù)包中的,導(dǎo)致信道利用不充分甚至丟包。
本文從手柄軟件設(shè)計(jì)入手,采用CC430F6137單片機(jī)[7]作為手柄控制器的核心部分,利用ADC采集搖桿偏移量,設(shè)置ADC采樣參數(shù),確??刂破髅看尉刹杉揭粋€(gè)完整的數(shù)據(jù)包;通過(guò)對(duì)比的方式建立搖桿數(shù)學(xué)優(yōu)化模型,以提高搖桿操作精度。
作為智能設(shè)備的上位機(jī)系統(tǒng),無(wú)線(xiàn)手柄具有遠(yuǎn)距離遙控下位機(jī)的功能,可實(shí)現(xiàn)平移、轉(zhuǎn)向、升降、翻轉(zhuǎn)等動(dòng)作。無(wú)線(xiàn)手柄操控方便,可靠性較高,能較好地滿(mǎn)足使用者的要求。
單片機(jī)具有集成度高、可靠性高、控制功能強(qiáng)、功耗低的特點(diǎn),是工業(yè)控制領(lǐng)域廣泛使用的元件。德州儀器推出的射頻芯片CC430延續(xù)了MSP430單片機(jī)的超低功耗設(shè)計(jì),采用了CC1101[8]作為無(wú)線(xiàn)內(nèi)核,成為新一代無(wú)線(xiàn)式單片機(jī)。因此,本文選用CC430F6137作為手柄控制核心單元。將CC430F6137中的13個(gè)I/O連接手柄按鍵,4個(gè)模擬量接口連接手柄搖桿。手柄顯示屏采用并行通信模式。其中,手柄搖桿產(chǎn)生的模擬量信號(hào)通過(guò)ADC中斷轉(zhuǎn)換成數(shù)字量信號(hào),并存入CC430F6137單片機(jī)寄存器內(nèi)。解析該搖桿信號(hào)即可控制下位機(jī)的動(dòng)作。手柄硬件結(jié)構(gòu)如圖1所示。
圖1 手柄硬件結(jié)構(gòu)框圖
本文設(shè)計(jì)的手柄采用雙軸搖桿模塊。該模塊由2個(gè)滑動(dòng)變阻器[9]組成。撥動(dòng)搖桿時(shí)滑動(dòng)變阻器的阻值發(fā)生變化,對(duì)應(yīng)的x、y軸電壓值隨之變化,進(jìn)而產(chǎn)生x、y軸方向的偏移量。當(dāng)搖桿不進(jìn)行任何操作時(shí),單片機(jī)ADC采集到的x、y軸的偏移量視為搖桿的原點(diǎn)。然而,由于滑動(dòng)變阻器的不穩(wěn)定性,搖桿原點(diǎn)會(huì)在一定范圍內(nèi)浮動(dòng),易產(chǎn)生手柄無(wú)操作但下位機(jī)動(dòng)作的問(wèn)題。因此,必須將搖桿原點(diǎn)限定在一定范圍(即死區(qū)[10]范圍)內(nèi),以防止危害事故的發(fā)生。本文以該特性為出發(fā)點(diǎn)優(yōu)化搖桿死區(qū),提高手柄操控性能。搖桿偏移量采集流程如圖2所示。
圖2 搖桿偏移量采集流程
在保證搖桿正常應(yīng)用的前提下擴(kuò)大搖桿死區(qū)范圍,確定在不進(jìn)行任何操作時(shí)搖桿采集點(diǎn)數(shù)始終保持在死區(qū)范圍內(nèi)。不同的死區(qū)設(shè)置方式具有不同的效果。下面解析搖桿死區(qū)分別設(shè)置為方形和圓形時(shí)的特點(diǎn),并優(yōu)化設(shè)計(jì)。
方形死區(qū)模型如圖3所示。
圖3 方形死區(qū)模型
當(dāng)不操作搖桿時(shí),設(shè)定搖桿x、y軸的實(shí)際偏移量分別為s、t(s>0,t>0)。死區(qū)范圍設(shè)為:當(dāng)x值滿(mǎn)足a 搖桿在死區(qū)范圍外,xvirtual、yvirtual軸正負(fù)方向的偏移量分別為1 024,即解析后的搖桿坐標(biāo)范圍為-1 024≤xvirtual≤1 024、-1 024≤yvirtual≤1 024。由此可以得到死區(qū)范圍之外的角度計(jì)算方法,如式(1)所示。 (1) 式中:A為搖桿當(dāng)前角度值。 當(dāng)x、y值處于陰影區(qū)域2時(shí),滿(mǎn)足xvirtual=0或yvirtual=0,表示搖桿向正前、正左、正后、正右四個(gè)方向推動(dòng)。 上述方式可在保證搖桿正常應(yīng)用的前提下有效擴(kuò)大死區(qū)范圍,保證搖桿不會(huì)在非操作模式下發(fā)出錯(cuò)誤信號(hào)。 以圖3(a)的第一象限為例。當(dāng)搖桿沿圖3(b)中的虛線(xiàn)箭頭方向推動(dòng)時(shí),搖桿角度會(huì)出現(xiàn)0°(OA)→90°(AB)→γ(0<γ<45°)的跳變,造成輸出方向的突變,極易引起下位機(jī)方向突變,甚至死機(jī)。同理,在其他3個(gè)象限也會(huì)出現(xiàn)角度跳變現(xiàn)象。 滿(mǎn)足(xvirtual-s)2+(yvirtual-t)2≤r2(r>0)的區(qū)域?yàn)樗绤^(qū)范圍。當(dāng)搖桿處于死區(qū)范圍內(nèi)時(shí),坐標(biāo)設(shè)為O(0,0)。 死區(qū)范圍之外的角度計(jì)算如式(1)所示。為判斷搖桿向正前、正左、正后、正右四個(gè)方向的推動(dòng),設(shè)定: (2) 式中:0°<α<45°。 圓形死區(qū)模型如圖4所示。 圖4 圓形死區(qū)模型 根據(jù)式(1)、式(2)可知,該設(shè)置方法擴(kuò)大了搖桿0°、90°、180°、270°四個(gè)方向的范圍。圓形死區(qū)模型撥動(dòng)方向如圖4(b)中陰影區(qū)域2所示。 分析圖4(b)中的第一象限可知,直行推動(dòng)搖桿至死區(qū)范圍外,不會(huì)出現(xiàn)角度跳變,消除了搖桿操作造成的下位機(jī)方向突變的問(wèn)題。 搖桿采用圓形死區(qū)模型。本文采用自定義方式設(shè)置無(wú)線(xiàn)傳輸程序,采用6個(gè)字節(jié)的自由協(xié)議:幀頭為0xAA;第2個(gè)字節(jié)為x軸坐標(biāo)數(shù)據(jù);第3個(gè)字節(jié)為y軸坐標(biāo)數(shù)據(jù);第4個(gè)字節(jié)為角度;第5個(gè)字節(jié)為校驗(yàn)位,應(yīng)用偶校驗(yàn)方式;幀尾0xBB。 手柄發(fā)送數(shù)據(jù)流程如圖5所示。 圖5 手柄發(fā)送數(shù)據(jù)流程 本文應(yīng)用CC430F6137單片機(jī)中的ADC中斷構(gòu)建程序。具體程序構(gòu)建流程如下所述。 首先初始化ADC中斷,然后通過(guò)配置寄存器,使能該中斷。 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); } 在中斷程序中應(yīng)用無(wú)符號(hào)整型數(shù)組results[8]配置ADC中的0、1、2、3、6、7號(hào)寄存器,將x、y、z三軸坐標(biāo)分別配置在results數(shù)組的1、0、6號(hào)寄存器中。具體如下。 results[0] = ADC12MEM0; //y軸坐標(biāo) results[1] = ADC12MEM1; //x軸坐標(biāo) results[2] = ADC12MEM2; //外部電壓 results[3] = ADC12MEM3; //電池電壓 results[6] = ADC12MEM6; //z軸坐標(biāo) results[7] = ADC12MEM7; x軸和y軸采用二維坐標(biāo),設(shè)置圓形死區(qū)。中心點(diǎn)設(shè)置方法為:采集20次x軸和y軸搖桿在起始點(diǎn)的坐標(biāo),取其平均值,設(shè)為中心點(diǎn),例如(2 035,2 022)。以中心點(diǎn)為圓點(diǎn),以Blind_Spot為半徑,設(shè)置圓形死區(qū)。 z軸單獨(dú)作為一維坐標(biāo)。采集20次z軸搖桿在起始點(diǎn)的坐標(biāo),取其平均值,設(shè)為中心,例如2 050。以中心點(diǎn)為起點(diǎn),上下取100,設(shè)置為死區(qū)范圍,即z軸在(1 950,2 150)范圍內(nèi)的變化忽略不計(jì)。 具體程序如下。 if(zeroflag==0) //原點(diǎn)限制 { 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; } 搖桿坐標(biāo)變化范圍為0~4 096,在初始位置時(shí)在2 048上下變化。將中心(2 035,2 022)轉(zhuǎn)換為原點(diǎn)(0,0),將上下1 024設(shè)置為搖桿的死區(qū)范圍,超出1 024的部分記為1 024。其中,x、y軸坐標(biāo)變換代碼如下。 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坐標(biāo)變換代碼如下: |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; |} 本文應(yīng)用工業(yè)手柄無(wú)線(xiàn)遙控全向移動(dòng)轉(zhuǎn)運(yùn)車(chē)的方式,測(cè)試搖桿死區(qū)優(yōu)化模型。試驗(yàn)選擇周?chē)系K物較少、地面干凈平整的場(chǎng)地,使轉(zhuǎn)運(yùn)車(chē)可全向移動(dòng)。試驗(yàn)工業(yè)手柄發(fā)射功率為-10 dBm,最大發(fā)射半徑為100 m,距離轉(zhuǎn)運(yùn)車(chē)5 m處。x軸和y軸的死區(qū)半徑設(shè)置為100 mm。多次撥動(dòng)搖桿并將角度值顯示于液晶屏(liquid crystal display,LCD)上,觀察轉(zhuǎn)運(yùn)車(chē)的移動(dòng)方向是否與LCD上的角度信息一致。以x、y軸第一象限為例,說(shuō)明圓形死區(qū)模型和方形死區(qū)模型的優(yōu)劣。緩慢推動(dòng)搖桿,觀察x軸和y軸偏移量的變化。 角度數(shù)值變化如表1所示。 表1 角度數(shù)值變化 由表1可知,當(dāng)設(shè)置圓形死區(qū)時(shí),由0°變化到65°,無(wú)角度跳變發(fā)生;當(dāng)設(shè)置方形死區(qū)時(shí),轉(zhuǎn)運(yùn)車(chē)的移動(dòng)方向由0°變化到90°,再跳變到65°。該跳變會(huì)引起轉(zhuǎn)運(yùn)車(chē)的行走角度突然發(fā)生變化,造成危險(xiǎn)。而設(shè)置圓形死區(qū)時(shí),無(wú)角度跳變的情況發(fā)生,消除了上述危險(xiǎn)。 本文以CC430F6137作為手柄控制核心,根據(jù)工業(yè)手柄的可靠性建立搖桿數(shù)學(xué)模型,設(shè)定搖桿的死區(qū)模型,并分析該模型的優(yōu)劣。針對(duì)搖桿信號(hào)的無(wú)線(xiàn)傳輸程序進(jìn)行了分析設(shè)計(jì),編寫(xiě)了主要的功能函數(shù),實(shí)現(xiàn)了數(shù)據(jù)的轉(zhuǎn)換和無(wú)線(xiàn)傳輸功能。該研究為后續(xù)的應(yīng)用奠定了良好的基礎(chǔ)。2.2 圓形死區(qū)模型
3 基于優(yōu)化模型的無(wú)線(xiàn)傳輸程序
3.1 ADC中斷初始化
3.2 配置ADC寄存器
3.3 設(shè)置搖桿死區(qū)
3.4 x、y、z軸坐標(biāo)變換
4 試驗(yàn)驗(yàn)證
5 結(jié)論