我談學習型紅外遙控(一)

跟着項目組長一起做了幾個空鼠項目,一直覺得自己長勁不大,因爲自己只負責簡單的鍵盤定義部分,最終的整個軟件架構其實自己都不太瞭解。從去年11月份開始,一直都很忙,一個接着一個做,我的任務也只是鍵盤部分。重複的做一樣東西,感覺挺沒勁的!

由於產品設計需要,我們要做學習型的遙控器。於是,這項任務就落在了我的手裏。

一說起學習型遙控器,其實,思路很簡單就是把要學習的遙控器發送的電平給記錄下來,然後存入flash中。待到需要發送時,從flash中將記錄的電平給發送出來。而設計的難點在於:用於記錄電平的數組應該設爲多大,什麼時候纔算學完一個波形。以及在學習時,怎麼才能區分出碼字信息和重發信息。

不同的紅外編碼格式,按鍵在短按和長按的情況下,發送的紅外信息格式也不一樣。分析了大部分的紅外編碼,我發現它們大致可以分爲兩類:一類是發送完碼字信息之後,後面跟有Stop Bit ,然後是Repeat Code;一類是發送完碼字信息之後,後面只跟有Stop Bit。而且這兩種方式,在按鍵短按和長按的情況下也不一樣。第一類:按鍵短按情況下,發送完碼字信息,發送一次Repeat Code 就結束;長按情況下,發送完碼字信息,則一直髮送Repeat Code。第二類:按鍵短按情況下,會有兩種情況,一是發送完碼字信息之後,緊跟一次Stop Bit 就結束,另一種是發送完碼字信息之後,發送Stop Bit ,然後再發一次碼字信息才結束。出現這兩種不同情況,我判斷是跟按鍵按下的時間長短有關,但具體原因和原理,還不是很清楚。希望看到這點的博友,能給解釋下。按鍵長按的情況下,會再次重發碼字信息和Stop Bit 。但是長按時,不同的紅外格式,重發的也不一樣。以我現在的瞭解,我知道,該類方式大部分編碼按鍵在長按時,會再次發送第一次發送的信息(包含所謂的Lead Code)和Stop Bit。但也有特殊的,像紅外編碼Victor C8D8 這種格式,在長按時,重發部分不含有Lead Code。 

對於第一個難點,我發現幾乎所有的編碼格式,在按鍵長按時,不管有無Repeat Code,電平中最大時長不超過100ms,最大的在96、97ms左右。所以在我的設計中,把94ms定爲學習結束的一個標誌,當發現學習的電平中,出現大於94ms的電平,記錄下此時的電平並且退出中斷,宣告學習結束。在這種情況下,對於發送信息中沒有超過94ms的紅外編碼格式,這個結束條件就永遠不會成立,這時,我就採用能學習的電平個數作爲結束條件。分析大部分編碼格式,特別是不含有Repeat Code的編碼,到達第一個Stop Bit 位,其中Panasonic 紅外編碼格式,電平數達到100,所以,我設定自己用於學習電平的數組大小爲202。至於爲什麼會翻倍呢,就跟第二個難點有關。第二個難點,學習電平時要能區分出紅外信息中的碼字信息和重發信息,所以大前提是,學習時要長按按鍵。分析大部分編碼在按鍵長按時,並不是發送完第一個Stop Bit之後再發送的信息就是重發信息。這其中還是有特例,像Sharp紅外編碼格式,它的碼字信息要包含兩個Stop Bit位,即它要學習到至少出現兩次Stop Bit 位,才能區分出碼字信息和重發信息。所以我把數組大小定爲出現第一個Stop Bit位時,最大電平個數的兩倍多。

下面就是怎麼區分Stop Bit 和Repeat Code 或者 Stop Bit 和 第二個 Stop Bit

分析各種紅外編碼,發現大部分紅外編碼的Stop Bit 位時長都會大於15ms,當然也會有極個別特例,我的設計沒有對其進行考慮。而且在含有Repeat Code 的紅外編碼格式中,Repeat Code 中的最大電平時長和其Stop Bit 的電平時長都會相差很大,通常前者會大於後者至少20ms以上。所以,我在對學到的電平進行分析時,就可以依次檢測每個電平,第一次出現大於15ms的電平,它就是Stop Bit ,並記下其在數組中的位置。再去檢測其它電平,若出現某個電平大於Stop Bit 電平20ms以上,則視其爲Repeat Code,記下其在數組中的位置;若沒有出現Repeat Code ,而是再次出現大於15ms 的電平,則說明是編碼中的第二個Stop Bit 位,並記錄其在數組中的位置。這樣纔算分析完成。

分析完之後,就是紅外發送部分。發送時,根據有無Repeat Code 進行區分。對於有Repeat Code 的編碼,短按時,只發送到Stop Bit 位之前的信息;長按時,只發送Stop Bit 和 Repeat Code 之間的信息。對於無Repeat Code 的編碼,短按時,發送第二個Stop Bit 位之前的信息;長按時,由於Victor C8D8這種特殊的紅外編碼,不能簡單的再次發送第二個Stop Bit 位之前的信息。而是根據Stop Bit 和 第二個Stop Bit之間的電平個數差和Stop Bit 位所在的電平位數是否相等,來判斷長按時的重發信息。若相等,則重發第二個Stop Bit 位之前的信息;若不等,則重發Stop Bit 和 第二個Stop Bit之間的信息。


以上是我個人對學習型紅外採取的方法,其中仍然有一些侷限,像對於Stop Bit 位電平時長小於10ms 的紅外編碼,我的方法會失效。因爲NEC紅外編碼的Lead Code 就有9ms 多,這也是我把Stop Bit 位定位15ms 的原因。雖然方法有一定的侷限,但大部分紅外編碼還是可以進行學習的。特拿出來與博友分享,這也是自己的第一篇技術型原創博文,願大家多多指點和鼓勵!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章