紅外線IR遙控器原理

最近寫了個學習型遙控器的程式,我就簡單的說一下吧。

想知道紅外線遙控器是怎麼作的話可以看看。


先從發射來講,比較容易瞭解。

[發射]

.指令格式
要用紅外線來控制東西,當然就要先設計指令。指令會是什麼樣子呢?比如說我們把指令設計成固定用1個byte大小來表示好了,那我們就可以把’Power’的功能設計成11110000,’選台’設計成00001010諸如此類的,1個byte的資料量大小就足以讓我們放進256種不同的指令,代表不同的按鈕功能。

.位元編碼
設計好指令之後,我們得想想怎麼用紅外線的動作來表達。把紅外線’亮’當作1,’暗’當作0,這樣好不好呢?仔細想想,應該會有些問題。第一,紅外線遙控的動作應該都是從’亮’開始,因為遙控器是要拿起來、按下去,當遙控的機器發現「啊,紅外線亮了耶」,才會開始去判斷指令對不對。那如果我們設計的指令是那種前面都是0的,像是00001010。那被遙控的機器發現到有指令過來,已經是後面的1010了,這樣前面的指令就都漏掉啦。第二,如果我們的指令是11110000呢?遙控器怎麼知道一直亮著的紅外線是代表4個1,而不是1個1?後面一直熄的0又怎麼辦?所以我們也得來設計一下紅外線的動作,也就是位元編碼了。拿兩個家電界最通行的紅外線協定來講好了,NEC和Philips的RC5。

NEC是使用’變動長度’,他不管0或1,開頭都是先發射560us的紅外線訊號,接下來紅外線停掉一段時間,0的話比較短,只再停560us,1的話比較長,停560*3=1680us。就用這種不同長度的訊號,來作位元編碼。

Philips的RC5呢,則是使用’曼徹斯特編碼'(Manchester coding),講白話點,他就是先亮889us,停889us,這樣當作1。先停889us,才亮889us,這樣當作0。

作好位元編碼之後,每個0和1的bit就可以很清楚的被識別出來了。

.載波(Carrier) / 調變 (modulation)
作好位元編碼之後,按理說處理指令已經沒什麼問題了。不過我們還得考慮一件事,就是現實環境中的干擾。如果接收端被環境的光源照射,例如陽光、燈光裏頭也都含有一些紅外線,是不是容易造成接收端的誤判呢?所以我們就把紅外線的資料,搭上’載波’之後才發射出去,這樣就能夠抗干擾了。

把資料放上載波的動作,叫作’調變’,也就是”把頻率較低的訊號搭在頻率較高的訊號上”。這樣講真的很難理解對吧?舉個現實的例子,廣播電台要把聲波訊號(最高2kHz左右)發射出去,總不能拿大聲公直接放送吧?所以就用了不同的調變技術,AM(調幅)或FM(調頻),把聲波放到AM(522~1652kHz)和FM(118.000MHz~136.955Mhz)的載波上。到了我們的收音機,再從載波上解調變(de-modulation),把原本的聲音訊號還原出來。

紅外線遙控器用的載波,最常見的是38kHZ。當然其它的規格也有(這種東西是隨人定的),不過38kHz是絕大部份家電上都會使用的規格,已經算是不成文的默契了吧。

聽起來還是很複雜,很難想像訊號經過調變之後是什麼樣子對吧?不過紅外線的調變方式真的很簡單。看看調變過的波形就可以知道(抱歉沒圖嘿),跟原本0和1高低電位的方波來比較,0的部份保持不變,還是永遠的低電位;1的部份則改為以38kHz(或其它載波頻率)為週期振盪的方波,就這樣而已。

這樣一來,除非遇到以同樣、或近似載波頻率閃爍的紅外線訊號,不然接收端通通都不理會,也就解決了干擾/雜訊的問題了,還送你大幅增長遙控距離的效果哦。

.紅外線LED
紅外線LED長的跟一般LED沒什麼不同,燈殼透明的或是帶點藍紫色的都有(現在好像透明的比較多?),只差在他發出的是不可見光,人的眼睛看不到,想看他發光請拿台webcam或數位相機就可以看到了。紅外線LED有分波長,一般家電遙控器用的是940nm。另外還有870、850、840、830、808nm等不同規格,大都是用在其它用途(如紅外線攝影,到840nm左右已經接近可見光了)。不管是那種波長,重點是發射端和接收端要能夠匹配,就對啦。

[接收]

.解調變
接收可以用一般紅外線接收頭,或是有一種更方便的,內地叫作”一體化紅外接收頭”的東西,他把接收、解調變、訊號放大等功能全都’集成’在一起了。這種接收頭通常都是方型,塑膠或鐵殼封裝,總共三隻腳位(正電、接地,以及訊號)。不過用這種接收頭的缺點就是有分不同頻率的對應,也就是只能解特定頻率的載波。如果是想要什麼訊號都能解,就還是得用一般的接收頭,然後自己想辦法來解調變了。

.萬用型遙控器
把解調變後得到的方波,拿來用各家的紅外線協定解碼看看,大概就可以判斷出他是使用那一家的協定。或是建立廠牌/型號/協定的資料庫,依照不同代碼來選擇。市面上許多萬用型遙控器便是這個原理。這種作法的優點是穩定,因為全都是照協定的規範來作,而且方便,通常只要辨認出協定類型之後,按鈕就都自動定義好了。缺點則是,萬一遇到不認識的,或是那個廠商自家發明的格式,那就沒法用了。所以這種萬用型遙控器其實並不是那麼萬用啦。

市面上常見的紅外線協定,解碼後的資料量都不大,單顆按鈕只需要6 bytes就可以通通搞定。

.學習型搖控器
學習型的遙控器的原理,就是只解調變,然後把收到的方波完整的記錄下來。這樣的好處當然是不需要去理會協定,可以避免不認識協定就沒法用的問題。但也是有些壞處,每個按鈕都需要重新學習是其一;完整記錄方波再乘上按鈕數需要的記憶體空間很大,硬體成本較高;最糟的是,有些協定每次發射的資料編碼不見的都相同,最常見的就是像選台和音量紐,為了分辦出「按一下」和「按住」和「放開」,通常會用不一樣的指令編碼,或是有的遙控器為了防拷,故意讓每次的訊號不一樣(例如,車庫門的遙控器),遇到這種會跳不同編碼的,也是會有不能用的可能。

一般遙控器指令時間最長大都在0.1~0.3秒以內,不可能太長,因為其實也沒什麼幾個bytes要傳,用不了那麼多時間。而且如果指令時間再拉長的話,用起來會覺得反應很慢。所以學習型遙控器在辨認訊號的時候,大概偵測個0.3~0.5秒就可以了。

另外學習型搖控器記錄波型的資料量大小,還是要看協定的類型,指令byte數多、方波變化量大的話資料量就大。每顆按鈕準備個256bytes來記錄大致上算是夠用,要保險一點的話最好是有512~1Kbytes比較好(每顆按鈕哦)。

大概就這樣吧,有沒啥要補的?

在 “紅外線IR遙控器原理” 有 8 則留言

  1. 不好意思發現一個問題
    紅外線LED那裏
    紅外線LED是紅外線嗎?
    如果是紅外線的話
    其波長應該不是nm為單位吧?

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *