自製紅外線遙控接收與發射器

自製紅外線遙控接收與發射器
文∕趙英傑

隨著寬頻網路、Media Center、迷你桌上型電腦主機與平面電視的日益普及,十年前壯烈成仁的Web TV概念(註:透過數位機上盒set-top box與電視瀏覽網路資訊或互動視訊)已捲土重來。

把電腦搬到客廳,除了要注重機器的外型設計和噪音值之外,也要考慮到是否能方便地透過遙控器操作。標榜MPC功能的電腦,一定有紅外線遙控功能。即使沒有內建,要自己DIY也很簡單。

目前最普遍的電腦紅外線遙控方案是開放原始碼的LIRC(Linux Infrared Remote Control,Linux紅外線遙控),這原先設計用於Linux系統的遙控裝置,也被移植到Windows平台,簡稱WinLIRC。Mobile01網站上,已經有一位Jetter大大詳細說明了相關電路的製作與軟體的操作設定方式(參閱:[很好DIY] WinLIRC電腦萬用紅外線遙控器)。整個紅外線遙控接收器的硬體成本只需台幣數十元。

裝在麵包版上的紅外線發射與接收器

這個自製紅外線接收器電路有一個限制:你的電腦上一定要有內建的串列埠(serial port或簡稱RS-232埠),採用「USB轉RS-232」的裝置將USB轉換成序列埠似乎不能用。蘋果的Mac電腦都沒有內建序列埠(只有在80和90年代生產的Mac上才找得到),所以無法使用這個方案(解決方式請參閱下文說明)。

我的紅外線遙控感應零件是從報廢的先鋒牌(Pioneer)535K DVD播放器上拆下來的,我不知道它的型號,但經過測試,此元件的接腳和6038LM-5A定義是一樣的。

紅外線接收感應器

製作紅外線遙控發射器

我製作這個電路的主要目的是想要測試用電腦遙控Roomba吸塵器機器人的效果,所以我其實不太需要紅外線接收的功能。透過RS-232序列埠發射紅外線遙控訊號的電路也有多種,底下是最簡單的,用一個電阻連接紅外線發射二極體(IR LED)就完成了。底下的圖片取自LIRC網站的Serial Port Transmitters(序列埠發射器)頁面,由Ralph Metzler設計:

簡易的序列埠紅外線發射器

這篇文章提到,上面的簡易型電路有燒壞電腦主機板的風險,所以Ralph Metzler沒有直接將此電路接在主機內建的序列埠,而是接在序列埠擴充卡上。底下是比較安全的紅外線發射電路(已經依照這篇文章的解說加上旁路電容),採用兩個NPN電晶體(電路圖標示的是BD237,我用的是2N2222,應該也能用3904或9013代替)。電路左下角的電阻值範圍約在5~100歐姆之間,電阻值小,發射功率越高。

改良的發射電路

底下是另一個紅外線發射和接收器的電路(取自IguanaWorks網站),發射器部分的線路比上圖的還要簡潔。不過,此電路採用了一個0.33F的電容,沒錯,是0.33「法拉」!

紅外線收發器電路

按照常理判斷,0.33F電容應該很巨大,不過從照片看來卻很小(電路版中間下面,看起來像電池的那一個):

紅外線收發器

我們家附近的電子材料行沒有賣這款電容,材料行的店員還再三跟我確認是不是電容的單位搞錯了?

遠端遙控啟動Roomba吸塵器機器人

製作好紅外線收發電路之後,可以使用學習功能讓它記錄遙控器的訊號,或者到LIRC網站的Remote Codes網頁下載現成的遙控器設定檔。例如,Roomba吸塵器機器人的設定檔就放在irobot路徑底下。

我測試了其中的Roomba_Discovery_4220設定檔,確實可以從個人電腦遙控Roomba。不過,就像使用PDA遙控Roomba一樣,這個電路的遙控距離並不長。

為何要使用電腦來遙控Roomba?假設你想要從遠端來啟動Roomba,或者替那些不具備定時功能的Roomba(例如:Roomba 530)建立一個定時啟動的機制。就可以把紅外線發射器設在Roomba的充電基地台上面,再透過HttpIrc伺服器軟體(PHP的程式框架)即可從遠端的瀏覽器啟動PHP程式來遙控它。

