OpenHarmony開源開發者成長計劃“萬能遙控器”項目開發者。
效果展示
如圖是開發板GPIO輸出到紅外發射器的波形和空調遙控器輸出波形的對比,可以看到波形的變化規律基本一致。
圖1 波形圖對比 ?
圖 2 設備展示
作品構思
紅外遙控以其簡單、穩定、可靠等優勢,一直以來都是家電控制中重要的組成部分。將紅外遙控融入到智能家居的網絡中,不僅能拓寬智能家居的范圍,同時,用戶不需要更換新型設備,也能在原有的設備上體驗到物聯網帶來的生活便利。
OpenHarmony是由開放原子開源基金會孵化及運營的開源項目,目標是面向全場景、全連接、全智能時代、基于開源的方式,搭建一個智能終端設備操作系統的框架和平臺,促進萬物互聯產業的繁榮發展。其創新性的分布式軟總線,能夠有效解決底層通信協議的差異,使得分布式應用開發更加方便。
于是我們決定利用OpenHarmony在物聯網的優勢,推動紅外遙控設備融入在家電網絡,使兩者的融合使用能達到1+1>2的效果。
實踐過程
小熊派Micro
在硬件平臺方面,我們選擇新出的小熊派Micro開發板,小熊派開發板搭載了STM32MP157芯片,搭配了4.3寸LCD電容式觸摸屏,并有WIFI電路及標準的E53接口。
在軟件生態上,該開發板已完成OpenHarmony 3.0小型系統的移植,并提供了豐富的教程,同時,ST公司還開放了芯片手冊,SDK包等開發工具,非常適合學生們了解學習計算機系統。ST(意法半導體)是知名的半導體公司,其芯片在覆蓋工業控制、消費電子等領域,其設計的STM32系列芯片在工業控制、教育等領域占有重要的地位。
在拿到開發板后,我們首先跟著小熊派的教程搭建軟件開發環境,下載編譯OpenHarmony源碼,然后燒錄固件到開發板,終于把心心念念的OpenHarmony系統給運行起來了:
圖3 OpenHarmony桌面
接著我們跟著教程,分別學習了OpenHarmony的應用開發和驅動開發。當屏幕出現hello world的字樣時,我就知道我們的開發已經成功了一半。
最后的教程是開發一個控制LED的應用,通過這個例程,我們學會了如何從底層軟件、中間層、到應用層的全棧開發范式,對OpenHarmony操作系統的架構有了實際的認識。這為我們后面開發紅外遙控應用打下了堅實的基礎。
圖4 LED應用
紅外遙控原理
在初步認識了小熊派和OpenHarmony后,要開發紅外遙控功能,就需要了解紅外遙控的原理。我們通過網上搜集資料來了解紅外協議的組成的理論知識。這里我們嘗試簡單說明一下紅外遙控的原理:
如下圖所示,以空調遙控為例。遙控器發送給空調的信息其實就是一個二進制的數組,例如:1001 1010……,數組特定位上01的組合依據協議內容有特定的含義,例如bit4和bit5為10時,表示空調風速為一級風速。
那么這個數組應該如何從遙控器到達空調呢?紅外發射器可以向四周發射紅外線,由于自然光中也存在紅外光,所以發射器必須對紅外線編碼,加上38KHZ的載波。這樣,接收器就只要識別38KHZ的紅外光,就能確定其是由遙控器發射的,從而濾除了自然光的干擾。
下圖中,發射器發射載波信號時,接收器會識別并輸出低電平信號,相反,則輸出高電平信號。通過控制方波的高電平時長,來表示邏輯0或1.將0和1組合起來,就構成了紅外協議里的數組。
圖5 紅外遙控原理
實踐是檢驗理論的標準。我們決定利用身邊的支持紅外遙控設備,來研究其實際的協議內容。手機的萬能遙控器就是一個完美的發射設備,于是我們使用一個紅外接收電路,一個邏輯分析儀,來分析遙控器發出的紅外信號:
圖6 邏輯分析儀和接收電路
有了以上工具,我們就可以在電腦端查看紅外信號波形:
圖7 紅外波形圖
經過以上的實踐,我們的理論知識與實踐經驗相符合,方案的可行性得到證實,那么就可以開始軟件的開發了。
PWM驅動
我們將紅外發射電路接入小熊派開發板,并將其信號引腳連接到GPIOA_5。接下來就是要在這個引腳上產生特定的脈沖序列。
由前文可知,我們需要在GPIOA_5上產生一個38KHZ的載波信號。這一點可以利用STM32的TIM2實現,將TIM2的Channel1設置為PWM輸出模式,設置周期為26us和占空比為50%就能實現。
難點在于,在OpenHarmony中開發驅動不像我們在stm32f1上開發驅動一樣,直接使用庫函數就可以。在大型的操作系統中,都會有一套驅動開發的框架,規定了某一特定的驅動的編程規范。我們要開發PWM的驅動,就要遵循OpenHarmony的HDF PWM驅動開發框架的規定。
在之前的學習中,我們已了解了HDF驅動框架的開發流程。對于PWM驅動,我們參考了OpenHarmony官網的PWM開發文檔以及ST的驅動HAL庫,實現了符合HDF框架的PWM驅動。如圖是PWM輸出38KHZ的方波:
圖8 38KHZ載波
IR驅動
有了載波,接下來就需要能控制載波的產生、關閉,以及持續時間(決定了邏輯值)。載波的開關在PWM驅動中已經實現了。那么問題就在于如何控制載波的持續時間。
在紅外遙控中,電平的時間最低一般是600us,要實現微妙級別的計時,熟悉STM32的小伙伴很容易就會想到使用TIM定時器。是的,在這里我們使用TIM3來實現對載波定時控制的功能。
為此,我們設計了一個IR驅動,他是一個標準的HDF驅動模塊,其實現的功能有:
?對應用層提供驅動服務:接收應用層下發的數組。
?控制PWM的開關時間:根據數組元素值,控制載波的時間。
我們假設應用層下發的數組是這樣的格式:其元素的值表示的是電平時間,例如[500,600]的組合表示邏輯0,[500,1600]表示邏輯1.
[500,600,500,600,500,1600,...]
IR驅動獲得該數組后,將數組值設為定時值,并開啟定時器中斷,在中斷中開/關PWM、更新下一次定時時間,就能實現對載波時間的控制。
紅外碼庫的移植
經過以上兩個驅動的開發,我們能確保底層的實現是正常的,接下來就是應用的開發了。
首先要思考的就是如何得到我們想要的紅外信號。每一種設備,其紅外協議的物理層雖然相同,但在編碼的含義上卻有很大差異。要實現萬能遙控的功能,不可能把所有的協議都寫入代碼,需要一個碼庫來支持。幸運的是,我們找到了這樣一個開源的碼庫,irext。
irext分為兩個部分:碼庫文件和解碼算法。在程序中,使用解碼算法,對特定的碼庫文件進行解碼,就能得到所需的信號數組。這個數組就可以直接傳遞給IR驅動進行發送。解碼后得到的數組如下所示:
?
[8967,4499,598,598,598,598,598,598,598,598,598,……]
?
我們在OpenHarmony的JS Engine中添加了一個JS 接口:AC_Control,在這個接口里,我們接收上層JS應用的命令,使用irext的解碼算法和碼庫文件,將命令轉換為信號數組,然后將這個數組發送給IR驅動,從而觸發紅外信號的產生。
應用程序開發
1、界面設計
在開始北向應用程序開發之前,我們要先把整個頁面的UI布局以及樣式先起一個大概的草稿,因為這樣在寫界面的時候效率會翻倍。根據南向的驅動想好功能及交互,設計好UI布局后,下一步就是尋找或者制作符合產品風格的圖標。這兩步做完后,我們就可以正式開始碼代碼了。
最終呈現出如下圖效果:
圖9 APP 界面
2、交互邏輯設計
在了解了南向的具體驅動功能之后,我們再根據界面樣式設計交互邏輯,比如監聽用戶點擊溫度升高,接著調用注冊號的JS驅動接口,將調節溫度命令發送給南向接口。其他比如開關,制冷等交互邏輯都是類似的處理邏輯。
理清楚交互邏輯之后,然后就將南向驅動自定義的JS接口在@system.app.d.ts中進行注冊,注冊完之后在js頁面導入該文件,然后我們就可以開始編寫業務邏輯了,其中有很多重復的接口邏輯,可以進行封裝,使代碼簡潔明了,可讀性也比較強。
圖10 APP操作演示
項目收獲
通過本項目初期的學習和實踐,我們由淺入深地學習了OpenHarmony的應用以及HDF驅動開發,特別是對OpenHarmony的整個系統架構,包括內核、驅動框架、系統服務以及應用程序框架有了一個清晰的認識。也讓我們更深刻地理解了OpenHarmony的分層設計、一次開發多端部署、分布式系統這些概念,使我們對OpenHarmony的未來發展充滿興趣與期望。
未來展望
目前我們只實現了紅外遙控的應用,對于物聯網來說這遠遠不夠,接下來我們還需要考慮如何與其他OpenHarmony設備組網的問題。
當前小熊派團隊正在移植OpenHarmony軟總線,所以我們未能實現組網的功能。未來軟總線能實現的話,就可以其他OpenHarmony設備進行組網,到時候OpenHarmony的萬物互聯的技術優勢將得到充分的體現,OpenHarmony正在發展中,我們需要耐心以及積極地參與。
除了軟總線,我們還有Plan B,例如可以選擇MQTT等傳統的物聯網協議,來實現設備與手機之間的通信。
評論
查看更多