王 雷,藍(lán) 箭,陳雪娟,陳 峰
隨著網(wǎng)絡(luò)時(shí)代的到來以及第三代通信技術(shù)的發(fā)展,各種智能移動(dòng)終端相繼問世,以Android平臺(tái)為代表的智能手機(jī)正伴隨著3G技術(shù)開始獲得人們的廣泛接受。在這場(chǎng)移動(dòng)設(shè)備的革命中,移動(dòng)終端設(shè)備己經(jīng)跨越了僅僅將通信作為唯一目標(biāo)的模式,而變成具有廣泛應(yīng)用價(jià)值的計(jì)算、控制與管理的服務(wù)平臺(tái)。將智能手機(jī)與控制系統(tǒng)相結(jié)合,使傳統(tǒng)的PC機(jī)工作平臺(tái)具備便攜能力,為實(shí)現(xiàn)真正的移動(dòng)的通信方式提供了可能。本文實(shí)現(xiàn)了一種基于Android手機(jī)的無線控制系統(tǒng),系統(tǒng)中Android手機(jī)可利用周圍無線網(wǎng)絡(luò)資源與其他設(shè)備進(jìn)行交互并實(shí)施控制,不僅為現(xiàn)有智能控制系統(tǒng)提供了新的控制方法,也為實(shí)現(xiàn)機(jī)器與人的信息交換提供了新的交互手段[1]。特別是在我國醞釀的物聯(lián)網(wǎng)開發(fā)與應(yīng)用的大潮中,這樣一種新型的控制方法,將對(duì)我們的工作方式及生活方式,甚至對(duì)周圍世界都產(chǎn)生著巨大的影響。
系統(tǒng)的總體設(shè)計(jì)思路,是以一個(gè)嵌入式微處理器為核心的控制模塊負(fù)責(zé)提供服務(wù)并與用戶的Android手機(jī)通信。手機(jī)作為控制其他設(shè)備的管理器,提供交互界面,例如遙控停車入庫、入位,手機(jī)遠(yuǎn)程檢查并控制家居燈光和電器等[1]。這實(shí)際上是一個(gè)C/S結(jié)構(gòu)的系統(tǒng),以嵌入式微處理器為核心的控制器作為服務(wù)器,Android手機(jī)作為客戶端。系統(tǒng)的總體結(jié)構(gòu),如圖1所示:

圖1 系統(tǒng)結(jié)構(gòu)圖
用戶攜帶Android智能手機(jī)進(jìn)入控制區(qū),手機(jī)客戶端接入無線網(wǎng)絡(luò),搜索網(wǎng)絡(luò)中的可用設(shè)備服務(wù),發(fā)現(xiàn)目標(biāo)設(shè)備后與之進(jìn)行信息交互。Android手機(jī)與控制模塊通過Socket進(jìn)行通信,通過手機(jī)客戶端軟件對(duì)設(shè)備進(jìn)行控制和管理[1]。
系統(tǒng)硬件平臺(tái)是基于 ARM920T架構(gòu)的處理器三星S3C2440,并采用802.11標(biāo)準(zhǔn)的D-LINK DWL-G122無線網(wǎng)卡實(shí)現(xiàn)WiFi網(wǎng)絡(luò)通信。根據(jù)硬件資源和接口特性以及軟件開發(fā)復(fù)雜度的需要,系統(tǒng)搭建了嵌入式Linux開發(fā)平臺(tái),基于2.6.31內(nèi)核開發(fā)ARM9平臺(tái)上的硬件設(shè)備驅(qū)動(dòng)以及應(yīng)用程序,從而可以利用開源項(xiàng)目來實(shí)現(xiàn)PWM電機(jī)驅(qū)動(dòng)等控制功能模塊。系統(tǒng)硬件結(jié)構(gòu),如圖2所示:

