2011年3月23日 星期三

紅外線物體偵測 (1)

實驗目的

練習用紅外線接收器與發射器來實作紅外線物體偵測(Infrared Object Detection)。

紅外線物體偵測

我們在「用紅外線動作感測器(PIR Motion Sensor)控制 LED 的開關」一文中提到,紅外線感測器有分主動式和被動式兩種。紅外線動作感測器(PIR Motion Sensor)是屬於被動式的紅外線裝置,感應器本身不會發射紅外線光束,而另一種則是會發射紅外線光束的主動式紅外線感測器。主動式紅外線感測器常用於物體的偵測,例如自動沖水小便斗或感應式水龍頭,還有避障自走車等。

主動式紅外線感測器大概可分為「反射型」和「遮光型」兩種。如下圖所示,所謂反射型紅外線感測器,是把接收器與發射器並排,讓發射器不斷發出紅外線光束,當接收器收到反射過來的光線時,表示前方有物體或障礙物:

image 
▲ 反射型紅外線感測器

而所謂遮光型紅外線感測器,則是把接收器與發射器安置在兩端,兩者相對,發射器一樣不斷發出紅外線光束,當光線被遮擋時,就表示中間有物體或障礙物,如下圖所示:

image
▲ 遮光型紅外線感測器

準備材料
  • 麵包板 x 1
  • Arduino 主板 x 1
  • 38 kHz 紅外線接收器(如 TSOP2438,TSOP4438, PNA4602, FM-8038TM2-5DN) x 1
  • 發射波長為 940nm (nanometer, 奈米) 的紅外線發射器 x 1
  • 100 歐姆電阻 x 1
  • LED x 1
  • 單心線 x N
接線
  • 把紅外線發射器(IR LED)接到 pin 3,長腳(陽極)串接一顆 100 ohm 電阻接到 pin 3,短腳(陰極)接到 GND
  • 照下表把紅外線接收器跟 Arduino 連接起來:
紅外線接收器接腳 Arduino 接腳
Vcc(+ 或 V+) 接到 +5V 電源
GND(-) 接到 GND
Vout(或 OUT) 接到 pin 2。你可以接到其它 Digital pin,但程式要配合修改

image
▲ 有些紅外線接收器 GND 和 Vcc 是相反的,接線時請查閱你的 datasheet

實驗一:  利用紅外線反射偵測物體

接下來我們先來做第一個實驗,利用紅外線反射偵測物體。

利用紅外線反射偵測物體,在架設紅外線接收器與發射器的時候,接收器與發射器要並排,除此之外,另一個要注意的重點是,因為接收器很靈敏,所以要用個套管套住發射器(IR LED),讓光束往前直射,不然的話光束很容易受到其它物體反射而影響接收器的反應。如果手邊沒有套管,用黑膠布或捲紙把發射器包裹起來也是可以的:

image 

程式

底下就是利用紅外線反射偵測物體的程式(irObjectDetection.pde),在偵測到物體的時候,指示燈會閃爍:

比較微妙的地方是 tone(irLed, frequency); 這行指令,這行指令會一直產生 38 kHz 頻率的脈波 (Pulses)。我們在「控制蜂鳴器發聲」用過 tone() 指令,當時是 tone() 指令讓蜂鳴器發出不同音階的聲音。

如果你用的紅外線接收器很靈敏,即使把發射器用套管套住了,還是很容易收到從小角度透出來的光束的話,可以調整一下發射器的頻率,把頻率加或減 2~3 kHz 試看看。

示範影片

下一篇將進行第二個實驗「利用遮光偵測物體」。

21 意見:

芭蕉葉上聽雨聲 提到...

紅外線接收器對38KHz頻率比較敏感,若頻率增減2~3KHz,的確是會降低它的靈敏度, 相對的能偵測的距離也會縮短.

請問只有PWM pin才能發射指定頻率的脈波嗎?

Cooper Maa 提到...

從 tone.cpp 的程式碼看來,tone() 是利用 timer & interrupt 在控制 Pulses 的,所以應該是任何 pin 都可以。

BTW, 其實我們也可以自己寫程式發射指定頻率的脈波喔,方法可以參考「紅外線遙控電視機 (NEC IR) 這篇:
http://coopermaa2nd.blogspot.com/2010/02/nec-ir.html

芭蕉葉上聽雨聲 提到...

嗯~~的確是任何pin都可以發射脈波.