自製的紅外線接收和發射裝置不一定要裝在電腦上,像華碩(Asus)的WL-500gp無線寬頻路由器,改裝自訂的Linux系統並且加上序列埠之後,也可以轉變成Roomba的無線基地控制台。

使用麥克風輸入埠接收紅外線訊號

對於沒有RS-232序列埠的裝置或電腦,可以嘗試底下這個電路(這個網站有改裝在Power Mac主機的照片)。基本上,光線和聲音都是一種「波(wave)」,這個電路直接把紅外線感測元件的電流(波形)導入麥克風當成聲波,輸入到電腦。電腦上的軟體將解析聲波訊號,並執行對應的遙控操作。

使用麥克風輸入埠感應紅外線

電腦上的聲音訊號處理電路,其頻率響應該是設計成和人耳所能接受的頻率範圍相近,約20Hz~20KHz之間。如果我沒記錯,紅外線遙控的頻率通常是38KHz或更高,超出處理聲音的響應頻率。

也許理論上,我們可以用「立體聲」訊號輸入,讓左聲道和右聲道各記錄20KHz的訊號,這樣合起來就可達到40KHz的頻率了。上面的電路只使用單一聲道,所以我猜想這個遙控電路的訊號感應誤差可能蠻大的,不過,如果只用來遙控基本的操作(如:播放、停止影片),也許沒有太大的影響吧。

將聲音轉換成紅外線輸出

既然紅外線訊號能被轉換成聲音輸入,聲音訊號當然也可以轉變成紅外線控制訊號輸出。好幾年前,Griffin Technology公司就曾推出叫做Total Remote的產品,將它接在PDA的耳機插座並安裝控制軟體後,就能當成長距離(相對於PDA本身的紅外線埠)的遙控裝置。這項商品似乎已經停產了,外觀如下:

Total Remote裝置

上圖取自Code Project網站的C# Remote Control using the Audio Port這篇文章,在該文的讀者回應中有人提出簡易的相容電路。此外,也有人運用這個裝置將iPod變成遙控器…只是看起來不是很好用…把紅外線訊號轉錄成MP3格式後,再透過Flash設計遙控器的操作介面並播放紅外線聲音訊號,不是更好用且更酷嗎 🙂

把iPod轉變成紅外線遙控器

延伸閱讀

Posts created 467

