萬欣
(北京天融信科技有限公司,北京 100085)
隨著智能家居的逐步普及,傳統(tǒng)的紅外遙控器的缺點日益凸顯。特別是當(dāng)家庭中出現(xiàn)大量各種型號、各種功能的紅外遙控器時,就會大大降低用戶體驗[1]。在現(xiàn)代化智能家居系統(tǒng)中,設(shè)計一種能夠整合各種家電遙控器功能的系統(tǒng)就能大大改善家電系統(tǒng)的用戶體驗,同時又具有不錯的市場潛力。在開發(fā)新型智能家居系統(tǒng)時,也能提供一定的借鑒。
整個系統(tǒng)包括手機端的萬能遙控器App以及由App控制的MSP430遙控模塊,再由MSP430遙控模塊通過戶內(nèi)遙控模塊發(fā)射紅外信號進(jìn)而控制室內(nèi)各種家電。本文著重介紹萬能遙控器App的框架結(jié)構(gòu)以及設(shè)計過程,如圖1所示。
圖1 系統(tǒng)整體框圖Fig.1 System frame chart
用戶可以在手機客戶端,按手機遙控器界面給外設(shè)發(fā)送指令,外設(shè)接收指令,識別指令是學(xué)習(xí)還是發(fā)射,如果是學(xué)習(xí),則等待學(xué)習(xí)。此時拿遙控器對準(zhǔn)萬能遙控器的學(xué)習(xí)端口進(jìn)行學(xué)習(xí),學(xué)習(xí)結(jié)束后再次回到等待接收指令狀態(tài)。如果是發(fā)送,則執(zhí)行相應(yīng)按鍵發(fā)射紅外信號進(jìn)行對家居的控制。在界面最上方又信息提示欄,提示用戶當(dāng)前手機的狀態(tài),是學(xué)習(xí)狀態(tài)還是使用狀態(tài),并且顯示當(dāng)前所按的按鍵[2]。按下menu按鈕則可進(jìn)行不同遙控器界面的切換。
本設(shè)計中的遙控器界面設(shè)計主要包括頁面布局、文本框、按鈕以及menu列表幾部分[3]。本文使用的是eclipse及ADT插件作為開發(fā)環(huán)境。具體程序編寫時使用的是Java語言。
安卓的布局管理器包括線性布局,表格布局,幀布局,相對布局,網(wǎng)格布局,絕對布局等。本文只用到了線性布局,表格布局,相對布局[4]。線性布局對應(yīng)的類是LinearLayout,它可以將其中的組件按一定順序排列起來。表格布局對應(yīng)的類是TableLayout,它繼承自LinearLayout,用表格布局可以方便地用行和列來安排組件,自己并不需要指明有多少行多少列,表格布局是通過添加TableRow來控制行和列,其中一個TableRow代表一行。相對布局對應(yīng)的類是RelativbeLayout,顧名思義,它是采用先定義一個組件的位置,然后其它組件是相對于這個組件按一定規(guī)則排列。
首先分析,遙控器界面由諸多按鍵組成,按鍵的排列方式也不是一直不變規(guī)則的,因此拿電視遙控器舉例,它有一些普通的圓形按鍵按規(guī)則排列,還有音量加減,頻道加減,上下左右等按鍵按較復(fù)雜的方式排列[5]。這里本文大致將組件分為兩類,一類是排列規(guī)則單一的,本文用表格布局,另外一類排列規(guī)則稍顯麻煩的我用相對布局排列。最外層是線性布局,然后是表格布局,一行一行進(jìn)行組織安排。遇到較復(fù)雜的例如音量鍵,頻道加減鍵,上下左右ok鍵等我則在表格布局中又添加了相對布局進(jìn)行相應(yīng)的組織[6]。
本文在界面上面定義了兩個文本框用來顯示手機當(dāng)前狀態(tài)和當(dāng)前按鍵。android:id="@+id/textView2"這句話相當(dāng)于這個文本框的身份證明,這句話在整個安卓應(yīng)用工程中是唯一的,因為本文按相應(yīng)按鍵的時候提示框大的內(nèi)容會跟著相應(yīng)變化,所以可以用到findViewById(R.id.id名)的方法來找到這個文本框[7]。android:Text="Key:",這句話用來設(shè)置此文本框顯示的內(nèi)容。
按鍵是本文界面設(shè)計的重要部分,按鍵的大小,形狀,狀態(tài)變化,布局都應(yīng)該認(rèn)真考慮。Android:id="@+id/button1",這句話賦予了一個按鍵唯一的身份。Android:layout_width="50dp"android:layout_height="50dp" ,這兩句話規(guī)定了按鈕的大小,android:background="@Drawable/button_selector",這一句話設(shè)置了某個按鈕的背景圖片,通過@drawable這樣的語法可以調(diào)用drawable目錄內(nèi)的資源文件,可以是圖片資源,也可以是用程序繪制的圖片XML資源。android:text="靜音",設(shè)置按鍵顯示的文字android:textColor="#fff"設(shè)置文字顏色。android:textSize="12dp"這句話用來設(shè)置文字的大小位12像素[8]。android:onClick="clickHandler1"這句話用來給一個按鈕添加單擊事件監(jiān)聽器。后面可以在java源代碼中的相應(yīng)函數(shù)如public void clickHandler1(View view){···}中編寫單擊之后所要執(zhí)行的動作。
為了實現(xiàn)多個遙控器界面之間的切換,本文用到了menu功能,點擊手機上的menu按鍵可以實現(xiàn)多個遙控器界面之間的切換,進(jìn)而切換對不同用電器的控制[9],效果如圖2所示。
圖2 遙控界面的切換功能Fig.2 Switching function of remote control interface
本文選擇2FSK作為基帶信號的調(diào)制方法。即將手機客戶端發(fā)送的指令用2FSK調(diào)制后再發(fā)送給單片機[10]。單片機再將所接收信號解調(diào)成其能識別的信號,進(jìn)一步執(zhí)行發(fā)送及控制功能。
首先確定2FSK信號的位數(shù),這取決于按鍵的個數(shù),為了方便研究測試與設(shè)計,簡化了按鍵的數(shù)量,這里設(shè)按鍵為32個(后面可以在此基礎(chǔ)上以相同的原理添加),于是需要5位二進(jìn)制數(shù)字才能完全表示,從00000~11111分別代表按鍵0~31??紤]到進(jìn)行2FSK解調(diào)時需要設(shè)置起始位,于是用一個周期為1 KHz的正弦波作為起始信號[11]。下面以01010對應(yīng)的2FSK信號制作為例,簡單講述這些2FSK信號的制作。
圖3 用Cool Edit Pro生成的1 KHz的正弦波Fig.3 1 KHz sine wave from Cool Edit Pro
在安卓開發(fā)中,關(guān)于任務(wù)的執(zhí)行豐富了事件監(jiān)聽器,系統(tǒng)有一個主線程,一直執(zhí)行。當(dāng)某個時間發(fā)生,監(jiān)聽器就會發(fā)現(xiàn),但是它不會去打擾系統(tǒng)的主線程,而獨自處理,處理完畢后繼續(xù)進(jìn)行偵查工作。下面的這段代碼是某個按鈕的單擊時間監(jiān)聽程序,當(dāng)該按鈕用戶單擊后便會被執(zhí)行[12]。首先它先找到信息提示Key,讓其顯示當(dāng)前的按鍵值,然后創(chuàng)建一個MediaPlayer類的對象MediaPlayer mPlayer0 =MediaPlayer.create(this,R.raw.sig_05),盛放所要播放的音頻信號,然后mPlayer0.start()開始播放[13]。
結(jié)合其調(diào)制原理,我們只要識別出正弦波信號的頻率便可解調(diào)基帶信號。我們使用的解調(diào)設(shè)備一般是單片機,單片機可以直接識別出模擬信號[14]。本文使用的的是大家通用的首先將正弦波轉(zhuǎn)換為單片機識別的高低電平,然后通過單片機的、中斷或者計時器來測量出高低電平的時間,然后通過周期換算出頻率。由圖3可以清楚看出上圖中低電平有較大差別,通過中斷大致計算出低電平的時間,不用太精確便可以得到2FSK的解調(diào)信號,01010這里我們發(fā)現(xiàn)高電平的差別沒有低電平明顯,這是因為偏置電路的設(shè)計,因為下面的電阻阻值大于上面電阻的阻值,才導(dǎo)致這樣的現(xiàn)象,應(yīng)該使兩個分壓電阻盡量相等[15]。圖4是2FSK解調(diào)的硬件電路。
程序流程:
第一步:進(jìn)入中斷;
第二步:等待低電平過去;
第三步:迎接高電平到來,循環(huán)5次,分別記錄每組高電平時間,如果>250us則記為0,否則記為1;
第四步:計算鍵值Key = 1*Rec[4]+2*Rec[3]+4*Rec[2]+8*Rec[1]+16*Rec[0]。這里為了防止死循環(huán),每次等待電平過去的while循環(huán)里面都有一個附加條件err>0,在循環(huán)體里面執(zhí)行err--,這樣可以防止陷入死循環(huán)。
圖4 2FSK解調(diào)硬件電路Fig.4 2FSK demodulation hardware circuit
本文完整概述了對萬能遙控器App的設(shè)計過程,并對這款A(yù)PP做了如下測試:按相應(yīng)按鍵用示波器觀察所發(fā)送的信號,實驗結(jié)果顯示正確率為100%。測試結(jié)果表明此款萬能遙控器設(shè)計效果出色,能夠滿足一般家庭對家用電器的手機端控制需求。但在用戶體驗方面,此款A(yù)pp還有很大的改進(jìn)空間。