紅外遙控功能,因其電路簡單,控制方便,在電子制作和畢業設計中常常使用。
涉及知識點
- GPIO中斷接收
- STM32中定時器的用法
- 紅外接收頭的使用
外部中斷和定時器的內容比較多,之后網文再詳細分享。
一體化紅外接收頭VS1838B簡介
- 工作電壓: 2.7V~5.5V
- 應用電路
- 外觀、封裝及尺寸:把接收頭面向自己,左邊為1腳,1腳OUT,2腳GND,3腳VCC。
應用場景
- 視聽器材(音箱、電視、錄影機、碟機)
- 家庭電器(冷氣機、電風扇、電燈)
- 其他紅外線遙控產品
編碼標準
紅外接收頭的型號有很多HS0038、VS1838B等,功能大致相同,只是引腳封裝不同。
紅外接收有幾種統一的編碼方式,采樣哪種編碼方式取決于遙控器使用的芯片,接收頭收到的都是一樣的。
電視遙控器使用的是專用集成發射芯片來實現遙控碼的發射,通常彩電遙控信號的發射,就是將某個按鍵所對應的控制指令和系統碼(由0和1組成的序列),調制在38KHz的載波上,然后經放大、驅動紅外發射管將信號發射出去。
不同公司的遙控芯片,采樣的遙控碼格式也不一樣,較普遍的有兩種,一種NEC標準,一種是PHILIPS標準。
NEC標準: 當某個鍵按下時,系統首先發射一個完整的全碼,如果按鍵超過108ms仍未松開,接下來發射的代碼(連發代碼)將由起始碼(9ms)和結束碼(2.5ms)組成。
一個完整的全碼 = 引導碼 +用戶碼 +用戶碼 + 數據碼 + 數據反碼。
其中,引導碼高電平9ms,低電平4.5ms;
用戶碼和數據碼共32位;其中前16位為用戶識別碼,能區別不同的紅外遙控設備,以防止不同的機種遙控碼互相干擾。
后16位數據碼為8位的操作碼和8位的操作反碼,用于核對數據是否接收準確。接收端根據數據碼的不同做出相應的動作。
連發代碼是在持續按鍵時發送的碼。它告知接收端。某鍵是在被連續的按著。
PHILIPS標準: 邏輯“0”和邏輯“1”的定義。
我們使用的遙控器模塊使用的是NEC標準,當我們點擊紅外遙控器上第一個按鍵Ch- 時,用示波器測量VS1838B的OUT引腳,示波器中抓取的信號如下:
我們可以看出跟下圖標準的NEC協議的典型脈沖鏈的定義是一致的:
上圖為NEC協議的典型脈沖鏈。協議規定低位首先發送。
首先發送9ms+4.5ms的引導碼,接下來是兩字節用戶碼,第三字節是數據碼(按鍵碼),用來判斷按鍵值,第四字節是數據反碼,可以用來校驗,提高按鍵的準確性。
注意:我們會發現上面兩個圖中波形的高低電平實際上是相反的,因為紅外接收頭將38K載波信號過濾,接收到的波形剛好與發射波形相反。
難點:數據0和1的判斷:所謂的解碼就是一個區分脈沖寬度的過程。紅外信號的“0”和“1”是通過脈沖持續時間的長短來區分的,NEC標準的“0”和“1”的定義如下:
引導碼:9ms 的載波+4.5ms 的空閑。比特值“0”:560us 的低電平+560us 的高電平。比特值“1”:560us 的低電平+1.68ms 的高電平。
VS1838B 這個紅外一體化接收頭,當收到有載波的信號的時候,會輸出一個低電平,空閑的時候會輸出高電平。
數據處理流程
結果展示
接線
與VS1838B連接:
- 紅外接收頭的OUT引腳連接PA7
- VCC連接3.3V
- GND接地
與USB轉TTL串口相連: 用于打印調試信息
- USB轉TTL串口的TXD與核心板的PA10相連
- USB轉TTL串口的RXD與核心板的PA9相連
- USB轉TTL串口的VCC與3V3跳線短接
鍵碼值輸出
按紅外遙控的各個按鍵,串口打印輸出各個按鍵值如下:
對紅外遙控器鍵碼值整理如下:
下面視頻中抓取的是第一個按鍵的脈沖信號:
我們通過觀察視頻發現它的四個字節的數據如下:00000000 11111111 10100010 01011101
其中:頭兩個字節00000000 11111111,即用戶碼,值為:0x00FF;第三個字節就是Command命令字,10100010,這個數字對應十進制就是162,對應16進制就是0xA2。
一般我們就利用第三個字節的值,進行不同的功能定義。第四字節01011101,可以看出與第三字節10100010互為反碼。
但是我們通過上面NEC編碼部分的介紹可知,NEC協議規定低位首先發送。所以上面打印輸出的162(10100010),需要高低位反過來,即第一個按鍵的二進制真實編碼為:01000101,即十六進制的0x45。
我們將所有的按鍵重新計算,所有編碼就能夠得到網上的按鍵編碼圖了。
其實我們只要每個按鍵能準確得到一個不同鍵碼值,然后程序中根據不同值,執行不同流程即可,對于“CH-”鍵碼值是162還是0x45,其實對功能的實現沒有影響。