圖2 無線控制系統(tǒng)硬件結(jié)構(gòu)圖
為了滿足系統(tǒng)實(shí)時(shí)性的要求,針對(duì)ARM9開發(fā)平臺(tái),需對(duì)Linux做必要的裁剪和配置后再安裝到目標(biāo)機(jī)中。具體過程:在安裝好Linux操作系統(tǒng)和針對(duì)目標(biāo)板的交叉編譯器的PC機(jī)上,對(duì)Linux源碼進(jìn)行必要的配置,包括添加PWM驅(qū)動(dòng)文件、修改makefile和kconfig文件、選擇處理器類型及板級(jí)支持;選擇對(duì)設(shè)備驅(qū)動(dòng)和文件系統(tǒng)的支持[2]。完成配置之后進(jìn)行內(nèi)核編譯,生成定制的內(nèi)核鏡像。
為了支持系統(tǒng)所使用的D-Link DWL-G122無線網(wǎng)卡,需將RT73 wifi通信芯片組的驅(qū)動(dòng)程序編譯進(jìn)內(nèi)核。加載驅(qū)動(dòng)模塊后,下載 wireless-tools源碼并移植 iwconfig,iwlist等無線擴(kuò)充命令以配置無線網(wǎng)卡[2]。為使無線網(wǎng)卡自行啟動(dòng),在ARM板上電運(yùn)行時(shí),操作系統(tǒng)將初始化配置無線網(wǎng)絡(luò)的屬性,包括模式 MODE、ESSID、IP地址等,需編寫無線網(wǎng)卡配置腳本文件init_wireless如下:
#!/bin/sh,ifconfig wlan0 down,iwconfig wlan0 ap auto iwconfig wlan0 essid "raybotest",ifconfig wlan0 192.168.0.12 ifconfig wlan0 up。然后將其拷貝到根文件系統(tǒng)的/bin目錄中,在根文件系統(tǒng)中的/etc/init.d/rcs最后一行添加/bin/init_wireless&,最后增加其可執(zhí)行屬性:chmod+x init_wireless[3]。這樣,就完成了RT73芯片組的驅(qū)動(dòng)移植。
PWM控制模塊是采用三星公司的S3C2440ARM芯片作為核心處理器,其內(nèi)部有5個(gè)16位的定時(shí)器。 其中定時(shí)器0、1、2、3有脈寬調(diào)制功能。每個(gè)定時(shí)器模塊從時(shí)鐘分頻器接收其自己的時(shí)鐘信號(hào),其分頻器從相應(yīng)的8位預(yù)分頻器接收時(shí)鐘。8位的預(yù)分頻器是可編程的且根據(jù)裝載的值來分頻PCLK,其值存儲(chǔ)在TCFG0和TCFG1寄存器中[2]。
S3C2440芯片的PWM模塊,具有遞減計(jì)數(shù)器TCNTBn和比較計(jì)數(shù)器TCMPBn雙緩存觸發(fā)的特點(diǎn),當(dāng)遞減計(jì)數(shù)寄存器的值遞減到與比較計(jì)數(shù)寄存器的值相同時(shí),定時(shí)器控制邏輯就改變輸出電平,即遞減計(jì)數(shù)器的預(yù)存值與PWM輸出地頻率有關(guān),比較寄存器的預(yù)存值與PWM輸出地占空比有關(guān),兩者相協(xié)調(diào)即可得到所需的PWM波形。
在系統(tǒng)中,由定時(shí)器1直接作為舵機(jī)的控制信號(hào),控制多級(jí)的方向。電機(jī)控制則采用兩片大功率BTS7960構(gòu)成的全橋電機(jī)驅(qū)動(dòng)電路,需使兩路PWM控制信號(hào)存在占空比差,差越大電機(jī)轉(zhuǎn)速越高。兩路PWM輸出頻率均為25kHz,以PWM1為基準(zhǔn),通過控制PWM2輸出不同占空比,實(shí)現(xiàn)電機(jī)的正反轉(zhuǎn)控制。控制器應(yīng)用層PWM控制程序部分代碼如下:

