梅方,劉衛東,2
(1.中國海洋大學信息科學與工程學院,山東青島266100;2.海信電器股份有限公司山東青島266071)
USB(Universal Serial Bus,通用串行總線)具有高速度、低成本、低功耗、即插即用和使用維護方便等優點,隨著USB應用領域的逐步擴大,USB設備現在不但是計算機連接外圍設備的標準輸入/輸出,它也成為智能電視連接外圍設備的標準輸入/輸出。HID是Human Interface Dvices的縮寫,即人機接口設備,是USB協議中最早提出并支持的一種設備類,也是應用最廣泛的一類USB設備,典型的HID設備有鍵盤和鼠標等。USB串行總線規范專門定義了HID規范,只要設備符合HID規范,就是HID設備。操作系統自帶了HID的驅動程序,用戶無需去開發很麻煩的驅動程序,這使HID設備能夠與操作系統方便快捷的建立通信。
這些優點使得HID設備在智能電視領域也得到了越來越廣泛的應用,本論文就是研究基于HID規范的六軸體感游戲手柄應用于智能遙控器中的設計與實現。
智能遙控器包括兩部分——遙控器和RF接收器(Dongle),遙控器端和Dongle端采用射頻通信協議進行通信;而Dongle端通過USB接口與電視機連接,它們之間通過USB協議進行通信。依據HID規范,在Dongle端模擬出一個具有輸入和輸出功能的HID體感游戲手柄,與電視機通過USB協議進行通信,從而將遙控器和體感游戲手柄合二為一。
Dongle端與遙控器端對碼成功之后,它們之間就建立了通信。遙控器中體感游戲手柄功能的開啟和關閉主要是通過電視機的反饋信息實現的。按下遙控器端的體感開關鍵時,電視機收到信息立即發出反饋信息,使遙控器端的體感開關指示亮,體感游戲手柄功能開啟,用戶可用遙控器體驗體感游戲,電視機會根據游戲的進度調用遙控器中的傳感器模塊、震動模塊、Audio模塊,實現遙控器和電視機之間的互動;再按下遙控器端的體感開關鍵時,電視機發出反饋信息使遙控器端的體感開關指示燈滅,體感游戲手柄功能關閉。
體感游戲手柄的操作方式主要是按鍵和特殊動作。在本系統中,體感游戲手柄所需的按鍵與遙控器本身的按鍵復用,特殊動作的數據轉換成相應的射頻鍵值[1],當有特殊動作操作時,以按鍵鍵值的形式發送出去。另外,體感游戲手柄特殊動作的功能可以用于操作智能電視機的TV部分,在體感游戲手柄模式下,遙控器通過計算傳感器的數據,檢測出向左右甩動和向前甩動一下、兩下4個動作,可作為切換圖片、音樂等使用。比如向右甩為后一曲,向左甩為前一曲,向前為播放暫停,向前快速兩下為退出。
智能遙控器有許多功能,這里主要研究體感游戲手柄功能的設計與實現。涉及到的芯片主要有六軸傳感器——三軸加速計(G-Sensor)和三軸陀螺儀(Gyro)與MCU,采用的加速計是ADXL345,陀螺儀是IMU3000,MCU是IA2E。Dongle端采用的MCU也是IA2E。
2.1.1 A DXL345、IMU3000和IA2E性能簡介
ADXL345[2]是一款小而薄的超低功耗三軸加速計,分辨率高(13位),測量范圍達±16 g。可通過SPI(3線或4線)或I2C數字接口訪問,ADXL345非常適合應用于移動設備。它可以在傾斜檢測應用中測量靜態重力加速度,還可以測量運動或沖擊導致的動態加速度。其高分辨率(3.9 mg/LSB),能夠測量不到1.0°的傾斜角度變化。
IMU-3000[3]內建了三軸陀螺儀與數字運動處理硬件加速引擎,并具有第二條I2C接口來連接外接數字加速器,以執行完整的六軸融合算法。在應用層面上,將線性及旋轉動作合并為單一的數據流。透過整合之融合算法輸出,IMU-3000可減輕系統主處理器的密集運動處理演算,不須頻繁讀取運動感測數據,使之成為低成本、低功耗的微處理器。
IA2E[4]是SYNIC公司的無線音頻收發芯片,包含無線射頻收發模塊和USB接口模塊,其USB模塊包含一個控制端點,兩個同步端點和一個雙向中斷端點。具有非常強的RF抗干擾特性。無需任何軟件支持即可通過I2S、USB等接口連接到電腦、電視、MP3等設備。
2.1.2 硬 件系統設計
在系統設計上,遙控器和六軸傳感器是兩個分離的模塊,這樣做的好處是傳感器模塊不影響遙控器的其他功能。本論文主要介紹一下六軸傳感器模塊與MCU之間的通信方式和Dongle端模塊的硬件系統設計。
首先,介紹傳感器模塊與MCU之間的通信方式。它們之間通過簡單的I2C通信協議方式進行通信。具有體感游戲手柄功能的智能遙控器的遙控器端功能模塊框圖如圖1所示。傳感器模塊與MCU之間的電路連接方式如圖2所示。由于傳感器模塊需要3.3 V的電源,而遙控器電路板上自帶的電池是5 V的,所以還需要一個電壓轉換電路。傳感器模塊中的G-sensor產生X軸、Y軸和Z軸方向的加速度數據,Gyro產生X軸、Y軸和Z軸方向的角速度數據。MCU通過I2C總線不斷的輪詢傳感器模塊來獲取這些數據,并把這些數據分析整理成8個字節的數據包,再以2.4 GHz射頻通信協議打包發送給Dongle端。

