紅外遙控功能的實(shí)現(xiàn)
目錄:
涉及知識(shí)點(diǎn)
一體化紅外接收頭VS1838B簡(jiǎn)介
應(yīng)用場(chǎng)景
編碼標(biāo)準(zhǔn)
數(shù)據(jù)處理流程
結(jié)果展示
接線
鍵碼值輸出
紅外遙控功能,因其電路簡(jiǎn)單,控制方便,在電子制作和畢業(yè)設(shè)計(jì)中常常使用。
涉及知識(shí)點(diǎn)
GPIO中斷接收
STM32中定時(shí)器的用法
紅外接收頭的使用
外部中斷和定時(shí)器的內(nèi)容比較多,之后網(wǎng)文再詳細(xì)分享。
一體化紅外接收頭VS1838B簡(jiǎn)介
工作電壓: 2.7V~5.5V
應(yīng)用電路
外觀、封裝及尺寸
把接收頭面向自己,左邊為1腳,1腳OUT,2腳GND,3腳VCC。
應(yīng)用場(chǎng)景
視聽器材(音箱、電視、錄影機(jī)、碟機(jī))
家庭電器(冷氣機(jī)、電風(fēng)扇、電燈)
其他紅外線遙控產(chǎn)品
編碼標(biāo)準(zhǔn)
紅外接收頭的型號(hào)有很多HS0038、VS1838B等,功能大致相同,只是引腳封裝不同。
紅外接收有幾種統(tǒng)一的編碼方式,采樣哪種編碼方式取決于遙控器使用的芯片,接收頭收到的都是一樣的。
電視遙控器使用的是專用集成發(fā)射芯片來實(shí)現(xiàn)遙控碼的發(fā)射,通常彩電遙控信號(hào)的發(fā)射,就是將某個(gè)按鍵所對(duì)應(yīng)的控制指令和系統(tǒng)碼(由0和1組成的序列),調(diào)制在38KHz的載波上,然后經(jīng)放大、驅(qū)動(dòng)紅外發(fā)射管將信號(hào)發(fā)射出去。
不同公司的遙控芯片,采樣的遙控碼格式也不一樣,較普遍的有兩種,一種NEC標(biāo)準(zhǔn),一種是PHILIPS標(biāo)準(zhǔn)。
NEC標(biāo)準(zhǔn):
當(dāng)某個(gè)鍵按下時(shí),系統(tǒng)首先發(fā)射一個(gè)完整的全碼,如果按鍵超過108ms仍未松開,接下來發(fā)射的代碼(連發(fā)代碼)將由起始碼(9ms)和結(jié)束碼(2.5ms)組成。
一個(gè)完整的全碼 = 引導(dǎo)碼 +用戶碼 +用戶碼 + 數(shù)據(jù)碼 + 數(shù)據(jù)反碼。
其中,引導(dǎo)碼高電平9ms,低電平4.5ms;
用戶碼和數(shù)據(jù)碼共32位;其中前16位為用戶識(shí)別碼,能區(qū)別不同的紅外遙控設(shè)備,以防止不同的機(jī)種遙控碼互相干擾。
后16位數(shù)據(jù)碼為8位的操作碼和8位的操作反碼,用于核對(duì)數(shù)據(jù)是否接收準(zhǔn)確。
接收端根據(jù)數(shù)據(jù)碼的不同做出相應(yīng)的動(dòng)作。
連發(fā)代碼是在持續(xù)按鍵時(shí)發(fā)送的碼。它告知接收端。某鍵是在被連續(xù)的按著。
PHILIPS標(biāo)準(zhǔn): 邏輯“0”和邏輯“1”的定義。
我們使用的遙控器模塊使用的是NEC標(biāo)準(zhǔn),當(dāng)我們點(diǎn)擊紅外遙控器上第一個(gè)按鍵Ch- 時(shí),用示波器測(cè)量VS1838B的OUT引腳,示波器中抓取的信號(hào)如下:
我們可以看出跟下圖標(biāo)準(zhǔn)的NEC協(xié)議的典型脈沖鏈的定義是一致的:
上圖為NEC協(xié)議的典型脈沖鏈。協(xié)議規(guī)定低位首先發(fā)送。
首先發(fā)送9ms+4.5ms的引導(dǎo)碼,接下來是兩字節(jié)用戶碼,第三字節(jié)是數(shù)據(jù)碼(按鍵碼),用來判斷按鍵值,第四字節(jié)是數(shù)據(jù)反碼,可以用來校驗(yàn),提高按鍵的準(zhǔn)確性。
注意:
我們會(huì)發(fā)現(xiàn)上面兩個(gè)圖中波形的高低電平
實(shí)際上是相反的,因?yàn)榧t外接收頭將38K載波信號(hào)過濾,接收到的波形剛好與發(fā)射波形相反。
難點(diǎn):數(shù)據(jù)0和1的判斷:
所謂的解碼就是一個(gè)區(qū)分脈沖寬度的過程。紅外信號(hào)的“0”和“1”是通過脈沖持續(xù)時(shí)間的長(zhǎng)短來區(qū)分的,NEC標(biāo)準(zhǔn)的“0”和“1”的定義如下:
引導(dǎo)碼:9ms 的載波+4.5ms 的空閑。
比特值“0”:560us 的低電平+560us 的高電平。
比特值“1”:560us 的低電平+1.68ms 的高電平。
VS1838B 這個(gè)紅外一體化接收頭,當(dāng)收到有載波的信號(hào)的時(shí)候,會(huì)輸出一個(gè)低電平,空閑的時(shí)候會(huì)輸出高電平。
數(shù)據(jù)處理流程如下圖所示:
結(jié)果展示
接線
與VS1838B連接:
紅外接收頭的OUT引腳連接PA7
VCC連接3.3V
GND接地
與USB轉(zhuǎn)TTL串口相連: 用于打印調(diào)試信息
USB轉(zhuǎn)TTL串口的TXD與核心板的PA10相連
USB轉(zhuǎn)TTL串口的RXD與核心板的PA9相連
USB轉(zhuǎn)TTL串口的VCC與3V3跳線短接
鍵碼值輸出
按紅外遙控的各個(gè)按鍵,串口打印輸出各個(gè)按鍵值如下:
對(duì)紅外遙控器鍵碼值整理如下:
下面視頻中抓取的是第一個(gè)按鍵的脈沖信號(hào):
我們通過觀察視頻發(fā)現(xiàn)它的四個(gè)字節(jié)的數(shù)據(jù)如下:
00000000 11111111 10100010 01011101
其中:
頭兩個(gè)字節(jié)00000000 11111111,即用戶碼,值為:0x00FF;
第三個(gè)字節(jié)就是Command命令字,10100010,這個(gè)數(shù)字對(duì)應(yīng)十進(jìn)制就是162,對(duì)應(yīng)16進(jìn)制就是0xA2。
一般我們就利用第三個(gè)字節(jié)的值,進(jìn)行不同的功能定義。
第四字節(jié)01011101,可以看出與第三字節(jié)10100010互為反碼。
但是我們通過上面NEC編碼部分的介紹可知,NEC協(xié)議規(guī)定低位首先發(fā)送。所以上面打印輸出的162(10100010),需要高低位反過來,即第一個(gè)按鍵的二進(jìn)制真實(shí)編碼為:01000101,即十六進(jìn)制的0x45。
我們將所有的按鍵重新計(jì)算,所有編碼就能夠得到網(wǎng)上的按鍵編碼圖了。
其實(shí)我們只要每個(gè)按鍵能準(zhǔn)確得到一個(gè)不同鍵碼值,然后程序中根據(jù)不同值,執(zhí)行不同流程即可,對(duì)于“CH-”鍵碼值是162還是0x45,其實(shí)對(duì)功能的實(shí)現(xiàn)沒有影響。
推薦閱讀:
STM32單片機(jī)最小系統(tǒng)詳解
STM32F103 串口的使用方法
STM32中精確延時(shí)函數(shù)的實(shí)現(xiàn)
基于STM32固件庫(kù)的MDK5工程建立
修改Keil工程名稱并添加其他模塊文件
利用STM32F103C8T6最小系統(tǒng)板點(diǎn)亮流水燈
從六月份開始,每個(gè)月會(huì)制作一個(gè)畢業(yè)設(shè)計(jì)難度的DIY作品,
前期作品以模塊組合的形式搭建,降低門檻,方便大家一起跟著做;
DIY過程只在微信公眾號(hào)中分享,大家沒關(guān)注的,趕緊關(guān)注哈。
每個(gè)月時(shí)間大致安排:
上個(gè)月25號(hào),公布DIY作品名稱;
每月1日公布作品功能點(diǎn)及所需要的功能模塊鏈接;
每月10日前繪制完模塊配合的線路板;
每月15日之前硬件搭建完畢,之后按模塊撰寫代碼,調(diào)試,隨時(shí)公眾號(hào)更新進(jìn)展;
每月月底開源整個(gè)作品的源碼和PCB工程文件。
題目選取原則:
公眾號(hào)每個(gè)月20日發(fā)起投票,25號(hào)截止,票數(shù)最多的作為下個(gè)月的DIY內(nèi)容;
投票的備選項(xiàng)大家可以后臺(tái)留言給我,我會(huì)選出五種留言最多的作為選項(xiàng);
每個(gè)月的DIY內(nèi)容盡量與上個(gè)月分享的文章有一定的相關(guān)度,起到溫故知新的作用。
有什么想法或者建議,后臺(tái)留言給我哈。
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問題,請(qǐng)聯(lián)系我們,謝謝!