服務(wù)器端通信軟件是通過套接字編程的方法實(shí)現(xiàn)的,服務(wù)器要先于客戶機(jī)啟動(dòng),首先使用Socket()方法建立一個(gè)Socket連接對(duì)象并設(shè)置一個(gè)訪問的端口號(hào),以便服務(wù)器能偵聽客戶的連接請(qǐng)求,本系統(tǒng)設(shè)置為7070。然后調(diào)用bind方法將Socket與本地網(wǎng)絡(luò)地址綁定。之后就可以通過listen函數(shù)來偵聽是否有客戶端進(jìn)行連接。如果偵聽到客戶的請(qǐng)求,就調(diào)用accept()方法建立連接[1]。與客戶端連接建立成功后,按照控制流程的要求,使用收發(fā)函數(shù),進(jìn)行數(shù)據(jù)傳輸。服務(wù)器應(yīng)用程序流程圖,如圖3所示:

圖3 服務(wù)器通訊程序流程圖
Android是2007年11月由以Google公司牽頭組建的開放手機(jī)聯(lián)盟(Open Handset Alliance)發(fā)布的智能移動(dòng)設(shè)備軟件平臺(tái)。其前所未有的標(biāo)準(zhǔn)化和開放性使Android操作系統(tǒng)成為一套真正意義上的開放性移動(dòng)設(shè)備綜合平臺(tái)[1]。
Android采用了層疊式的軟件架構(gòu),它包括Linux內(nèi)核層、函數(shù)庫和組件庫以及虛擬機(jī)組成的中間層、應(yīng)用程序框架和應(yīng)用程序組成的上層,如圖4所示:

圖4 Android平臺(tái)結(jié)構(gòu)
Android以Java作為開發(fā)語言,以開源IDE Eclipse作為開發(fā)環(huán)境,使用Android SDK、Java開發(fā)包JDK、開發(fā)插件ADT進(jìn)行軟件開發(fā)與調(diào)試。如此強(qiáng)大的開發(fā)平臺(tái)完全能夠滿足手機(jī)終端的Java應(yīng)用開發(fā)。下面介紹在Windows XP下開發(fā)應(yīng)用程序的環(huán)境搭建方法[1]。
[1]JDK的安裝和Java開發(fā)環(huán)境的配置
安裝 Eclipse的開發(fā)環(huán)境需要 JRE的支持,下載Windows XP下的最新JDK并設(shè)置JDK的環(huán)境變量[1]。
[2]Eclipse和Android SDK的安裝和配置
完整安裝好JDK和Eclipse后,下載所要使用的Andriod SDK,這里使用了2.3版本并把tools目錄添加到Windows XP的PATH環(huán)境變量中。
[3]安裝和配置ADT
啟動(dòng)Eclipse,依次點(diǎn)擊"Help->Software Update...-> Ava ilable Software->Add Site...",輸入dl-ssl.Google.com/android/eclipse/,點(diǎn)擊OK完成。依次選擇"Preferences-> Android",點(diǎn)擊"Browse..."選擇Android SDK的安裝路徑,設(shè)置Android SDK主目錄從而把Eclipse與SDK綁定在一起[1]。
至此,經(jīng)過上述安裝配置過程 Android應(yīng)用程序的開發(fā)環(huán)境已經(jīng)搭建完成。可以在Eclipse中創(chuàng)建Android項(xiàng)目了。從 Android1.5開始就引入了 AVD(Android Virtual Device)的概念[1]。AVD是一個(gè)經(jīng)過配置的模擬器,在運(yùn)行程序時(shí),Eclipse可以自動(dòng)運(yùn)行虛擬機(jī),因此運(yùn)行和調(diào)試Android應(yīng)用程序可以脫離實(shí)體手機(jī),極大地方便了應(yīng)用程序的開發(fā)。PC機(jī)上運(yùn)行Android虛擬機(jī)的界面,如圖5所示:

