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