49 thoughts on “自製紅外線遙控接收與發射器

  1. 您好, 提供您一點通訊原理的觀念
    電腦上的聲音訊號處理電路的左聲道跟右聲道所使用的頻帶,在頻譜上來看”都是”落在20Hz~20KHz之間,就算你把它們相加,它所能處理的訊號還是只能在20Hz~20KHz之間喔,並不會因此就變成40kHz.
    如果您想讓聲音訊號處理電路接收38kHz的紅外線遙控的頻率,只能透過調變技術把38kHz的訊號降到20kHz以下. 不過,現今通用的38kHz紅外線訊號是”數位的”,在頻譜上來看可能會帶有20kHz以下的訊號,可是這訊號是不是我們想要的可能就要透過示波器來看看才知道了,我想多半是不正確的吧.

  2. hi FlameMkIII:

    當您把一個訊號,往左、右聲道輸出,並錯開一點時間差,再將兩個訊號合併之後,就不只是20KHz,這就是 Total Remote 產品可以將一般的聲音訊號,轉換成紅外線遙控所需的 38KHz 頻率的原因。

    thanks,
    jeffrey

    1. 老師-請問你一下…音頻是不是可透過某些儀器傳送在借由電腦,手機,定位功能或網路訊號甚至wifi,紅外線收發器,轉換音頻,這樣是不是就能遠端發 送或接收了

    2. hi 鐵男:

      可以,但其實不必使用迂迴法…紅外線訊號本身就是一連串0和1數位信號,可直接透過Wi-Fi或藍牙傳送,不用先轉換成聲音。
      轉換成聲音只是為了直接用耳機孔輸出紅外線訊號。

      thanks,
      jeffrey

  3. 那就是我所說的調變技術, 經過一個乘法電路來讓這兩個20kHz的訊號相乘就能變成40kHz, 我想說的是單純的相加是沒辨法的

  4. 那應該不是乘法電路,從一端輸出訊號,另一端則是在相隔一個週期之後,再輸出訊號,兩者做 OR 合併,即可得到兩個週期的訊號。

  5. 它所說的是相隔半週期, 也就是相位差π(180度), 並不是相隔一個週期,相隔一個週期的話, 相位差是2π(360度),那左右聲道根本就沒有差別.

    假設右聲道的訊號是 cos(2πft), f=20kHz
    左聲道的訊號就會是 cos(2πft+π)
    如果是用OR合成的話, 那輸出就會是
    cos(2πft)+cos(2πft+π)
    =2*cos(((2πft)+(2πft+π))/2)*cos(((2πft)-(2πft+π))/2)
    =2*cos(2πft+π/2)*0
    =0
    輸出結果是直流訊號呀… 並不會變成40kHz啊

  6. 它其實是利用LED的二極體的特性, 來把弦波的下半週給翻上來就會得到40kHz的訊號了, 一個LED發出上半週的訊號, 一個LED發出下半週的訊號, 那麼你在接收端收到的就是40kHz的訊號了

  7. 剛剛想到,如果是相同的正弦或餘弦波形,相隔半個週期再予以合成,波峰和波谷才會相互抵銷變成直流。

  8. 沒錯, 波峰跟波谷會互相抵消變成直流, 所以我才會覺得奇怪

    以它這個設計原理來說連乘法電路都可以省了, 就只是個倍頻而已, 跟橋式整流電路有點像

  9. 不過,它還是只能送不能收呀, 你要拿來收的話還是須要乘法電路把載波頻率降下來

  10. https://swf.com.tw/images/hardware/IR/better_transmitter.gif

    你好 我依以上的電路圖買了零件裝好
    使用WINLIRC0.65版
    先用上述推薦的DIY IRLED接收器 以WINLIRC接收TECO DVDplayer 遙控器的電源紐訊號

    再換上此IR發射電路以WINLIRC軟體有發射此訊號 可是DVDPLATER卻無反應

    仔細以三用電表檢查了此發射電路

    發現在未以軟體發射訊號時 DTR腳位電壓預設大概-20V
    且此時IRLED以數位相機觀察並沒有發光

    以軟體發射訊號時 DTR腳位電壓會升高到-15V
    但此時IRLED以相機觀察仍無發光

    電路零件都再三確認過 但卻無法成功發射訊號去遙控DVDplayer
    能否請有成功製成發射IRLED者 詳細解說一下各個細節…

  11. 可能大家都已經知道了,不過還是回一下 (兩年前的文了 XD)

    電路圖上面那顆TSOP1738跟6038LM一樣內含38kHz解調變的功能,所以他data腳位輸出的已經是解調過的編碼訊號了。一般protocol來講,編碼的每個bit長度大概都有1ms以上,所以頻率只會用到1kHz左右,轉成音頻來錄是OK的~

  12. 请问大侠,为什么我按照http://www.mobile01.com/topicdetail.php?f=168&t=124928里介绍的用RS232串口去做,加上USB转RS232线接在电脑里,按遥控器键learn remote没有出现PULSE。
    还有用http://winlirc.sourceforge.net/audioreciever.html里面介绍声卡的MICPHONE做法,也不成功,按遥控器键出现的是数据无法连接。
    请大侠帮忙,本人万分感谢!可电130778626XX(深圳)或QQ292674443联系。

  13. 上面主題「使用麥克風輸入埠接收紅外線訊號」提供的電路圖,在DATA與GND之間,並聯一顆電容即可將38K載頻濾掉,轉成數位訊號。( 電容不要太大,以免DATA變樣 )

  14. 請問一下我買了一顆MIR053白色一顆MPT051藍色,我一直搞不清楚那顆是發射哪顆是接收,因為使用起來怪怪的,我2顆分別都串一顆LED做顯示,理論上是接受的那顆LED會亮才對,但好像是相反的狀況?? 🙁

    1. 我手邊沒有光電晶體,不過印象中,光電晶體在受光前後的阻抗值變化很大。你可以用電錶測量它的阻抗,如果是光電晶體,它在暗處的阻值應該是數百K歐姆;若用電燈或遙控器照射它,阻值應該會降到數K歐姆。

      have fun!
      jeffrey

  15. 您好

    請問接收的原理是否為

    使用FM6038之類的接收器

    如果不是用RS232來做接收,而採用麥克風孔座接收的話

    解出來的訊號應該只有原來的一半是吧?(因為只有一個聲道做接收)

  16. HI 我想請問一下製作紅外線遙控發射器 那接上電腦之後 電腦內要用什麼軟體來控制他的發射訊號? 如果我不遙控Roomba 我想遙控其他東西 是用什麼程式呢?

  17. 請問一下 那個比較安全的紅外線發射電路,電晶體的基極接了兩顆二極體, 請問它的作用是什麼呢? 謝謝

    1. 應該只是用於偏壓,一個1N4148的順向電壓是0.7V,串接兩個約1.4V。

      thanks,
      jeffrey

  18. 趙老師您好!

    互動第二版書上 16-39 有說繼電器不能控制電視, 那我需要控制電視的電源, 有什麼方法可以使用呢?
    麻煩老師了,謝謝!!

    1. hi kenny:

      我指的是一般的小型繼電器(常見的Arduino繼電器模組都是),不能用於控制大型電器。

      若要控制電視機,假設它的消耗功率是250瓦,根據公式:

      W = V × I

      可得知,此電視機的消耗電流約2.2A(註:250W/110V),為了安全起見,建議採用110V 5A規格的繼電器。

      至於此繼電器的電晶體驅動電路的電阻計算方式,請參閱書本16-39頁說明。

      thanks,
      jeffrey

  19. 老師您好,我在”超圖解Arduino互動設計入門”,紅外線遙控章節裡,我使用冷氣的遙控器(TECO),但使用光碟程式燒入後,序列部視窗找不到可以用的例如sony等等,但是只能使用row,學生找出數字碼,運用在row中,但卻無法控制冷氣,是有甚麼地方出錯呢?
    煩請老師給予學生一些方向來解決,謝謝老師!

  20. 老師你好

    最近在使用紅外線來測試 遇到到問題是

    Arduino 板上同時有發射和接收模組,測試當中接收可以收到數值,發射也是可以正常發射,不過每當使用發射完後,接收都會沒反應,只好再將板子Reset…

    1. hi ted:

      也許你可以加上判斷條件測試:在發射信號階段,先暫停接收功能。

      thanks,
      jeffrey

  21. 老師抱歉又打擾了
    請問我想用arduino做出類似中繼站的東西
    讓arduino具備接收信號 做出相對應動作後 再轉發出去給下一個arduino
    但是發現只要加了接收的部分 信號就發射不出去
    請問老師這個是哪裡出問題了呢?
    謝謝老師

    1. 我不太確定所謂的「信號發射不出去」的問題。我猜想是程式的問題,你不妨讓程式接收到紅外線訊號之後,輸出一份到序列埠監控視窗,查看信號是否正確、完整;接收訊號之後,或許可以先暫停一段短短的時間(建議用比較時間差的方式,不要用delay()),確認所有信號都接收到了,再轉發出去。

      thanks,
      jeffrey

  22. 老師那請問有辦法把irrecv.enableIRIn();這個函式關掉嗎
    或是跟他相反的函式
    這樣問不知道會不會很蠢哈哈哈
    謝謝老師

    1. 紅外線收發器只是傳遞訊息,解讀訊息需要透過微控器。你可以使用Arduino控制板來達成。

      thanks,
      jeffrey

  23. 請問老師現在還能找到「HttpIrc伺服器軟體(PHP的程式框架)」的程式碼嗎?文章中的鏈結已經失效了。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

Related Posts

Begin typing your search term above and press enter to search. Press ESC to cancel.

Back To Top