圖5 模擬器運(yùn)行界面
Android應(yīng)用程序是以許多Android API組件為基礎(chǔ)進(jìn)行開發(fā)的,下面是幾種主要的API組件:
當(dāng)前活動(dòng)程序 Activity是最常用的應(yīng)用程序組件,可以把Activity簡(jiǎn)單的理解成一個(gè)用戶所看到的屏幕,稱之為“活動(dòng)”[1]。它主要用于處理程序的整體性工作,通過調(diào)用onCreate ()、onStart()、onRestart ()、onResume ()、onStop()、onDestory ()等方法來實(shí)現(xiàn)運(yùn)行、暫停、停止等狀態(tài)。例如監(jiān)聽按鍵、觸摸屏等事件,指定圖像顯示 View,啟動(dòng)其他Activity。Android用Intent類實(shí)現(xiàn)啟動(dòng)其他Activity,它調(diào)用startActivity (myIntent)方法觸發(fā)解析myIntent動(dòng)作,新的Activity接收到myIntent通知后,開始運(yùn)行,例如通過Activity的切換實(shí)現(xiàn)顯示布局的切換。ContentProvider類是一個(gè)特殊的存儲(chǔ)數(shù)據(jù)的類型,它實(shí)現(xiàn)了數(shù)據(jù)的存儲(chǔ)與共享。Service是運(yùn)行在后臺(tái)的應(yīng)用程序組件,不直接與用戶交互。當(dāng)前活動(dòng)程序可以使用Context.StartService ()開啟一項(xiàng)后臺(tái)服務(wù),還可以通過Context.bindService ()與后臺(tái)服務(wù)通信[1]。
系統(tǒng)以PWM控制器的Android控制界面為例,介紹了Android應(yīng)用界面的創(chuàng)建過程[4]:
1、通過 File -> New -> Project 菜單,建立新項(xiàng)目"Android Project"。
2、填寫新項(xiàng)目的所在文件夾名稱、包名、主類名和應(yīng)用程序標(biāo)題。
3、編輯自動(dòng)生成的代碼模板。
打開一個(gè)Android項(xiàng)目的main.xml文件,即可以切換到UI設(shè)計(jì)界面,通過Layouts中的線性布局完成界面的布局排版,如圖6所示:

圖6 Android界面布局編輯器
在界面編輯器(圖6)中完成布局之后,添加按鈕的觸控事件,編輯應(yīng)用程序代碼。在Android的Java程序中,實(shí)現(xiàn)人機(jī)交互的控件是通過事件處理的,需要指定控件所用的事件監(jiān)聽器[4][5]。事件響應(yīng)部分代碼如下:


程序的通信部分采用了C/S 的結(jié)構(gòu)來實(shí)現(xiàn),服務(wù)器與客戶端通過Socket進(jìn)行網(wǎng)絡(luò)通信。手機(jī)客戶端Socket編程實(shí)現(xiàn)與服務(wù)器端有所不同,在使用socket()方法創(chuàng)建完套接字接口后,直接通過connect()方法與服務(wù)器端建立鏈接并可使用收發(fā)函數(shù)進(jìn)行控制命令的數(shù)據(jù)傳輸[1]。使用close()方法可以斷開鏈接。客戶端應(yīng)用程序流程圖,如圖7所示:

圖7 客戶端通信程序流程圖
客戶端應(yīng)用程序開發(fā)完成之后,可以將應(yīng)用程序打包調(diào)試。為使Android應(yīng)用程序可以在模擬器上運(yùn)行,必須創(chuàng)建AVD。模擬器創(chuàng)建步驟如下[1]:
1、在Eclipse工具欄中,依次選擇Windows -> Android SDK and AVD Manager。
2、在Virtual Devices新建一個(gè)模擬器。
3、填寫Name,選擇Target的API、SD Card大小、Skin、以及Hardware配置。
4、點(diǎn)擊Create AVD即可創(chuàng)建AVD。
完成模擬器上的調(diào)試后,可以在項(xiàng)目文件夾下 bin目錄中的Carcontroller目錄中找到Carcontroller.apk文件,即為本程序的發(fā)布apk包。可將此apk包安裝實(shí)體手機(jī)并啟動(dòng)。運(yùn)行界面,如圖8所示:

