基于HID 規(guī)范的六軸體感游戲手柄設計與實現(xiàn)
USB(Universal Serial Bus,通用串行總線)具有高速度、低成本、低功耗、即插即用和使用維護方便等優(yōu)點,隨著USB應用領域的逐步擴大,USB 設備現(xiàn)在不但是計算機連接外圍設備的標準輸入/輸出,它也成為智能電視連接外圍設備的標準輸入/輸出。HID 是Human Interface Dvices 的縮寫,即人機接口設備, 是USB 協(xié)議中最早提出并支持的一種設備類,也是應用最廣泛的一類USB 設備, 典型的HID 設備有鍵盤和鼠標等。USB 串行總線規(guī)范專門定義了HID 規(guī)范,只要設備符合HID 規(guī)范,就是HID 設備。操作系統(tǒng)自帶了HID 的驅動程序,用戶無需去開發(fā)很麻煩的驅動程序,這使HID 設備能夠與操作系統(tǒng)方便快捷的建立通信。
這些優(yōu)點使得HID 設備在智能電視領域也得到了越來越廣泛的應用,本論文就是研究基于HID 規(guī)范的六軸體感游戲手柄應用于智能遙控器中的設計與實現(xiàn)。
1 工作原理
智能遙控器包括兩部分———遙控器和RF 接收器(Dongle),遙控器端和DONgle 端采用射頻通信協(xié)議進行通信;而Dongle 端通過USB 接口與電視機連接, 它們之間通過USB協(xié)議進行通信。依據HID 規(guī)范,在Dongle 端模擬出一個具有輸入和輸出功能的HID 體感游戲手柄, 與電視機通過USB協(xié)議進行通信,從而將遙控器和體感游戲手柄合二為一。
Dongle 端與遙控器端對碼成功之后,它們之間就建立了通信。遙控器中體感游戲手柄功能的開啟和關閉主要是通過電視機的反饋信息實現(xiàn)的。按下遙控器端的體感開關鍵時,電視機收到信息立即發(fā)出反饋信息,使遙控器端的體感開關指示亮,體感游戲手柄功能開啟,用戶可用遙控器體驗體感游戲, 電視機會根據游戲的進度調用遙控器中的傳感器模塊、震動模塊、Audio 模塊,實現(xiàn)遙控器和電視機之間的互動;再按下遙控器端的體感開關鍵時,電視機發(fā)出反饋信息使遙控器端的體感開關指示燈滅,體感游戲手柄功能關閉。
體感游戲手柄的操作方式主要是按鍵和特殊動作。在本系統(tǒng)中, 體感游戲手柄所需的按鍵與遙控器本身的按鍵復用,特殊動作的數據轉換成相應的射頻鍵值,當有特殊動作操作時,以按鍵鍵值的形式發(fā)送出去。另外,體感游戲手柄特殊動作的功能可以用于操作智能電視機的TV 部分, 在體感游戲手柄模式下,遙控器通過計算傳感器的數據,檢測出向左右甩動和向前甩動一下、兩下4 個動作,可作為切換圖片、音樂等使用。比如向右甩為后一曲,向左甩為前一曲,向前為播放暫停,向前快速兩下為退出。
2 系統(tǒng)組成
2.1 硬件系統(tǒng)
智能遙控器有許多功能,這里主要研究體感游戲手柄功能的設計與實現(xiàn)。涉及到的芯片主要有六軸傳感器———三軸加速計(G-Sensor)和三軸陀螺儀(Gyro)與MCU,采用的加速計是ADXL345,陀螺儀是IMU3000,MCU 是IA2E。Dongle 端采用的MCU 也是IA2E。
2.1.1 ADXL345、IMU3000 和IA2E 性能簡介
ADXL345是一款小而薄的超低功耗三軸加速計,分辨率高(13 位),測量范圍達±16 g。可通過SPI(3 線或4 線)或I2C 數字接口訪問,ADXL345 非常適合應用于移動設備。它可以在傾斜檢測應用中測量靜態(tài)重力加速度,還可以測量運動或沖擊導致的動態(tài)加速度。其高分辨率(3.9 mg/LSB),能夠測量不到1.0°的傾斜角度變化。
IMU-3000內建了三軸陀螺儀與數字運動處理硬件加速引擎,并具有第二條I2C 接口來連接外接數字加速器,以執(zhí)行完整的六軸融合算法。在應用層面上,將線性及旋轉動作合并為單一的數據流。透過整合之融合算法輸出,IMU-3000可減輕系統(tǒng)主處理器的密集運動處理演算,不須頻繁讀取運動感測數據,使之成為低成本、低功耗的微處理器。
IA2E是SYNIC 公司的無線音頻收發(fā)芯片,包含無線射頻收發(fā)模塊和USB 接口模塊, 其USB 模塊包含一個控制端點,兩個同步端點和一個雙向中斷端點。具有非常強的RF 抗干擾特性。無需任何軟件支持即可通過I2S、USB 等接口連接到電腦、電視、MP3 等設備。
2.1.2 硬件系統(tǒng)設計
在系統(tǒng)設計上, 遙控器和六軸傳感器是兩個分離的模塊, 這樣做的好處是傳感器模塊不影響遙控器的其他功能。
本論文主要介紹一下六軸傳感器模塊與MCU 之間的通信方式和Dongle 端模塊的硬件系統(tǒng)設計。
首先,介紹傳感器模塊與MCU 之間的通信方式。它們之間通過簡單的I2C 通信協(xié)議方式進行通信。具有體感游戲手柄功能的智能遙控器的遙控器端功能模塊框圖如圖1 所示。
圖1 遙控器端功能模塊框圖
傳感器模塊與MCU 之間的電路連接方式如圖2 所示。由于傳感器模塊需要3.3 V 的電源, 而遙控器電路板上自帶的電池是5 V 的,所以還需要一個電壓轉換電路。傳感器模塊中的G-sensor 產生X 軸、Y 軸和Z 軸方向的加速度數據,Gyro產生X 軸、Y 軸和Z 軸方向的角速度數據。MCU 通過I2C 總線不斷的輪詢傳感器模塊來獲取這些數據,并把這些數據分析整理成8 個字節(jié)的數據包, 再以2.4 GHz 射頻通信協(xié)議打包發(fā)送給Dongle 端。
圖2 傳感器與MCU 之間連接的電路圖
Dongle 端通過射頻收發(fā)模塊與遙控器端進行數據傳輸,通過USB 總線與電視機之間進行數據傳輸。Dongle 端模塊的硬件電路比較簡單, 功能模塊框圖如圖3 所示, 采用單片機IA2E 作為它的MCU。由于IA2E 中包含了射頻收發(fā)模塊和USB 接口模塊,所以只需要一個MCU 即可。IA2E 集成了USB通訊中的底層協(xié)議, 具有省事的內置固件模式和靈活的外置固件模式,它只是負責數據交換,所以單片機程序設計非常簡潔。另外,可以在Dongle 端設計LED燈電路模塊,不僅美觀,而且可以輔助軟件更好地實現(xiàn)體感游戲手柄的功能, 還可以用來標識電視機的工作狀態(tài),保證Dongle 端做出正確的響應。
圖3 Dongle 端功能模塊框圖
2.2 軟件系統(tǒng)設計
本系統(tǒng)所設計和實現(xiàn)的體感游戲手柄具有輸入和輸出的功能,即它具有輸入和輸出HID 數據包。它不像鍵盤和鼠標是標準的HID 設備,需要根據HID 規(guī)范自定義它的數據包格式。根據數據包的格式,寫出其報告描述符,以保證在枚舉過程中正確識別出體感游戲手柄設備。Dongle 端分析整理從遙控器端獲取到的數據,根據設備的報告描述符,識別出體感游戲手柄數據,并把這些數據整理成符合其輸入數據包格式的數據,然后Dongle 端再以USB 協(xié)議的通信方式,將整理好的數據傳輸給電視機。同時Dongle 端接收電視機反饋回來的數據信息, 并整理成符合其輸出數據包格式的數據,然后將信息反饋給遙控器端,遙控器端再作出相應的響應。
與所有HID 設備一樣,具有體感游戲手柄功能的智能遙控器Dongle 端的應用程序設計也主要包括以下4 個方面的工作:1)查找所有HID 設備;2)確定哪一個是用戶需要的HID 設備,并連接該設備;3)獲得HID 設備的信息;4)根據用戶需要,讀取HID 輸入報告或者寫入HID 輸出報告。
智能遙控器中可能定義了多個HID 設備,需要使用兩個接口,接口0 用于實現(xiàn)其他HID 設備的功能,接口1 用于實現(xiàn)體感游戲手柄的功能。因此需要兩個非零端點,因為同一配置下的不同接口,必須使用不同的端點。而數據是通過非零端點進行傳輸的,體感游戲手柄的接口選用端點2 返回或發(fā)送報告數據。Dongle 端通過端點2 輸入向電視機返回體感游戲手柄的數據,電視機通過端點2 輸出中斷將反饋給遙控器的信息發(fā)出。
Dongle 插入后,怎樣讓電視機識別出USB 體感游戲手柄呢?設備枚舉的功能就是實現(xiàn)電視機識別設備的過程,只有枚舉成功了,電視機才能識別出設備,建立電視機與設備之間的通信。設備的枚舉過程都是通過端點0 實現(xiàn)的。電視機通過端點0 輸出中斷發(fā)出各種請求,數據存放在端點0 的輸出緩沖區(qū)中。Dongle 端讀取并分析端點0 輸出緩沖區(qū)的數據,然后通過端點0 輸入中斷做出相應的響應,數據存放到端點0輸入緩沖區(qū)中, 在電視機下一次發(fā)送IN 令牌包后,MCU 會自動將端點0 輸入緩沖區(qū)數據返回給電視機。當Dongle 端有多個報告描述符時,程序怎么知道電視機請求的是哪個呢? 電視機要獲取報告描述符時,請求是發(fā)送到接口的。當電視機發(fā)出發(fā)送到接口1 的報告描述符請求時,Dongle 端會返回體感游戲手柄的報告描述符數據給電視機, 從而成功完成枚舉過程。電視機識別出體感游戲手柄,建立它們之間的通信。
在本系統(tǒng)中,通過在芯片的集成開發(fā)環(huán)境中添加USB 模塊,根據實現(xiàn)設備的功能特點,做出相應設置并編譯,實現(xiàn)設備枚舉過程的功能及所需的代碼, 然后再根據設備的實際需求做相應的修改, 在Dongle 端程序的主函數中初始化USB 模塊,就可以實現(xiàn)電視機識別Dongle,進而識別出體感游戲手柄設備。Dongle 端程序主流程圖如圖4 所示。進入主函數,MCU 首先完成一系列初始化,包括中斷配置和USB模塊初始化(開始枚舉過程)。然后程序就處于一個無限循環(huán)中,實現(xiàn)電視機和設備之間的實時通信。
圖4 Dongle 端程序主流程
電視機和設備之間不是隨時都能夠進行通信的,只有設置了非零配置之后才能進行數據傳輸。在無限循環(huán)中,首先判斷電視機和Dongle 端的通信是否準備好,即設備的枚舉過程是否成功完成。這需要獲取配置值,進行判斷,若配置值非零,說明電視機和Dongle 端的通信已建立。Dongle 端不斷的獲取從遙控器端發(fā)來的數據,根據設備的設備描述符、配置描述符集合(包括斷點描述符、接口描述符等),分析整理后存放到相應HID 設備的HID 包中, 然后通過USB 總線傳遞給電視機。
若按下體感開關鍵,遙控器選擇的是體感游戲手柄功能;否則,遙控器選擇的是其他設備的功能。按下體感開關鍵,電視機先通過端點2 輸出中斷發(fā)出反饋信息, 使遙控器端的體感開關指示燈亮,體感游戲手柄功能打開,然后遙控器可以發(fā)送體感游戲手柄數據給電視機。Dongle 端發(fā)送體感游戲手柄數據到端點2 之前,需要檢查端點2 是否處于空閑狀態(tài),即里面是否還有數據未發(fā)送出去, 可以通過端點2 輸入中斷和總線復位中斷使端點2處于空閑狀態(tài)。如果端點2 輸入處于空閑狀態(tài),就可以通過端點2 輸入返回體感游戲手柄數據給電視機了。電視機會根據游戲的進度發(fā)出反饋信息, 調用遙控器的傳感器模塊、震動模塊和Audio 模塊,實現(xiàn)遙控器和電視機之間的互動。
3 結束語
本系統(tǒng)是基于HID 規(guī)范的六軸體感游戲手柄應用于智能遙控器中的設計與實現(xiàn),首先分析了這種體感游戲手柄的工作原理,然后從硬件系統(tǒng)和軟件系統(tǒng)兩方面提出了體感游戲手柄設計與實現(xiàn)的方案。在智能遙控器中可能有多個HID設備功能的情況下,通過共用一個USB 接口再實現(xiàn)體感游戲手柄的功能。經過反復調試驗證表明,具有這種六軸體感游戲手柄功能的智能遙控器工作性能良好,完全可以取代普通的體感游戲手柄體驗體感游戲。另外,可以基于此硬件系統(tǒng)和軟件系統(tǒng),遙控器端對傳感器的數據進行相應處理后傳輸給Dongle 端,Dongle 端可以模擬實現(xiàn)其他功能, 譬如進一步實現(xiàn)空中鼠標的功能。