圖1 遙控器端功能模塊框圖Fig.1 Block diagram of function module of Remote control

圖2 傳感器與MCU之間連接的電路圖Fig.2 Circuit diagram between sensor and MCU
Dongle端通過射頻收發模塊與遙控器端進行數據傳輸,通過USB總線與電視機之間進行數據傳輸。Dongle端模塊的硬件電路比較簡單,功能模塊框圖如圖3所示,采用單片機IA2E作為它的MCU。由于IA2E中包含了射頻收發模塊和USB接口模塊,所以只需要一個MCU即可。IA2E集成了USB通訊中的底層協議,具有省事的內置固件模式和靈活的外置固件模式,它只是負責數據交換,所以單片機程序設計非常簡潔。另外,可以在Dongle端設計LED燈電路模塊,不僅美觀,而且可以輔助軟件更好地實現體感游戲手柄的功能,還可以用來標識電視機的工作狀態,保證Dongle端做出正確的響應。

圖3 Dongle端功能模塊框圖Fig.3 Block diagram of function module dongle
本系統所設計和實現的體感游戲手柄具有輸入和輸出的功能,即它具有輸入和輸出HID數據包。它不像鍵盤和鼠標是標準的HID設備,需要根據HID規范[1,5-6]自定義它的數據包格式。根據數據包的格式,寫出其報告描述符,以保證在枚舉過程中正確識別出體感游戲手柄設備。Dongle端分析整理從遙控器端獲取到的數據,根據設備的報告描述符,識別出體感游戲手柄數據,并把這些數據整理成符合其輸入數據包格式的數據,然后Dongle端再以USB協議的通信方式,將整理好的數據傳輸給電視機。同時Dongle端接收電視機反饋回來的數據信息,并整理成符合其輸出數據包格式的數據,然后將信息反饋給遙控器端,遙控器端再作出相應的響應。
與所有HID設備一樣,具有體感游戲手柄功能的智能遙控器Dongle端的應用程序設計也主要包括以下4個方面的工作[7]:1)查找所有HID設備;2)確定哪一個是用戶需要的HID設備,并連接該設備;3)獲得HID設備的信息;4)根據用戶需要,讀取HID輸入報告或者寫入HID輸出報告。
智能遙控器中可能定義了多個HID設備,需要使用兩個接口,接口0用于實現其他HID設備的功能,接口1用于實現體感游戲手柄的功能。因此需要兩個非零端點,因為同一配置下的不同接口,必須使用不同的端點。而數據是通過非零端點進行傳輸的,體感游戲手柄的接口選用端點2返回或發送報告數據。Dongle端通過端點2輸入向電視機返回體感游戲手柄的數據,電視機通過端點2輸出中斷將反饋給遙控器的信息發出。
Dongle插入后,怎樣讓電視機識別出USB體感游戲手柄呢?設備枚舉[8]的功能就是實現電視機識別設備的過程,只有枚舉成功了,電視機才能識別出設備,建立電視機與設備之間的通信。設備的枚舉過程都是通過端點0實現的。電視機通過端點0輸出中斷發出各種請求,數據存放在端點0的輸出緩沖區中。Dongle端讀取并分析端點0輸出緩沖區的數據,然后通過端點0輸入中斷做出相應的響應,數據存放到端點0輸入緩沖區中,在電視機下一次發送IN令牌包后,MCU會自動將端點0輸入緩沖區數據返回給電視機。當Dongle端有多個報告描述符時,程序怎么知道電視機請求的是哪個呢?電視機要獲取報告描述符時,請求是發送到接口的。當電視機發出發送到接口1的報告描述符請求時,Dongle端會返回體感游戲手柄的報告描述符數據給電視機,從而成功完成枚舉過程。電視機識別出體感游戲手柄,建立它們之間的通信。
在本系統中,通過在芯片的集成開發環境中添加USB模塊,根據實現設備的功能特點,做出相應設置并編譯,實現設備枚舉過程的功能及所需的代碼,然后再根據設備的實際需求做相應的修改,在Dongle端程序的主函數中初始化USB模塊,就可以實現電視機識別Dongle,進而識別出體感游戲手柄設備。Dongle端程序主流程圖如圖4所示。進入主函數[8-9],MCU首先完成一系列初始化,包括中斷配置和USB模塊初始化(開始枚舉過程)。然后程序就處于一個無限循環中,實現電視機和設備之間的實時通信。

