劉偉靜,趙超澤,王 東,徐文麗,姚 寧,王小濤
(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 結論