自製紅外線遙控接收與發射器
文∕趙英傑
隨著寬頻網路、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本身的紅外線埠)的遙控裝置。這項商品似乎已經停產了,外觀如下:
上圖取自Code Project網站的C# Remote Control using the Audio Port這篇文章,在該文的讀者回應中有人提出簡易的相容電路。此外,也有人運用這個裝置將iPod變成遙控器…只是看起來不是很好用…把紅外線訊號轉錄成MP3格式後,再透過Flash設計遙控器的操作介面並播放紅外線聲音訊號,不是更好用且更酷嗎 🙂
您好, 提供您一點通訊原理的觀念
電腦上的聲音訊號處理電路的左聲道跟右聲道所使用的頻帶,在頻譜上來看”都是”落在20Hz~20KHz之間,就算你把它們相加,它所能處理的訊號還是只能在20Hz~20KHz之間喔,並不會因此就變成40kHz.
如果您想讓聲音訊號處理電路接收38kHz的紅外線遙控的頻率,只能透過調變技術把38kHz的訊號降到20kHz以下. 不過,現今通用的38kHz紅外線訊號是”數位的”,在頻譜上來看可能會帶有20kHz以下的訊號,可是這訊號是不是我們想要的可能就要透過示波器來看看才知道了,我想多半是不正確的吧.
hi FlameMkIII:
當您把一個訊號,往左、右聲道輸出,並錯開一點時間差,再將兩個訊號合併之後,就不只是20KHz,這就是 Total Remote 產品可以將一般的聲音訊號,轉換成紅外線遙控所需的 38KHz 頻率的原因。
thanks,
jeffrey
老師-請問你一下…音頻是不是可透過某些儀器傳送在借由電腦,手機,定位功能或網路訊號甚至wifi,紅外線收發器,轉換音頻,這樣是不是就能遠端發 送或接收了
hi 鐵男:
可以,但其實不必使用迂迴法…紅外線訊號本身就是一連串0和1數位信號,可直接透過Wi-Fi或藍牙傳送,不用先轉換成聲音。
轉換成聲音只是為了直接用耳機孔輸出紅外線訊號。
thanks,
jeffrey
那就是我所說的調變技術, 經過一個乘法電路來讓這兩個20kHz的訊號相乘就能變成40kHz, 我想說的是單純的相加是沒辨法的
那應該不是乘法電路,從一端輸出訊號,另一端則是在相隔一個週期之後,再輸出訊號,兩者做 OR 合併,即可得到兩個週期的訊號。
它所說的是相隔半週期, 也就是相位差π(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啊
它其實是利用LED的二極體的特性, 來把弦波的下半週給翻上來就會得到40kHz的訊號了, 一個LED發出上半週的訊號, 一個LED發出下半週的訊號, 那麼你在接收端收到的就是40kHz的訊號了
原來如此,非常感謝!所以其實也不需要乘法電路囉?
剛剛想到,如果是相同的正弦或餘弦波形,相隔半個週期再予以合成,波峰和波谷才會相互抵銷變成直流。
沒錯, 波峰跟波谷會互相抵消變成直流, 所以我才會覺得奇怪
以它這個設計原理來說連乘法電路都可以省了, 就只是個倍頻而已, 跟橋式整流電路有點像
不過,它還是只能送不能收呀, 你要拿來收的話還是須要乘法電路把載波頻率降下來
或是除頻器也可以
有意思,剛剛google了一下,發現Mobile01網站已經有大大提供Total Remote軟體(軟體本身應該是免費的),還有仿製Total Remote發射器的電路:
http://www.mobile01.com/topicdetail.php?f=129&t=81911
真想馬上衝到電子街買材料組裝看看 😆
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者 詳細解說一下各個細節…
可能大家都已經知道了,不過還是回一下 (兩年前的文了 XD)
電路圖上面那顆TSOP1738跟6038LM一樣內含38kHz解調變的功能,所以他data腳位輸出的已經是解調過的編碼訊號了。一般protocol來講,編碼的每個bit長度大概都有1ms以上,所以頻率只會用到1kHz左右,轉成音頻來錄是OK的~
hi Dabinn:
非常感謝您的說明。
thanks,
jeffrey
请问大侠,为什么我按照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联系。
上面主題「使用麥克風輸入埠接收紅外線訊號」提供的電路圖,在DATA與GND之間,並聯一顆電容即可將38K載頻濾掉,轉成數位訊號。( 電容不要太大,以免DATA變樣 )
非常感謝大大提供的資訊,我改天試試 😎
thanks,
jeffrey
請問一下我買了一顆MIR053白色一顆MPT051藍色,我一直搞不清楚那顆是發射哪顆是接收,因為使用起來怪怪的,我2顆分別都串一顆LED做顯示,理論上是接受的那顆LED會亮才對,但好像是相反的狀況?? 🙁
我手邊沒有光電晶體,不過印象中,光電晶體在受光前後的阻抗值變化很大。你可以用電錶測量它的阻抗,如果是光電晶體,它在暗處的阻值應該是數百K歐姆;若用電燈或遙控器照射它,阻值應該會降到數K歐姆。
have fun!
jeffrey
請問是否有可能做到紅外線無線麥克風組~~~ 😆
可能啊,紅外線通訊設備老早就存在了。
您好
請問接收的原理是否為
使用FM6038之類的接收器
如果不是用RS232來做接收,而採用麥克風孔座接收的話
解出來的訊號應該只有原來的一半是吧?(因為只有一個聲道做接收)
沒錯,如果用單聲道接收,誤差挺大的。
thanks,
jeffrey
請問一下,我是照著
http://www.mobile01.com/topicdetail.php?f=168&t=124928
裡面的圖做接收器
我也用此接收器錄好了我電視遙控器的LIRC碼
然後用耳機孔接2IRLED發射
現在已經有PAUSE了
只是完全無法遙控
WINLIRC也辨識不出我發射的訊號
請問可能是甚麼原因呢?
HI 我想請問一下製作紅外線遙控發射器 那接上電腦之後 電腦內要用什麼軟體來控制他的發射訊號? 如果我不遙控Roomba 我想遙控其他東西 是用什麼程式呢?
hi yao:
在Windows平台上,可以用WinLIRC來接收或發射紅外線控制訊號。
have fun!
jeffrey
請問LED形式的紅外線接收元件要怎麼和Arduino連接呢?
謝謝
hi eli:
請參閱13-14頁,光電晶體的電路:
thanks,
jeffrey
謝謝!!
請問一下 那個比較安全的紅外線發射電路,電晶體的基極接了兩顆二極體, 請問它的作用是什麼呢? 謝謝
應該只是用於偏壓,一個1N4148的順向電壓是0.7V,串接兩個約1.4V。
thanks,
jeffrey
趙老師您好!
互動第二版書上 16-39 有說繼電器不能控制電視, 那我需要控制電視的電源, 有什麼方法可以使用呢?
麻煩老師了,謝謝!!
hi kenny:
我指的是一般的小型繼電器(常見的Arduino繼電器模組都是),不能用於控制大型電器。
若要控制電視機,假設它的消耗功率是250瓦,根據公式:
W = V × I
可得知,此電視機的消耗電流約2.2A(註:250W/110V),為了安全起見,建議採用110V 5A規格的繼電器。
至於此繼電器的電晶體驅動電路的電阻計算方式,請參閱書本16-39頁說明。
thanks,
jeffrey
感謝老師的開示, 謝謝!!
老師您好,我在”超圖解Arduino互動設計入門”,紅外線遙控章節裡,我使用冷氣的遙控器(TECO),但使用光碟程式燒入後,序列部視窗找不到可以用的例如sony等等,但是只能使用row,學生找出數字碼,運用在row中,但卻無法控制冷氣,是有甚麼地方出錯呢?
煩請老師給予學生一些方向來解決,謝謝老師!
hi luo:
似乎不少人遇到遙控冷氣的問題,請參閱這一篇留言。
thanks,
jeffrey
老師你好
最近在使用紅外線來測試 遇到到問題是
Arduino 板上同時有發射和接收模組,測試當中接收可以收到數值,發射也是可以正常發射,不過每當使用發射完後,接收都會沒反應,只好再將板子Reset…
hi ted:
也許你可以加上判斷條件測試:在發射信號階段,先暫停接收功能。
thanks,
jeffrey
老師抱歉又打擾了
請問我想用arduino做出類似中繼站的東西
讓arduino具備接收信號 做出相對應動作後 再轉發出去給下一個arduino
但是發現只要加了接收的部分 信號就發射不出去
請問老師這個是哪裡出問題了呢?
謝謝老師
我不太確定所謂的「信號發射不出去」的問題。我猜想是程式的問題,你不妨讓程式接收到紅外線訊號之後,輸出一份到序列埠監控視窗,查看信號是否正確、完整;接收訊號之後,或許可以先暫停一段短短的時間(建議用比較時間差的方式,不要用delay()),確認所有信號都接收到了,再轉發出去。
thanks,
jeffrey
老師那請問有辦法把irrecv.enableIRIn();這個函式關掉嗎
或是跟他相反的函式
這樣問不知道會不會很蠢哈哈哈
謝謝老師
或者可以嘗試在發送信號之後,再執行 irrecv.resume()
thanks,
jeffrey
老師想請問一下,如果我只是要做燈的開關,這個收發器要怎麼改?
紅外線收發器只是傳遞訊息,解讀訊息需要透過微控器。你可以使用Arduino控制板來達成。
thanks,
jeffrey
請問老師現在還能找到「HttpIrc伺服器軟體(PHP的程式框架)」的程式碼嗎?文章中的鏈結已經失效了。
拍謝,請自行google。
thanks,
jeffrey