1、紅外光的基本原理
紅外線是波長介於微波和可見光之間的電磁波,波長在 760 納米到 1 毫米之間,是波形比紅光長的非可見光。自然界中的一切物體,只要它的溫度高於絕對零度(-273)就存在分子和原子的無規則運動,其表面就會不停的輻射紅外線。當然了,雖然是都輻射紅外線,但是不同的物體輻射的強度是不一樣的,而我們正是利用了這一點把紅外技術應用到我們的實際開發中。
紅外發射管很常用,在我們的遙控器上都可以看到,它類似發光二極管,但是它發射出來的是紅外光,是我們肉眼所看不到的。發光二極管的亮度會隨着電流的增大而增加,同樣的道理,紅外發射管發射紅外線的強度也會隨着電流的增大而增強,常見的紅外發射管如下圖所示。

紅外接收管內部是一個具有紅外光敏感特征的 PN 節,屬於光敏二極管,但是它只對紅外光有反應。無紅外光時,光敏管不導通,有紅外光時,光敏管導通形成光電流,並且在一定范圍內電流隨着紅外光的強度的增強而增大。典型的紅外接收管如下圖所示。

這種紅外發射和接收對管在小車、機器人避障以及紅外循跡小車中有所應用,這部分內容在我們的 KST-51 開發板上並沒有實現,但是屬於紅外部分的內容,所以我提供一個原理圖給大家作為學習之用,如下圖所示。

發射部分:當發射控制輸出高電平時,三極管 Q1 不導通,紅外發射管 L1 不會發射紅外信號;當發射控制輸出低電平的時候,通過三極管 Q1 導通讓 L1 發出紅外光。
接收部分:R4 是一個電位器,我們通過調整電位器給 LM393 的 2 腳提供一個閾值電壓,這個電壓值的大小可以根據實際情況來調試確定。而紅外光敏二極管 L2 收到紅外光的時候,會產生電流,並且隨着紅外光的從弱變強,電流會從小變大。當沒有紅外光或者說紅外光很弱的時候,3 腳的電壓就會接近 VCC,如果 3 腳比 2 腳的電壓高的話,通過 LM393 比較器后,接收檢測引腳輸出一個高電平。當隨着光強變大,電流變大,3 腳的電壓值等於 VCC-I*R3,電壓就會越來越小,當小到一定程度,比 2 腳的電壓還小的時候,接收檢測引腳就會變為低電平。
這個電路用於避障的時候,發射管先發送紅外信號,紅外信號會隨着傳送距離的加大逐漸衰減,如果遇到障礙物,就會形成紅外反射。當反射回來的信號比較弱時,光敏二極管 L2接收的紅外光較弱,比較器 LM393 的 3 腳電壓高於 2 腳電壓,接收檢測引腳輸出高電平,說明障礙物比較遠;當反射回來的信號比較強,接收檢測引腳輸出低電平,說明障礙物比較近了。
用於小車循跡的時候,必須要有黑色和白色的軌道。當紅外信號發送到黑色軌道時,黑色因為吸光能力比較強,紅外信號發送出去后就會被吸收掉,反射部分很微弱。白色軌道就會把大部分紅外信號反射回來。通常情況下的循跡小車,需要應用多個紅外模塊同時檢測,從多個角度判斷軌道,根據判斷的結果來調整小車使其按照正常循跡前行。
2、紅外遙控通信原理
在實際的通信領域,發出來的信號一般有較寬的頻譜,而且都是在比較低的頻率段分布大量的能量,所以稱之為基帶信號,這種信號是不適合直接在信道中傳輸的。為便於傳輸、提高抗干擾能力和有效的利用帶寬,通常需要將信號調制到適合信道和噪聲特性的頻率范圍內進行傳輸,這就叫做信號調制。在通信系統的接收端要對接收到的信號進行解調,恢復出原來的基帶信號。
我們平時用到的紅外遙控器里的紅外通信,通常是使用 38K 左右的載波進行調制的。下面我把原理大概給大家介紹一下,先看發送部分原理。
調制:就是用待傳送信號去控制某個高頻信號的幅度、相位、頻率等參量變化的過程,即用一個信號去裝載另一個信號。比如我們的紅外遙控信號要發送的時候,先經過 38K 調制,如下圖 所示。

