紅外遙控功能,因其電路簡單,控制方便,在電子製作和畢業設計中常常使用。
涉及知識點
- 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,其實對功能的實現沒有影響。
推薦閱讀:
STM32單片機最小系統詳解
STM32F103 串口的使用方法
STM32中精確延時函數的實現
基於STM32固件庫的MDK5工程建立
修改Keil工程名稱並添加其他模塊文件
利用STM32F103C8T6最小系統板點亮流水燈
六月份的“每月一練”活動已經開始投票了,六月份做什麼,由你們決定。
感興趣的進入下面鏈接投票哈。
2020.06 “每月一練”活動開始投票了
活動介紹及日程安排,詳見公衆號底部菜單欄“每月活動”。
若覺得本次分享的文章對您有幫助,隨手點贊、收藏或轉發分享,也是對我的支持。
歡迎評論中討論,大家一起提高。
有問題可以加我微信號:chengxuyuanxiaoha(程序員小哈)