可以用來偵測距離的紅外線二極體和接收器是否有所限定?
我發現像TSOP2438,TSOP4438, PNA4602, FM-8038TM2-5DN這類的38kHz紅外線接收器,好像無法用來偵測距離?

Cooper Maa 提到...

我想偵測距離的感測器可能特別的晶片,像 TSOP2438 這類紅外線接收器功用好像不太一樣,我聽說是它有過瀘的功能,只有頻率在它的範圍內的才會收進來,而且有 demodulation (解調變)的功能。

偵測距離的接收器好像有個專有名詞,叫做 Proximity Sensor
另外,如果要偵測距離,超音波感測器也是一個方法

Cooper Maa 提到...

一般紅外線接收器都是三支接腳的,我在露天看到一個兩支接腳的紅外線接收器: http://goods.ruten.com.tw/item/show?21008132542693

不曉得你知不知道這種兩支接腳的接收器跟三支接腳的接收器有什麼差別? 它還蠻特別的,長像居然跟 LED 很像。不知道這種接收器要怎麼使用。

芭蕉葉上聽雨聲 提到...

我把這種二腳的紅外線LED電路圖EMAIL給您, 您應該就清楚它的功用了.

jack 提到...

您好
我發現如果不將Arduino以USB接上電腦,而是直接以9V的電池供電的話(也就是不跟電腦做任何連接),Pin13的LED會一直不停閃爍,無法執行偵測物體的這個程式,不知道您是否有遇到此類問題,或是知不知道該問題的解決方法,煩請您提供一些寶貴意見,謝謝您!

Cooper Maa 提到...

如果是吃 usb 的電會正常運作嗎?
你可以做個實驗,上傳 blink 程式,然後以9v電池或adapter 供電,看看 blink 程式會不會也有類似的狀況,確認一下看led不停閃爍是否為外部供電造成的

dg101 提到...
作者已經移除這則留言。
dg101 提到...

我紅外線頻率設38KHZ時一直0,8KHZ就會正常動作,請問是我的紅外線接收器壞掉了嗎

Cooper Maa 提到...

你是說設 38 kHz 一直是 0 而 8 kHz 會正常動作? 8 kHz 正常動作是說有物體時為 0,沒物體時就變成 1 嗎?

有一個要注意的地方,我試過的經驗,因為紅外線接收器很靈敏,所以一定要用套管套住發射器,讓光束往前直射,不然很容易收到偏光的影響!

dg101 提到...

謝謝,問題解決了,發現是電阻用太小的原因。

Cooper Maa 提到...

原來是電阻的關係。:)

Adam 提到...

哈囉您好,我照做後發現PIN13的LED燈會不斷地閃爍,我接連著把接收器拔掉、發射器拔掉、甚至全部的PIN角、VC、GND都拔掉LED還是會不斷閃爍,不知道是發生什麼問題呢?

Cooper Maa 提到...

這麼神奇?
那如果讓 arduino 斷電,或是重新上傳 blink 程式,pin 13 也是一樣會不斷地閃爍嗎?

Adam 提到...

blink之後正常運行。其實在兩三個禮拜前照著做的時候是可以正常運作的。但是在最近再次照著上面的程式碼和線路接發現接收器會非常非常的燙,於是試著將VC還有GND反接後(換了一顆接收器),變成不會燙了但也沒有反應。
然後我也有照著另一篇測試接收器型號的文章操作,但是一直收到unknown,但是後面的代碼會一直改變,拔掉接收器後也是一樣的情況。

Cooper Maa 提到...

會非常非常的燙就不正常了,怕是板子電路有受損
現在使用時,MCU 或 Regulator 會燙嗎?

Adam 提到...

你好,今天又做了測試,發現MCU和Regulator並不會發熱,將發射器和接收器拔掉後,收到的訊號還是0

Cooper Maa 提到...

我也不曉得是什麼問題,可能要現場看才知道

Adam 提到...

http://www.youtube.com/watch?v=EQdis5yeI8o

我把情況錄成影片,不知道這樣看得出問題在哪裡嗎?

Cooper Maa 提到...

拔掉發射器和接收器後,led 會不斷閃爍,合理的解釋是原接收器所用的腳位 pin 2 變成一根天線了
所以可能會 pick up 雜訊
你開著 Serial Monitor 看一下,等狀況出現時,觀察一下 Serial Monitor 裏 pin 2 的狀態,看看是不是 0 或是偶爾 1 偶爾 0

如果在接收器的 VOUT 接著提升電阻也許可以解決這個問題