2010年2月3日 星期三

紅外線遙控電視機 (NEC IR)

Introduction

本文示範紅外線遙控電視機。我電視機用的是 NEC IR Protocol。看完本文後,你將學會用紅外線遙控講 NEC IR Protocol 的各種家電設備,比如 VCR, DVD Player, 投影機、音響等。

Highlights

  • 材料 (Parts List)
  • 接線 (Wiring)
  • 範例程式

材料 (Parts List)

Name Photo
Arduino Duemilanove x 1 
image
OSE-8L Infrared Emitter LED x 1 image
36Ω 電阻 x 1  
電晶體 x 1 (2n7002 mosfet)  

接線 (Wiring)

  • 範例所用的 IR LED 接在 pin 13 上

image

  • 電阻值計算:

image

註:只要接近理想電阻即可,實際選用的電阻為 36Ω

範例程式

要對遙控器發射出來的紅外線解碼,可以用示波器跟一個紅外線接收器:

image

按下遙控器的 Power 按鈕後,從示波器上觀察到的紅外線波形如下(接收器會將訊號反向,資料是 LSB first):

image

image

解碼可得 Power 按鈕的 Code 為 0×20, 0xDF, 0×12, 0xED。我總共解出了 5 組我電視遙控器的碼:

由此可見遙控器每個按鍵送出的 Custom code 都是一樣的。

底下的 Arduino 程式每 5 秒鐘送出一次 POWER 紅外線訊號:

程式重點說明:

  • Bit data format:

    • 560us 的 waveform 加上 1690us 的 space 共計 2.25ms 的波形代表 1
    • 560us 的 waveform 加上 560us 的 space 共計 1.12ms 的波形代表 0

image

  • waveform 係由很多 on/off 交替的訊號所組成:

    • Carrier frequency = 38kHz
    • duty factor = 1/3
    • period = 26.5us

image

  • 要送出 1 個 bit 的 1,就先呼叫 mark(NEC_BIT_MARK) 送出 560us 的 waveform (mark),接著再呼叫 delayMicroseconds(NEC_ONE_SPACE) 送出 1690us 的 space:

  • 注意 code 是 LSB (Least Significant Bit) 先傳。

參考資料

14 意見:

wallace 提到...

dear cooper maa,

我買了arduino 的紅外線遙控,但我本身並不用arduino的單晶片,而是用pic,而pic要用什麼方式來接訊號,一開始我不太懂時,我用了usart來接,我發現我按一扭進來的訊號很多,不像你只有四碼,那是要什麼方式來接才是對的呢?

coopermaa 提到...

請問你的目的是要接收還是發射紅外線訊號?這篇講的是紅外線訊號的發射喔。
如果是接收的話,PIC 不像 arduino 有 IRRemote libray 這個方便的 library,你可能得 google 找看看,或者是自己寫 code.
如果是發射的話,我在這篇也有提供一個 PIC 的範例,見「參考資料」。

wallace 提到...

dear coopermaa,
我是要接收,但不知arduino的那個紅外線遙控器是用什麼協定,我在想是不是要跟你的教學一樣,做一個接收器先在電腦上分析才可以?

coopermaa 提到...

讓我弄清楚一下,你買了 arduino 的紅外線遙控,它是一個紅外線遙控器,對嗎? 那除了這個紅外線遙控器外,你有 arduino 板子跟紅外線接收器嗎?

可以告訴我你買的「arduino 的紅外線遙控」的規格/網址嗎?

wallace 提到...

dear coopermaa,
我是買網路上http://goods.ruten.com.tw/item/show?21103151538268

我本身沒有用arduino

coopermaa 提到...

那個套件裏有一個紅外線遙控器和一個 38 kHz 紅外線接收器。

用 PIC 的話,我不曉得 PIC 有沒有現成的 irremote library 可用。你打算自己寫 decoder 嗎? 如果要自己 decode 的話,我想可能得用 CCP (Capture, Compare and PWM) 模組的 Capture 功能來收訊號。

wallace 提到...

我想是沒有,應該說有,也不好找到,那我只好自己有試試看了。因為原本想請教你的教學中,有一篇是用電腦來解碼,但好像也看不出,波長與波長之間的長短,按照你的教學內容,紅外線的協定,在後端data碼中,是看時間的長短來判別是1or0的訊號的。一個一個解是有點麻煩,但我再試試看

coopermaa 提到...

不會啊,Google 很厲害的,什麼都找得到:

http://www.sbprojects.com/projects/ircontrol/picir.php
http://www.vecoven.com/elec/ir/ir.html

你是說 WinLIRC 嗎?其實也是可以用 WinLIRC 來解碼,只不過你需要把接收器轉接到 PC 上才行。一個簡單的方法是把訊號線接到麥克風輸入埠。

wallace 提到...

dear coopermaa,
上面有一個網址的c sourcecode,看得真挫折,看來我還太淺了。謝謝您的提供。

coopermaa 提到...

其實我對 PIC 的 CCP 也還不太熟,所以也不太懂,改天有空再來研究。倒是那支 ir decoder 程式跟 Arduino 的 IRRemote 一樣,也支援多種協定,包括 RC5, RC6, NEC, JVC, SONY 等。應該可以解你買的那支遙控器的 code 才是。

Sven Wang 提到...

請問Cooper~

我看你發射紅外線的文章
http://coopermaa2nd.blogspot.tw/2011/03/21.html
不像此篇一樣需要加設電晶體

請問這電晶體的用途為何?
為什麼要加裝呢?

coopermaa 提到...

居然把我的文章看得這麼仔細! 厲害! ^o^

其實寫這篇的時候,我對電子還不大懂
當時我只知道推動 IR LED 需要 50mA 的電流
但是 Arduino Output pin 只有 40mA
同事告訴我,借助電晶體的話就可以驅動 IR LED,所以才會使用電晶體

後來我發現很多網站都是直接用 Arduino Output pin 驅動 IR LED,都沒問題,而且線路也比較簡單
所以我就從善如流不用電晶體了....haha~

BTW, 直接把 IR LED 接到 Arduino Output pin,IR 輸出距離比較短
如果想提高發射距離的話,可以利用電晶體驅動多顆 IR LED,參考這個電路設計:
http://www.open.com.au/mikem/arduino/IRrc/LED-Output.pdf

Sven Wang 提到...

謝謝!! 我只是剛好看到拉~~~
Cooper回覆的速度真的超快的~~~
這樣的分享真的給我們後輩很多方便~~

感謝萬分!!

coopermaa 提到...

不客氣! :)