前言
先前介紹利用Pronto code轉換成Broadlink base64 code以及利用ESPhome做到紅外線訊號反饋,但相信很多同好會發現,當你想找pronto code的時候不一定能夠找到,亦或是ESPhome解析出來的編碼不一定能夠使用,這邊介紹一個好用的IR分析軟體:IRscrutinizer
IRscrutinizer 介紹
哪裡抓:
官方說明:
http://www.harctoolbox.org/IrScrutinizer.html#Text+format
打開軟體後的畫面長這樣:
淡藍色框:主要功能介面,底下針對各個功能簡單說明
IR分析(Scrutinize signal)
紅色框:我們要解析的IR code,格式的話pronto hex跟Raw都可以
藍色框:針對紅框內的code開始編輯,如果你要針對code做微調的話
綠色框:當解析完成後要輸出你的code,按此按鈕就會將code轉成你設定好的格式並輸出到指定路徑
另外此畫面中的decode欄位,是程式依據我們提供的code所解析出來業界有定義的protocol,例如常見的NEC、Sony等,如果無法辨識為業界的protocol,這欄位就不會有東西
IRP欄位則是針對IR code的部分,業界的一個標記系統,針對各個特徵一一解析出來,這裡面的相關定義很複雜,有興趣的可以參考下列網頁:
http://www.hifi-remote.com/wiki/index.php/IRP_Notation
或是這一個:
http://www.hifi-remote.com/johnsfine/DecodeIR.html#Introduction
IR code群組(Scrutinize remote)
當我們在網路上找到後批次輸入,就會出現在這一頁,至於怎麼輸入後面會介紹
代碼產生器(Render)
當知道你的裝置Protocol為何後,此功能可幫你“猜”出一些你找不到的功能,因為你能直接輸入參數得出對應的code去測試,如圖例,我們利用NEC/ D=128/ F=156可得出一組raw code
紅色框:選擇你要的protocol後,依照你需要的功能分別將Device/ Subdevice/ Function等參數填入
綠色框:Render:跑出你要的代碼/ Export:輸出此組代碼/ Transmit:發射此組代碼(需有對應設備)
藍色框:將Render出的code移至Scrutinize signal/ Scrutinize remote
代碼導入(import)
這裡花點篇幅說明一下,前三項是直接在網路上透過幾個較大的網站導入IR code,但前兩項好像因為權限問題好像無法直接登入,不過可以透過右方的web site直接進去抓,Remotelocator的話可以直接導入但產品不多,至於其他項目都是對應特定的編碼格式來將IR code整理成一整包,這裡就不一一說明。
這邊針對JP1 Forum這個論壇內所找的到的幾種檔案如何直接應用做教學,裡面最常見的有 .rmdu/ .txt:
-
.rmdu
看官方說明.rmdu早期斯乎可直接導入,但最新版本看起來無法導入,研究了一下之後找到解決方式,利用RemoteMaster這個軟體來將檔案轉成.girr後即可在IRscrutinizer內導入,軟體連結如下:
JP1 Remotes :: View topic - RMIR v2.13 available
這邊注意此軟體要在支援Java環境下才能開啟,下載完解壓縮後到資料夾內找到RemoteMaster.jar這個檔案
開啟後直接導入.rmdu檔
將IR code轉成.girr
至IRscrutinizer開啟
若看的懂相關protocol的話也可以直接至IRscrutinizer render即可,不一定要透過轉檔後再開啟的步驟 -
.txt
若在JP1 Forum內找設備的IR code,會發現論壇裡的.txt檔案IRscrutinizer的import雖然有支援.txt類型的檔案但卻打不開,直接打開.txt檔案後發現裡面長這樣:
有稍微爬文一下發現JP1似乎有統一.txt的格式?實際測試後發現RemoteMaster能打開,所以按照上述的方式將.txt轉換成.girr後到IRscrutinizer內開啟即可
如果有找過相關資訊的同好相信會注意到IR的相關協定太多太雜,從發射接收的紅外編碼到編碼本身的編輯格式,百百種,看得眼花撩亂,我這邊僅針對我有研究過的部分分享一下,若說明的不嚴謹還請包涵
代碼輸出(Export)
將我們需要的代碼輸出成我們需要的格式,能分別輸出Scrutinize signal/ Scrutinize remote/ Render頁面的code,而且格式超級多,連HA博聯用的Base64都有,用這個軟體就不需要再使用我另一篇介紹的方式([教學] IR Remote control_將Pronto code轉換成Base64),初步實驗導出的都能用
發射與接收硬體(Sending、Capturing hw)
此兩分頁就不著墨太多,這主要是讓你接入外部硬體,方便你直接在這上面測試訊號,但我沒有這些硬體,所以就沒辦法進行測試,目前已知低成本做法是用Arduino接入,但我們能透過ESPhome得到的訊號來此作分析,後續如果有接入硬體再跟大家分享
實際應用
在開始針對實際應用分享之前,先稍微針對IR code的格式做基本的解說,IR code其實就是利用紅外線燈源的開啟、關閉來告訴接收端說我現在需要的是什麼功能,但因為環境內的光源非常多,很多都會有紅外線的頻譜,因此接收器會收到很嚴重的干擾,有玩DIY的朋友就會發現ESPhome的receiver當你開個電燈甚至環境光源有點變化,它都能接收到訊號,所以IR訊號會利用一個非常快速的週期性明滅來當作整個訊號的基底,也就是我們常看到的carrier frequency,以NEC protocol常見的38khz為範例:
此圖可以作為一個簡單的說明,用一個頻率為38khz的Carrier做基底,當你決定要發出去的code波型決定後,利用開關這個Carrier來將code表達出來,即可避免環境干擾讓設備接收到正確的訊號。
詳細的IR code基本原理分享兩個網址,有興趣可以了解一下:
http://www.remotecentral.com/features/irdisp1.htm
或是這個
會需要去分析到編碼,主要都是因為ESPhome學碼後可能遇到一些編碼不嚴謹或是ESPhome Library dump出來有問題,但狀況百百種,我僅針對我遇到的狀況做一些分享:
-
Pronto code
首先先從我們最容易找到的品牌電器的Pronto code開始,
IRscrutinizer內可以將你貼過來的code顯示為Pronto hex或是Raw code,下圖為同一個hex code但轉變為Raw code:
這個Raw code有沒有很熟?其實就是我們ESPhome內使用的Raw code,他的表達方式很簡單,+為carrier開啟的時間,-為carrier關閉的時間,以圖為例,+9019即為carrier開啟9019us,以此類推。通常我們如果已經找到對應型號的Pronto hex code,直接用上述提到的,Export成Broadlink用的code或是直接將Raw code貼給ESPhome去做測試即可 -
ESPhome Dump出來的Raw code
以LG電視為例:
將此Raw code利用IRscrutinizer做分析:
眼尖的人可能會注意到,為什麼dump出來的最後三碼知道要分段來看,因最後三碼的頭碼為+號,故並需另外用“[]”區分開來,這會大大影響解析出來的結果,因為每一家的protocol定義不同,像LG的你按鈕按著不放,他只會一直發射後面那段藍色的dummy訊號!另外有沒有發現decode欄位有明確指出所使用的protocol?恭喜!這邊有機會到Render用相同的protocol,所有參數都設定一樣,藉由更動F去猜一些遙控器上沒有的功能,舉相同案例的範例,NEC1/ D=4/ F=160:
或許可能會覺得這樣有點蠢,但IR論壇上很多人都是這樣試出來的;要能這樣做code的推算,若沒準確分析Raw的形式,你可能會走錯方向白費工,建議可以先試幾個按鍵確定protocol沒問題後,再去慢慢試。 -
另外有跟一些同好討論過,有的人原來用Arduino可以,但改成ESPhome就不行(反之亦然),這邊我有稍微研究了一下差異,主要原因來自選用的套件他解碼來源是什麼,所以如果遇到Arduino可以ESPhome不行,就需要去看一下每一個代碼的差異,也可以貼到IRscrutinizer去看兩者差異,因為我目前手頭沒實際案例就沒辦法分享,有興趣的同好可留言討論。
結語
花了相當多時間在碰IR這塊的DIY,這邊幾個重點分享一下:
- ESPhome學碼是逆向工程,讀到得值都有誤差,所以不能用的機率不低。
- 解析依靠的是ESPhome所使用的decode library,所以解析出來的不一定是實際狀況,有Arduino的就有很多不同版本可以比較
- 學碼時,如果要做進階訊號同步,記得先確認每次收到的碼是否差異過大,有的廠家設計的不嚴謹,有的protocol(ESPhome未必內建)或是廠商故意設定連續兩次發射代碼會有不同規則,所以要先確認是否每次接收到的都很接近或是格式一致
- IR編碼百百種,要搞懂太難啦,如果真的解不出來,買broadlink吧,大家會推不是沒道理
當然我遇到的狀況都只是冰山一角,畢竟我目前設備都能夠控制,真的有遇到不同難題的,歡迎大家一起腦力激盪!