原始信號就是我們要發送的一個數據“0”位或者一位數據“1”位,而所謂 38K 載波就是頻率為 38K 的方波信號,調制后信號就是最終我們發射出去的波形。我們使用原始信號來控制 38K 載波,當信號是數據“0”的時候,38K 載波毫無保留的全部發送出去,當信號是數據“1”的時候,不發送任何載波信號。
那在原理上,我們如何從電路的角度去實現這個功能呢?如下圖所示。

38K 載波,我們可以用 455K 晶振,經過 12 分頻得到 37.91K,也可以由時基電路 NE555來產生,或者使用單片機的 PWM 來產生。當信號輸出引腳輸出高電平時,Q2 截止,不管38K 載波信號如何控制 Q1,右側的豎向支路都不會導通,紅外管 L1 不會發送任何信息。當信號輸出是低電平的時候,那么 38K 載波就會通過 Q1 釋放出來,在 L1 上產生 38K 的載波信號。這里要說明的是,大多數家電遙控器的 38K 的占空比是 1/3,也有 1/2 的,但是相對少一些。
正常的通信來講,接收端要首先對信號通過監測、放大、濾波、解調等等一系列電路處理,然后輸出基帶信號。但是紅外通信的一體化接收頭 HS0038B,已經把這些電路全部集成到一起了,我們只需要把這個電路接上去,就可以直接輸出我們所要的基帶信號了,如下圖所示。

由於紅外接收頭內部放大器的增益很大,很容易引起干擾,因此在接收頭供電引腳上必須加上濾波電容,官方手冊給的值是 4.7uF,我們這里直接用的 10uF,手冊里還要求在供電引腳和電源之間串聯 100 歐的電阻,進一步降低干擾。
當 HS0038B 監測到有 38K的紅外信號時,就會在 OUT 引腳輸出低電平,當沒有 38K 的時候,OUT 引腳就會輸出高電平。那我們把 OUT 引腳接到單片機的 IO 口上,通過編程,就可以獲取紅外通信發過來的數據了。
大家想想,OUT 引腳輸出的數據是不是又恢復成為基帶信號數據了呢?那我們單片機在接收這個基帶信號數據的時候,如何判斷接收到的是什么數據,應該遵循什么協議呢?像我們前邊學到的 UART、I2C、SPI 等通信協議都是基帶通信的通信協議,而紅外的 38K 僅僅是對基帶信號進行調制解調,讓信號更適合在信道中傳輸。
由於我們的紅外調制信號是半雙工的,而且同一時刻空間只能允許一個信號源,所以紅外的基帶信號不適合在 I2C 或者 SPI 通信協議中進行的, UART 雖然是 2 條線,但是通信的時候,實際上一條線即可,所以紅外可以在 UART 中進行通信。當然,這個通信也不是沒有限制的,比如在 HS0038B 的數據手冊中標明,要想讓 HS0038B 識別到 38K的紅外信號,那么這個 38K 的載波必須要大於 10 個周期,這就限定了紅外通信的基帶信號的比特率必須不能高於 3800,那如果把串口輸出的信號直接用 38K 調制的話,波特率也就不能高於 3800。當然還有很多其它基帶協議可以利用紅外來調制,下面我們介紹一種遙控器常用的紅外通信協議——NEC 協議。
3、常用的紅外通信協議
家電遙控器通信距離往往要求不高,而紅外的成本比其它無線設備要低的多,所以家電遙控器應用中紅外始終占據着一席之地。遙控器的基帶通信協議很多,大概有幾十種,常用的有 ITT 協議、NEC 協議、Sharp 協議、Philips RC-5 協議、Sony SIRC 協議等,用的最多的就是 NEC 協議了。
3.1、NEC協議
3.1.1、NEC協議原理
NEC 協議的數據格式包括了引導碼、用戶碼(地址碼)、戶碼反碼(地址反碼)、按鍵鍵碼和鍵碼反碼,最后一個停止位。停止位主要起隔離作用,一般不進行判斷,編程時我們也不予理會。其中數據編碼總共是 4 個字節 32 位,如下圖所示。第一個字節是用戶碼,第二個字節可能也是用戶碼,或者是用戶碼的反碼,具體由生產商決定,第三個字節就是當前按鍵的鍵數據碼,而第四個字節是鍵數據碼的反碼,可用於對數據的糾錯。