圖4 Dongle端程序主流程Fig.4 Program's main process of Dongle
電視機和設備之間不是隨時都能夠進行通信的,只有設置了非零配置之后才能進行數據傳輸。在無限循環中,首先判斷電視機和Dongle端的通信是否準備好,即設備的枚舉過程是否成功完成。這需要獲取配置值,進行判斷,若配置值非零,說明電視機和Dongle端的通信已建立。Dongle端不斷的獲取從遙控器端發來的數據,根據設備的設備描述符、配置描述符集合(包括斷點描述符、接口描述符等),分析整理后存放到相應HID設備的HID包中,然后通過USB總線傳遞給電視機。若按下體感開關鍵,遙控器選擇的是體感游戲手柄功能;否則,遙控器選擇的是其他設備的功能。按下體感開關鍵,電視機先通過端點2輸出中斷發出反饋信息,使遙控器端的體感開關指示燈亮,體感游戲手柄功能打開,然后遙控器可以發送體感游戲手柄數據給電視機。Dongle端發送體感游戲手柄數據到端點2之前,需要檢查端點2是否處于空閑狀態,即里面是否還有數據未發送出去,可以通過端點2輸入中斷和總線復位中斷使端點2處于空閑狀態。如果端點2輸入處于空閑狀態,就可以通過端點2輸入返回體感游戲手柄數據給電視機了。電視機會根據游戲的進度發出反饋信息,調用遙控器的傳感器模塊、震動模塊和Audio模塊,實現遙控器和電視機之間的互動。
本系統是基于HID規范的六軸體感游戲手柄應用于智能遙控器中的設計與實現,首先分析了這種體感游戲手柄的工作原理,然后從硬件系統和軟件系統兩方面提出了體感游戲手柄設計與實現的方案。在智能遙控器中可能有多個HID設備功能的情況下,通過共用一個USB接口再實現體感游戲手柄的功能。經過反復調試驗證表明,具有這種六軸體感游戲手柄功能的智能遙控器工作性能良好,完全可以取代普通的體感游戲手柄體驗體感游戲。另外,可以基于此硬件系統和軟件系統,遙控器端對傳感器的數據進行相應處理后傳輸給Dongle端,Dongle端可以模擬實現其他功能,譬如進一步實現空中鼠標的功能。
[1]USB開發者論壇.Universal Serial Bus HID Usage Tables[EB/OL].[2010-11-08].http://www.usb.org/.
[2]ANALOG DEVICES.ADXL 345數據手冊[EB/OL].[2010-12-20].http://www.analog.com/.
[3]InvenSense.IMU-3000 Motion Processing Unit Product Specification Rev 1.1[EB/OL].[2010-12-25].http://www.invensense.com/mems/gyro/imu3000.html.
[4]SYNIC.IA2E數據手冊[EB/OL].[2011-01-06].http://www.syncomm.com.tw.
[5]USB開發者論壇.Device Class Definition for Human Interface Devices[EB/OL].[2010-11-08].http://www.usb.org/.
[6]百合電子工作室.USB HID設備類協議學習入門[EB/OL].[2010-11-10].http://www.baiheee.com/.
[7]Axelson J.USB大全[M].陳逸,等譯.北京:中國電力出版社,2001.
[8]劉榮.圈圈教你玩USB[M].北京航天航空大學出版社,2009.
[9]楊晶晶,江春華.USB HID設備驅動程序設計[J].微計算機信息,2006,22(17):1-2.
YANG Jing-jing,JIANG Chun-hua.Design of USB HID device driver[J].Micro-Computer Information,2006,22(17):1-2.