圖8 測(cè)試效果圖
經(jīng)過在中興U880上反復(fù)測(cè)試,如圖8所示。手機(jī)連接控制模塊的時(shí)間小于5s,遠(yuǎn)端服務(wù)器對(duì)手機(jī)控制命令的響應(yīng)時(shí)間為ms級(jí),基本上完成了手機(jī)無線PWM控制功能。
無線網(wǎng)卡工作在2.4GHz頻段,其信號(hào)頻率高,波長(zhǎng)短,使其具有較弱的障礙物的穿透能力。再加上發(fā)射功率不大(一般小于100mw)如果遇電磁干擾比較大或者較為封閉的環(huán)境下,會(huì)影響數(shù)據(jù)的傳輸效果。根據(jù)無線信號(hào)在自由空間傳播時(shí)的通信距離的計(jì)算方法:通信距離與發(fā)射功率、接收靈敏度和工作頻率有關(guān)。有傳播損耗公式:

其中Lbs為傳輸損耗,d為傳輸距離,f為工作頻率。
對(duì)于工作在2.4GHZ的無線網(wǎng)卡,f=2400MHZ,則有無線網(wǎng)卡自由空間損耗距離公式:

傳播損耗與傳播距離的關(guān)系,如表1所示:

表1 WLAN信號(hào)在自由空間傳播的損耗與距離關(guān)系
實(shí)際中,信號(hào)還會(huì)受到障礙物阻擋、物體吸收、反射等影響。一般穿透一層木板,信號(hào)衰減5dB;穿透一堵磚墻,信號(hào)衰減8dB;穿透鋼筋混凝土墻,信號(hào)衰減25dB。系統(tǒng)實(shí)際測(cè)得在在室內(nèi)可達(dá)65m,在有障礙物的環(huán)境下,隔一堵墻傳輸可達(dá)30m,而隔兩堵墻時(shí),最大控制距離降為10m,室外環(huán)境下無線信號(hào)最大控制距離可達(dá)100m。
系統(tǒng)實(shí)現(xiàn)了一種基于Android系統(tǒng)下的無線PWM控制模塊設(shè)計(jì),并在遙控模型汽車上測(cè)試成功。系統(tǒng)采用了嵌入式ARM9平臺(tái)作為硬件控制模塊,完成了Android應(yīng)用程序開發(fā),編寫了一個(gè)手機(jī)客戶端軟件,解決了手機(jī)與控制器端之間的數(shù)據(jù)傳輸,實(shí)現(xiàn)了手機(jī)遠(yuǎn)程控制 PWM 調(diào)速等功能。
該嵌入式控制系統(tǒng)能夠在日常環(huán)境下一定距離范圍內(nèi)成功地實(shí)現(xiàn)了無線PWM控制功能,可廣泛應(yīng)用于智能家居、智能停車以及不易布線的PWM控制場(chǎng)合。設(shè)計(jì)的創(chuàng)新之處,在于系統(tǒng)將智能手機(jī)通過無線通訊技術(shù)與控制系統(tǒng)相結(jié)合,擴(kuò)大了智能終端的應(yīng)用范圍并為現(xiàn)有智能控制系統(tǒng)提供了新的控制方法,為物聯(lián)網(wǎng)的發(fā)展提供了一種新穎的實(shí)現(xiàn)途徑。
[1]楊豐盛. Android應(yīng)用開發(fā)揭秘[M].北京:機(jī)械工業(yè)出版社, 2010.
[2]徐英慧,ARM9嵌入式系統(tǒng)設(shè)計(jì)—基于 S3C2410 Linux[M].北京:北京航空航天大學(xué)出版社,2007.
[3]胡雙喜,吳長(zhǎng),奇李林娟.USB無線網(wǎng)卡在嵌入式平臺(tái)上的應(yīng)用[J].工業(yè)控制計(jì)算機(jī).2008年21第5卷期:P48.
[4]趙亮,張維.基于Android的界面設(shè)計(jì)與研究[J].電腦知識(shí)與技術(shù), 2009(29) : 8183~ 8185.
[5]蔡羅成. Android后臺(tái)監(jiān)聽實(shí)現(xiàn)機(jī)制淺析[J].信息安全與通信保密, 2010(6): P39~ 41.