文獻(xiàn)標(biāo)識碼: A
文章編號: 0258-7998(2013)09-0031-03
最近業(yè)界的統(tǒng)計(jì)數(shù)據(jù)顯示,,智能手機(jī)與自動化及機(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ī)、平板電腦等移動設(shè)備中,。在各種Android設(shè)備提供的接口中,,USB接口是常見接口,該接口的作用是為Android設(shè)備充電并通過PC端的驅(qū)動程序?qū)崿F(xiàn)Android設(shè)備與PC的交互,。如何拓展Android設(shè)備的USB接口功能是當(dāng)前的研究熱點(diǎn)之一,。針對該問題,本文介紹了一種基于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ù)慕巧?,可以將Android USB通信分為主機(jī)模式(Host Mode)和配件模式(Accessory Mode)[1]兩種模式,。
1.1 主機(jī)模式
主機(jī)模式是指Android設(shè)備充當(dāng)USB主機(jī)并為總線供電。此模式下,,Android設(shè)備需支持USB主機(jī)功能或OTG功能,,此時Android設(shè)備的USB主機(jī)稱為USB嵌入式主機(jī)EH(Embedded Host)[2]。與PC上的USB主機(jī)相比,,EH設(shè)備可能無法為連接到其總線上的未識別外圍設(shè)備加載驅(qū)動程序,,因此它們對其目標(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ū)動程序已存在于Android平臺的系統(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)及更高的平臺中直接支持,。配件模式作為一個附加庫也被Android 2.3.4(API level 10)支持,。設(shè)備廠商可以選擇是否在設(shè)備的Linux系統(tǒng)鏡像中包含附加庫。對主機(jī)和配件模式的支持最終取決于設(shè)備的硬件,,而不是Android平臺的等級(軟件),。
1.3 Android配件、ADK及AOA協(xié)議
Android配件是指遵循AOA協(xié)議的硬件,,是Android配件模式中的概念,。從硬件角度講,Android配件具有實(shí)現(xiàn)USB EH功能和AOA協(xié)議的微處理器以及包括USB接口在內(nèi)的輸入/輸出接口,。Android配件必須與Android平臺一起工作,。
ADK是開發(fā)Android配件的參考開發(fā)包,該開發(fā)包基于Arduino公司的開源電子成型平臺[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)如果需要,,啟動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è)備對AOA協(xié)議是否支持由設(shè)備硬件和Android系統(tǒng)版本決定,。
(2)調(diào)用ADK中的API開發(fā)USB應(yīng)用程序。
ADK中與USB配件模式相關(guān)的兩個類是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個屬性,。在Android配件的固件程序中,,同樣包含以上3個屬性值。根據(jù)AOA協(xié)議,,當(dāng)Android配件連接到Android設(shè)備上時,,配件會發(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)對話框的形式詢問用戶是否允許與Android配件通信,。
(3)開始與配件通信,。創(chuàng)建文件輸入輸出流代表USB批量傳輸端點(diǎn),通過獨(dú)立線程以流傳輸?shù)姆绞綄?shí)現(xiàn)USB通信,。
(4)終止與配件通信,。通過廣播接收器偵聽USB配件與Android設(shè)備的斷開操作,當(dāng)事件發(fā)生時,,關(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ā)時間,。
3 系統(tǒng)設(shè)計(jì)
3.1 總體設(shè)計(jì)
構(gòu)建的系統(tǒng)框圖如圖3所示,。
采用的ADK板是由英國飛特蒂亞FTDI(Future Technology Devices International Ltd.)公司生產(chǎn)的Android平臺USB主控模塊(USB Android Host Module)[7],,型號為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個接口類型選擇引腳選擇接口類型。
UMFT311EV板支持AOA協(xié)議,,作為Android配件無需用戶做配件端的開發(fā),,而且為Android設(shè)備端的程序開發(fā)提供Java驅(qū)動包。因此采用UMFT311EV板能夠?qū)崿F(xiàn)Android手機(jī),、平板與其他設(shè)備的通信,,進(jìn)行設(shè)備控制和數(shù)據(jù)采集,并能與現(xiàn)有系統(tǒng)快速集成,,降低開發(fā)難度和開發(fā)時間,。
在此,以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ī)端軟件時,采用FTDI公司為Android平臺提供的驅(qū)動包。根據(jù)該驅(qū)動包,,架構(gòu)如圖4所示的應(yīng)用程序,。
FT311驅(qū)動層提供驅(qū)動UMFT311EV板上接口的方法和實(shí)現(xiàn)Android應(yīng)用程序與UMFT311EV板USB通信的方法。該層為用戶層提供封裝的方法,,為用戶開發(fā)程序屏蔽底層編程細(xì)節(jié),。用戶層通過調(diào)用FT311驅(qū)動層的方法實(shí)現(xiàn)對UMFT311EV板上接口的控制。
本實(shí)驗(yàn)編程采用FT311驅(qū)動層提供的配置GPIO,、讀GPIO,、寫GPIO、重置GPIO 4個方法實(shí)現(xiàn)對步進(jìn)電機(jī)的控制,,程序流程如圖5所示,。
4 系統(tǒng)測試
本設(shè)計(jì)中將Android手機(jī)作為脈沖信號源和脈沖分配器,通過軟件編程為步進(jìn)電機(jī)提供脈沖信號,,并通過驅(qū)動芯片ULN2003驅(qū)動步進(jìn)電機(jī),。系統(tǒng)測試過程如下:
(1)用跳線帽設(shè)置ADK板的接口類型為GPIO,將步進(jìn)電機(jī)與其驅(qū)動板連接,,驅(qū)動板與ADK板的GPIO口連接,,并給ADK板上電。
(2)將軟件安裝至手機(jī)上,,然后通過USB線將ADK板與手機(jī)連接,。
(3)連接后,手機(jī)將彈出授權(quán)對話框,,提示用戶打開(2)中安裝的軟件,。
(4)進(jìn)入軟件界面后,點(diǎn)擊“設(shè)定輸出”按鈕,,設(shè)定GPIO口的數(shù)據(jù)傳輸方向,;點(diǎn)擊“啟動”、“停止”,、“正轉(zhuǎn)”,、“反轉(zhuǎn)”,拖動速度調(diào)節(jié)滑塊,,可實(shí)現(xiàn)對電機(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è)備對外圍設(shè)備的控制,。實(shí)際測試表明,該方案設(shè)計(jì)簡單,,能夠?qū)崿F(xiàn)Android設(shè)備對外設(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.