Introduction
本文示範紅外線遙控電視機。我電視機用的是 NEC IR Protocol。看完本文後,你將學會用紅外線遙控講 NEC IR Protocol 的各種家電設備,比如 VCR, DVD Player, 投影機、音響等。
Highlights
- 材料 (Parts List)
- 接線 (Wiring)
- 範例程式
材料 (Parts List)
Name | Photo |
Arduino Duemilanove x 1 | |
OSE-8L Infrared Emitter LED x 1 | |
36Ω 電阻 x 1 | |
電晶體 x 1 (2n7002 mosfet) |
接線 (Wiring)
-
範例所用的 IR LED 接在 pin 13 上
-
電阻值計算:
註:只要接近理想電阻即可,實際選用的電阻為 36Ω
範例程式
要對遙控器發射出來的紅外線解碼,可以用示波器跟一個紅外線接收器:
按下遙控器的 Power 按鈕後,從示波器上觀察到的紅外線波形如下(接收器會將訊號反向,資料是 LSB first):
解碼可得 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
-
waveform 係由很多 on/off 交替的訊號所組成:
- Carrier frequency = 38kHz
- duty factor = 1/3
- period = 26.5us
-
要送出 1 個 bit 的 1,就先呼叫 mark(NEC_BIT_MARK) 送出 560us 的 waveform (mark),接著再呼叫 delayMicroseconds(NEC_ONE_SPACE) 送出 1690us 的 space:
-
注意 code 是 LSB (Least Significant Bit) 先傳。
參考資料
- Arduino 範例程式(NECIRSend.zip)
- 範例程式 PIC18F4550 版 (pic18f4550_necirsend.zip)
- 紅外線遙控原理與 NEC IR Protocol
- Building a Universal Remote with an Arduino
- Arduino Overview
14 意見:
dear cooper maa,
我買了arduino 的紅外線遙控,但我本身並不用arduino的單晶片,而是用pic,而pic要用什麼方式來接訊號,一開始我不太懂時,我用了usart來接,我發現我按一扭進來的訊號很多,不像你只有四碼,那是要什麼方式來接才是對的呢?
請問你的目的是要接收還是發射紅外線訊號?這篇講的是紅外線訊號的發射喔。
如果是接收的話,PIC 不像 arduino 有 IRRemote libray 這個方便的 library,你可能得 google 找看看,或者是自己寫 code.
如果是發射的話,我在這篇也有提供一個 PIC 的範例,見「參考資料」。
dear coopermaa,
我是要接收,但不知arduino的那個紅外線遙控器是用什麼協定,我在想是不是要跟你的教學一樣,做一個接收器先在電腦上分析才可以?
讓我弄清楚一下,你買了 arduino 的紅外線遙控,它是一個紅外線遙控器,對嗎? 那除了這個紅外線遙控器外,你有 arduino 板子跟紅外線接收器嗎?
可以告訴我你買的「arduino 的紅外線遙控」的規格/網址嗎?
dear coopermaa,
我是買網路上http://goods.ruten.com.tw/item/show?21103151538268
我本身沒有用arduino
那個套件裏有一個紅外線遙控器和一個 38 kHz 紅外線接收器。
用 PIC 的話,我不曉得 PIC 有沒有現成的 irremote library 可用。你打算自己寫 decoder 嗎? 如果要自己 decode 的話,我想可能得用 CCP (Capture, Compare and PWM) 模組的 Capture 功能來收訊號。
我想是沒有,應該說有,也不好找到,那我只好自己有試試看了。因為原本想請教你的教學中,有一篇是用電腦來解碼,但好像也看不出,波長與波長之間的長短,按照你的教學內容,紅外線的協定,在後端data碼中,是看時間的長短來判別是1or0的訊號的。一個一個解是有點麻煩,但我再試試看
不會啊,Google 很厲害的,什麼都找得到:
http://www.sbprojects.com/projects/ircontrol/picir.php
http://www.vecoven.com/elec/ir/ir.html
你是說 WinLIRC 嗎?其實也是可以用 WinLIRC 來解碼,只不過你需要把接收器轉接到 PC 上才行。一個簡單的方法是把訊號線接到麥克風輸入埠。
dear coopermaa,
上面有一個網址的c sourcecode,看得真挫折,看來我還太淺了。謝謝您的提供。
其實我對 PIC 的 CCP 也還不太熟,所以也不太懂,改天有空再來研究。倒是那支 ir decoder 程式跟 Arduino 的 IRRemote 一樣,也支援多種協定,包括 RC5, RC6, NEC, JVC, SONY 等。應該可以解你買的那支遙控器的 code 才是。
請問Cooper~
我看你發射紅外線的文章
http://coopermaa2nd.blogspot.tw/2011/03/21.html
不像此篇一樣需要加設電晶體
請問這電晶體的用途為何?
為什麼要加裝呢?
居然把我的文章看得這麼仔細! 厲害! ^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
謝謝!! 我只是剛好看到拉~~~
Cooper回覆的速度真的超快的~~~
這樣的分享真的給我們後輩很多方便~~
感謝萬分!!
不客氣! :)
張貼留言