紅外通信協議


1、紅外光的基本原理

  紅外線是波長介於微波和可見光之間的電磁波,波長在 760 納米到 1 毫米之間,是波形比紅光長的非可見光。自然界中的一切物體,只要它的溫度高於絕對零度(-273)就存在分子和原子的無規則運動,其表面就會不停的輻射紅外線。當然了,雖然是都輻射紅外線,但是不同的物體輻射的強度是不一樣的,而我們正是利用了這一點把紅外技術應用到我們的實際開發中。

  紅外發射管很常用,在我們的遙控器上都可以看到,它類似發光二極管,但是它發射出來的是紅外光,是我們肉眼所看不到的。發光二極管的亮度會隨着電流的增大而增加,同樣的道理,紅外發射管發射紅外線的強度也會隨着電流的增大而增強,常見的紅外發射管如下圖所示。

圖 16-1  紅外發射管

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

圖 16-2  紅外接收管

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

圖 16-3   紅外避障、循跡原理圖


  發射部分:當發射控制輸出高電平時,三極管 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 調制,如下圖 所示。

圖 16-4  紅外信號調制

  原始信號就是我們要發送的一個數據“0”位或者一位數據“1”位,而所謂 38K 載波就是頻率為 38K 的方波信號,調制后信號就是最終我們發射出去的波形。我們使用原始信號來控制 38K 載波,當信號是數據“0”的時候,38K 載波毫無保留的全部發送出去,當信號是數據“1”的時候,不發送任何載波信號。

  那在原理上,我們如何從電路的角度去實現這個功能呢?如下圖所示。

圖 16-5   紅外發射原理圖

  38K 載波,我們可以用 455K 晶振,經過 12 分頻得到 37.91K,也可以由時基電路 NE555來產生,或者使用單片機的 PWM 來產生。當信號輸出引腳輸出高電平時,Q2 截止,不管38K 載波信號如何控制 Q1,右側的豎向支路都不會導通,紅外管 L1 不會發送任何信息。當信號輸出是低電平的時候,那么 38K 載波就會通過 Q1 釋放出來,在 L1 上產生 38K 的載波信號。這里要說明的是,大多數家電遙控器的 38K 的占空比是 1/3,也有 1/2 的,但是相對少一些。

  正常的通信來講,接收端要首先對信號通過監測、放大、濾波、解調等等一系列電路處理,然后輸出基帶信號。但是紅外通信的一體化接收頭 HS0038B,已經把這些電路全部集成到一起了,我們只需要把這個電路接上去,就可以直接輸出我們所要的基帶信號了,如下圖所示。

圖 16-6  紅外接收原理圖

  由於紅外接收頭內部放大器的增益很大,很容易引起干擾,因此在接收頭供電引腳上必須加上濾波電容,官方手冊給的值是 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 位,如下圖所示。第一個字節是用戶碼,第二個字節可能也是用戶碼,或者是用戶碼的反碼,具體由生產商決定,第三個字節就是當前按鍵的鍵數據碼,而第四個字節是鍵數據碼的反碼,可用於對數據的糾錯。

圖 16-7  NEC 協議數據格式

  這個 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協議接收數據程序流程圖

圖 16-9  紅外接收程序流程圖

  注意:

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

   

參考:http://www.linuxidc.com/Linux/2014-09/106408.htm

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM