文獻(xiàn)標(biāo)識(shí)碼: A
文章編號(hào): 0258-7998(2013)09-0031-03
最近業(yè)界的統(tǒng)計(jì)數(shù)據(jù)顯示,智能手機(jī)與自動(dòng)化及機(jī)械系統(tǒng)之間存在著很大的市場潛力。2011年Google推出Android開放配件協(xié)議AOA(Android Open Accessory Protocol)及配件開發(fā)工具包ADK(Accessory Development Kit)提供了Android設(shè)備與Android配件通過USB或藍(lán)牙進(jìn)行通信的API,為基于Android系統(tǒng)的智能設(shè)備控制外設(shè)提供了條件。利用Android,系統(tǒng)可以連接從家用電器到重型機(jī)械、機(jī)器人等多種設(shè)備。
Android作為一種基于開源Linux的智能手機(jī)操作系統(tǒng),廣泛應(yīng)用于手機(jī)、平板電腦等移動(dòng)設(shè)備中。在各種Android設(shè)備提供的接口中,USB接口是常見接口,該接口的作用是為Android設(shè)備充電并通過PC端的驅(qū)動(dòng)程序?qū)崿F(xiàn)Android設(shè)備與PC的交互。如何拓展Android設(shè)備的USB接口功能是當(dāng)前的研究熱點(diǎn)之一。針對(duì)該問題,本文介紹了一種基于AOA協(xié)議實(shí)現(xiàn)Android設(shè)備USB通信的方案,并通過Android手機(jī)控制步進(jìn)電機(jī)的案例給出了方案的實(shí)現(xiàn)方法。
1 Android USB通信模式
Android系統(tǒng)支持多種USB外圍設(shè)備。根據(jù)Android設(shè)備在USB通信中充當(dāng)?shù)慕巧梢詫ndroid USB通信分為主機(jī)模式(Host Mode)和配件模式(Accessory Mode)[1]兩種模式。
1.1 主機(jī)模式
主機(jī)模式是指Android設(shè)備充當(dāng)USB主機(jī)并為總線供電。此模式下,Android設(shè)備需支持USB主機(jī)功能或OTG功能,此時(shí)Android設(shè)備的USB主機(jī)稱為USB嵌入式主機(jī)EH(Embedded Host)[2]。與PC上的USB主機(jī)相比,EH設(shè)備可能無法為連接到其總線上的未識(shí)別外圍設(shè)備加載驅(qū)動(dòng)程序,因此它們對(duì)其目標(biāo)外圍設(shè)備列表TPL(Target Peripheral List)進(jìn)行了定義[3]。這些外圍USB設(shè)備大部分為HID設(shè)備(Human Interface Device)、BOMS設(shè)備(Bulk Only Mass Storage,如U盤)和CDC設(shè)備(Comm-
unication Device Class,USB通信設(shè)備類,如打印機(jī)),其驅(qū)動(dòng)程序已存在于Android平臺(tái)的系統(tǒng)中(Linux Kernel),因此Android設(shè)備可以與其直接通信。
主機(jī)模式示意圖如圖1所示。
1.2 配件模式
配件模式是指Android設(shè)備充當(dāng)USB從機(jī),外部設(shè)備充當(dāng)主機(jī)并為總線供電。此模式下,外部USB設(shè)備稱為Android配件。該模式為不具備主機(jī)功能的Android設(shè)備提供與USB設(shè)備交互的能力。Android設(shè)備和Android配件都必須支持AOA協(xié)議。不支持AOA協(xié)議的設(shè)備可以通過Android配件開發(fā)板(ADK板)與Android設(shè)備連接,成為Android設(shè)備的間接配件。
配件模式示意圖如圖2所示。
本文介紹的基于AOA協(xié)議的Android設(shè)備USB通信方案即采用配件模式。主機(jī)模式和配件模式在Android 3.1(API level 12)及更高的平臺(tái)中直接支持。配件模式作為一個(gè)附加庫也被Android 2.3.4(API level 10)支持。設(shè)備廠商可以選擇是否在設(shè)備的Linux系統(tǒng)鏡像中包含附加庫。對(duì)主機(jī)和配件模式的支持最終取決于設(shè)備的硬件,而不是Android平臺(tái)的等級(jí)(軟件)。
1.3 Android配件、ADK及AOA協(xié)議
Android配件是指遵循AOA協(xié)議的硬件,是Android配件模式中的概念。從硬件角度講,Android配件具有實(shí)現(xiàn)USB EH功能和AOA協(xié)議的微處理器以及包括USB接口在內(nèi)的輸入/輸出接口。Android配件必須與Android平臺(tái)一起工作。
ADK是開發(fā)Android配件的參考開發(fā)包,該開發(fā)包基于Arduino公司的開源電子成型平臺(tái)[4]。ADK開發(fā)包包括Android配件硬件設(shè)計(jì)文檔、Android配件固件源碼、Android設(shè)備程序源碼。
AOA協(xié)議是Android設(shè)備與Android配件之間進(jìn)行USB通信需遵循的連接協(xié)議,該協(xié)議規(guī)定了Android配件如何檢測Android設(shè)備并與其建立通信。AOA協(xié)議規(guī)定配件需具備以下4項(xiàng)功能[5]:
(1)偵聽自身的USB接口,等待與其連接的Android設(shè)備。
(2)檢測Android設(shè)備是否支持AOA協(xié)議。
(3)如果需要,啟動(dòng)Android設(shè)備的USB配件模式。
(4)與Android設(shè)備建立USB通信。
2 USB配件模式開發(fā)
Android配件模式開發(fā)需要在Android設(shè)備端和Android配件端分別進(jìn)行開發(fā)。
2.1 Android設(shè)備端開發(fā)
Android設(shè)備端需進(jìn)行以下兩項(xiàng)工作:
(1)確保設(shè)備支持AOA協(xié)議。設(shè)備對(duì)AOA協(xié)議是否支持由設(shè)備硬件和Android系統(tǒng)版本決定。
(2)調(diào)用ADK中的API開發(fā)USB應(yīng)用程序。
ADK中與USB配件模式相關(guān)的兩個(gè)類是UsbManager和UsbAccessory。UsbManager用于枚舉連接的USB配件并與其通信,UsbAccessory代表Android配件并包含獲取配件描述信息的方法。
在編寫程序前,需要為Android工程做以下設(shè)置工作[6]:
(1)配置Android Mainfest文件,聲明使用配件模式,指定最低SDK版本,并設(shè)置配件過濾意圖。
(2)配置accessory_filter.xml文件。accessory_filter.xml文件用于描述希望Android設(shè)備檢測的USB配件的描述信息,包含manufacturer、model、version 3個(gè)屬性。在Android配件的固件程序中,同樣包含以上3個(gè)屬性值。根據(jù)AOA協(xié)議,當(dāng)Android配件連接到Android設(shè)備上時(shí),配件會(huì)發(fā)送該屬性值到Android設(shè)備。Android程序?qū)⑽ㄒ豁憫?yīng)與其accessory_filter.xml中指定的屬性值匹配的Android配件。
Android設(shè)備端程序開發(fā)的流程如下:
(1)發(fā)現(xiàn)配件并過濾。
(2)獲取與配件通信的權(quán)限。通過廣播接收器(Broad-castReceiver)的方式以彈出授權(quán)對(duì)話框的形式詢問用戶是否允許與Android配件通信。
(3)開始與配件通信。創(chuàng)建文件輸入輸出流代表USB批量傳輸端點(diǎn),通過獨(dú)立線程以流傳輸?shù)姆绞綄?shí)現(xiàn)USB通信。
(4)終止與配件通信。通過廣播接收器偵聽USB配件與Android設(shè)備的斷開操作,當(dāng)事件發(fā)生時(shí),關(guān)閉文件輸入/輸出流。
2.2 Android配件端開發(fā)
Android配件端需進(jìn)行以下兩項(xiàng)工作:
(1)根據(jù)ADK中的硬件設(shè)計(jì)文檔設(shè)計(jì)具有USB主控制器的硬件電路,并支持USB協(xié)議。
(2)將AOA協(xié)議以固件代碼的形式下載至Android配件的主芯片中。
目前,已有多家公司為Android設(shè)備的配件模式開發(fā)提供專門的ADK板,ADK板將AOA協(xié)議以程序的方式燒寫至芯片中,ADK板也即Android配件。目前常見的ADK板有Arduino的Arduino Mega ADK板、SparkFun的IOIO板,此外還有DIY Drones、Microchip、RT Corp、Seeed Studio、Troido等公司生產(chǎn)的ADK板。采用ADK板將可節(jié)省Android配件端的開發(fā)時(shí)間。
3 系統(tǒng)設(shè)計(jì)
3.1 總體設(shè)計(jì)
構(gòu)建的系統(tǒng)框圖如圖3所示。
采用的ADK板是由英國飛特蒂亞FTDI(Future Technology Devices International Ltd.)公司生產(chǎn)的Android平臺(tái)USB主控模塊(USB Android Host Module)[7],型號(hào)為UMFT311EV,于2012年7月31日推出。UMFT311EV板具有USB主控功能和USB接口橋接功能,其特性如下:
(1)采用USB Android主控芯片F(xiàn)T311D,單芯片內(nèi)集成USB協(xié)議。
(2)兼容USB 2.0全速模式(最大傳輸速率12 Mb/s,即1.5 MB/s,最大輸出電流500 mA)。
(3)6種接口類型,即GPIO(7路)、UART、PWM(4路)、I2C Master、SPI Master、SPI Slave。
(4)6種接口只能單一工作,通過跳線帽和3個(gè)接口類型選擇引腳選擇接口類型。
UMFT311EV板支持AOA協(xié)議,作為Android配件無需用戶做配件端的開發(fā),而且為Android設(shè)備端的程序開發(fā)提供Java驅(qū)動(dòng)包。因此采用UMFT311EV板能夠?qū)崿F(xiàn)Android手機(jī)、平板與其他設(shè)備的通信,進(jìn)行設(shè)備控制和數(shù)據(jù)采集,并能與現(xiàn)有系統(tǒng)快速集成,降低開發(fā)難度和開發(fā)時(shí)間。
在此,以Android手機(jī)小米MI2和步進(jìn)電機(jī)28BYJ48為例,通過UMFT311EV板的4路GPIO口實(shí)現(xiàn)Android手機(jī)USB控制步進(jìn)電機(jī)。
3.2 軟件設(shè)計(jì)
在設(shè)計(jì)Android手機(jī)端軟件時(shí),采用FTDI公司為Android平臺(tái)提供的驅(qū)動(dòng)包。根據(jù)該驅(qū)動(dòng)包,架構(gòu)如圖4所示的應(yīng)用程序。
FT311驅(qū)動(dòng)層提供驅(qū)動(dòng)UMFT311EV板上接口的方法和實(shí)現(xiàn)Android應(yīng)用程序與UMFT311EV板USB通信的方法。該層為用戶層提供封裝的方法,為用戶開發(fā)程序屏蔽底層編程細(xì)節(jié)。用戶層通過調(diào)用FT311驅(qū)動(dòng)層的方法實(shí)現(xiàn)對(duì)UMFT311EV板上接口的控制。
本實(shí)驗(yàn)編程采用FT311驅(qū)動(dòng)層提供的配置GPIO、讀GPIO、寫GPIO、重置GPIO 4個(gè)方法實(shí)現(xiàn)對(duì)步進(jìn)電機(jī)的控制,程序流程如圖5所示。
4 系統(tǒng)測試
本設(shè)計(jì)中將Android手機(jī)作為脈沖信號(hào)源和脈沖分配器,通過軟件編程為步進(jìn)電機(jī)提供脈沖信號(hào),并通過驅(qū)動(dòng)芯片ULN2003驅(qū)動(dòng)步進(jìn)電機(jī)。系統(tǒng)測試過程如下:
(1)用跳線帽設(shè)置ADK板的接口類型為GPIO,將步進(jìn)電機(jī)與其驅(qū)動(dòng)板連接,驅(qū)動(dòng)板與ADK板的GPIO口連接,并給ADK板上電。
(2)將軟件安裝至手機(jī)上,然后通過USB線將ADK板與手機(jī)連接。
(3)連接后,手機(jī)將彈出授權(quán)對(duì)話框,提示用戶打開(2)中安裝的軟件。
(4)進(jìn)入軟件界面后,點(diǎn)擊“設(shè)定輸出”按鈕,設(shè)定GPIO口的數(shù)據(jù)傳輸方向;點(diǎn)擊“啟動(dòng)”、“停止”、“正轉(zhuǎn)”、“反轉(zhuǎn)”,拖動(dòng)速度調(diào)節(jié)滑塊,可實(shí)現(xiàn)對(duì)電機(jī)的控制。
本文介紹了一種基于AOA協(xié)議實(shí)現(xiàn)Android設(shè)備USB通信的方案。該方案利用ADK開發(fā)板UMFT311EV實(shí)現(xiàn)外圍設(shè)備與Android設(shè)備的USB連接,通過Android USB配件模式編程實(shí)現(xiàn)了Android設(shè)備對(duì)外圍設(shè)備的控制。實(shí)際測試表明,該方案設(shè)計(jì)簡單,能夠?qū)崿F(xiàn)Android設(shè)備對(duì)外設(shè)的控制。
參考文獻(xiàn)
[1] Google.USB host and accessory[EB/OL].[2013-03-02].http://developer.android.com/guide/topics/connectivity/usb/index.html.
[2] USB.USB On-The-Go and embedded host[EB/OL].[2013-03-02].http://www.usb.org/developers/onthego.
[3] HARMON D.哪種USB接口適合您的應(yīng)用[J].今日電子,2013(2):29-31.
[4] Google.Accessory development kit 2011 guide[EB/OL].[2013-03-02].http://developer.android.com/tools/adk/adk.html.
[5] Google.Android open accessory protocol 1.0[EB/OL].[2013-03-02].http://source.android.com/tech/accessories/aoap/aoa.html.
[6] Google.USB accessory[EB/OL].[2013-03-02].http://devel-oper.android.com/guide/topics/connectivity/usb/accessory.html.
[7] FTDI.FT311D development module(UMFT311EV)[EB/OL].(2012-07-31)[2013-03-02].http://www.ftdichip.com/Android.htm.