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