這個 NEC 協議,表示數據的方式不像我們之前學過的比如 UART 那樣直觀,而是每一位數據本身也需要進行編碼,編碼后再進行載波調制。
- 引導碼:9ms 的載波和4.5ms 的空閑。
- 比特值“0”:560us 的載波+560us 的空閑。
- 比特值“1”:560us 的載波+1.68ms 的空閑。
- 其中的載波主要是通過硬件中的方波來實現,不建議通過軟件來實現。所以我們根據脈沖時間長短來解碼。推薦載波占空比為1/3至1/4。
(1)、邏輯1與邏輯0
NEC協議載波為38khz,在空中實際傳輸時其邏輯1與邏輯0的表示如圖所示:
邏輯1為2.25ms,脈沖時間560us;邏輯0為1.12ms,脈沖時間560us。所以我們根據脈沖時間長短來解碼。推薦載波占空比為1/3至1/4。
(2)、NEC協議格式
比如地址碼為0x9A,數據碼為0x68:
首次發送的是9ms的高電平,其后是4.5ms的低電平,接下來就是8bit的地址碼(從低有效位開始發),而后是8bit的地址碼的反碼(主要是用於校驗是否出錯)。然后是8bit 的數據碼(也是從低有效位開始發),而后也是8bit 的數據碼的反碼。最后發送的是8ms低電平+50ms高電平的結束碼。
實際空中傳輸時引導碼先是 9ms 載波脈沖,緊接着是引導碼的 4.5ms 的空閑,而后邊的數據碼,是眾多載波和空閑交叉,它們的長短就由其要傳遞的具體數據來決定。
以上是一個正常的序列,但可能存在一種情況:你一直按着1個鍵,這樣的話先發送一次命令碼,之后不會再發送命令碼,而是以110ms為周期發送一段重復碼。如下圖:
重復碼由9ms高電平和2.25ms的低電平以及560us的高電平組成。
完整波形如下:
需要注意的是:1838紅外一體接收頭為了提高接受靈敏度。輸入高電平,其輸出的是相反的低電平。
3.1.1、NEC協議舉例
上面講到當按下遙控器的一個按鍵時,會發出一幀的數據,這一幀的數據的組成分別是:引導碼、地址碼、地址碼的反碼、數據碼和數據碼的反碼。
當發送的地址為0x00(00000000),發送的紅外數據為0xAD(10101101)時的一幀的格式大概如下(下面的極性和上面的圖剛好相反,但是不影響理解協議):
由上面的圖可以看出,每個碼的脈沖寬度都有規定,大概如下:
上面的圖中有個引導碼(重復),這個的作用是,當我們一直按住同一個按鍵的時候,就會每隔一段時間發一個引導碼(重復),也就是重復碼。
3.1.2、NEC協議接收數據程序流程圖

注意:
用示波器在接收頭抓的電平看起來和NEC協議剛好相反,那是因為:HS0038B 這個紅外一體化接收頭,當收到有載波的信號的時候,會輸出一個低電平,空閑的時候會輸出高電平。