2011年3月27日 星期日

Arduino 筆記 - Lab21 用繼電器控制 12V 風扇

Arduino 腳位的電流很小 (小於 40 mA),當你想要切換大電流或大電壓設備 (例如燈泡、馬達或大風扇) 的開關時,會需要一個中繼的電路 (intermediate circuit),最簡單的辦法是使用繼電器。

實驗目的

練習用繼電器控制 12V 風扇。

前提

我假設你已經知道繼電器是什麼,而且也會查 datasheet 看懂繼電器的接線圖。 如果你還不認識繼電器,建議你在做這個實驗前先看一看「繼電器簡介」一文,。

材料
  • 麵包板 x 1
  • Arduino 主板 x 1
  • 直流 12V 風扇 x 1
  • 5V 單刀雙擲 (SPDT) 繼電器 x 1
  • 1N4004 整流二極體 x 1
  • 2n2222 NPN 電晶體 x 1
  • 按鈕 (pushbutton) x 1
  • 10k 歐姆電阻 x 1
  • 1k 歐姆電阻 x 1

我用的是 RAS-0515 小型繼電器,它的線圈電壓是直流 5V,開關電流與電壓為 15A/120VAC (24VDC), 10A/250VAC:

image 
▲ RAS-0515 小型繼電器

RAS-0515 的接線圖如下 (翻過來從底部看):

image 
▲ NC 是 Normal Closed, NO 是 Normal Open,而 COM 是 Common

如果你用比較大的繼電器 (> 12V),記得把 2n2222 換成耐壓較大的 TIP101/TIP102 之類的電晶體。

接線

底下這張圖是繼電器的一般接法,在你開始進行這個實驗的接線前,可以多看幾遍這張圖以加深記憶:

image
▲ 控制繼電器的電路

我用的 RAS-0515 是 5V 小型繼電器 (上圖是 12V 繼電器),所以繼電器線圈的電源只要從 Arduino +5V 拉出即可。接著開始進行接線。

1) 參考下圖連接繼電器、二極體與電晶體:

image

其中:

  • 繼電器線圈一端接 +5V,線圈的另一端 (藍線) 接到 NPN 電晶體的集極 (Collector)
  • 把整流二極體並聯到線圈上,注意整流二極體有方向性,有標示的一端要朝向電源
  • NPN 電晶體射極 (Emitter) 接到 GND,然後基極 (Base) 串聯一顆 1k 電阻連接到 Arduino 的 pin 13

為了你的方便,我把 NPN 電晶體跟繼電器的端子 (接腳) 做個標示,如下圖所示:

image

2) 接著進行風扇的連接:

image

其中:

  • 風扇正極 (紅線) 接到繼電器 NO 端,負極 (黑線) 接到 GND
  • 從外接的 12V 電源正極拉一條線到繼電器的 COM 端

外接 12V 電源要怎麼取得呢?很簡單,只要找一下家裏電腦週邊產品的電源供應器,確認是 12V 的即可。

image
▲ 電源轉換器

3) 最重要的部份都已經接好了,剩下的步驟只是接一顆按鈕。這顆按鈕的目的是當作風扇的開關,到時只要按一下就開風扇,再按一下就關風扇:

image 

參考上圖,把按鈕的一支腳接到 +5V,另一支腳接到 pin 2 同時接一個 10K 電阻連到 GND,這樣接線的工作就完成了。

程式

底下就是這支用繼電器控制風扇的程式 (RelayAnd12VFan.pde):

程式非常簡單,應該不需要多餘的解釋。把程式上傳到 Arduino 後,當你按下按鈕時,風扇會打開,再按一下風扇就會關閉。繼電器打開的時候會發出「嗒」的一聲,代表繼電器有正常作動。

你可以打開 Serial Monitor 觀察,看看程式的執行是否順利:

image  
▲ Serial Monitor 上會顯示繼電器的狀態

用紅外線遙控器遙控風扇

接下來把電路稍微做個修改,我們來把按鈕換掉,改成用紅外線遙控器來遙控風扇。

首先,先把按鈕 (及相關的電阻) 移除,接著照下表把紅外線接收器跟 Arduino 連接起來。紅外線接收器建議使用 38 kHz 的 (如 TSOP2438,TSOP4438, PNA4602, FM-8038TM2-5DN),因為大部份遙控器用 38 kHz 的比較多。

紅外線接收器接腳 Arduino 接腳
Vcc (+ 或 V+) 接到 +5V 電源
GND (-) 接到 GND
Vout (或 OUT) 接到 pin 2。你可以接到其它 Digital pin,但程式要配合修改

接線圖如下:

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

底下就是這支用紅外線遙控器遙控風扇的程式 (irRelayAnd12VFan.pde):

程式還是一樣簡單,相信你一定看得懂。唯一要注意的,因為紅外線接收器會把訊號反向,所以 0 代表有收到訊號,因此在檢查接收器有沒有收到紅外線訊號時,必須判斷 irStatus 是不是 0,如果是的話,就代表有收到紅外線訊號。紅外線接收器的狀態儲存在 irStatus 變數裏。

示範影片

▲ 紅外線遙控風扇,按任意鍵均可開關風扇
結語

不只可以開關 12V 風扇,用繼電器也可以控制像大燈泡、馬達、電暖爐、電風扇等家電設備,但是要提醒您,在控制大電力設備,尤其是使用交流電的時候,要特別注意每個環節,因為如果線路沒有正確接好,通電的時候,輕則把 Arduino, 繼電器和電晶體等設備毀損,重則可能會引起火災。因此,一定要非常小心。

延伸閱讀

42 意見:

悸動 提到...

不好意思,目前我不太懂繼電器的腳位(看完繼電器簡介還是有不太懂)

我的繼電器型號: OUAZ-SS-105L (5伏特)

哪裡可以查看腳位圖呢?

想用在燈泡去做控制

coopermaa 提到...

hi, OUAZ-SS-105L datasheet 在這裏:
http://www.datasheet-found.com/Datasheet.jsp?pn=OUAZ-SS-105L%2C900

你繼電器腳位哪邊看不懂呢?

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

不好意思~

最近2個月太忙了,沒有注意到..真抱歉

Q:繼電器接到8951的配線要如何接

coopermaa 提到...

8951 界接繼電器的接法應該是一樣的,請參考 "接線" 這個段落的圖:

悸動 提到...

那您有MAIL嗎?

我寄照片給您過目看看

coopermaa 提到...

我的 email 是: coopermaa77 gmail.com

Wei Chieh Chen 提到...

不好意思,我有些問題想請教
我買來的繼電器上面已經有板子了,這樣的話接法是不是也不同了呢?
照片寄到您的email了 謝謝

Unknown 提到...

請問:我將【接線】部分的電路接好,然後把微控端換成跳線,單獨接5V/GND。
接到5V時,繼電器動作,切到N.O.
但我接到GND後,卻沒切回N.C.
請問可能是何種問題呢?
--
另外我試過另一種接法:
B端改為5V→R→B端
再來將E端改為控制端,接LOGIC 1/0
這樣的接法就有繼電器的切換效果
但如果控制端是從uC送出不知何不合適
因為切到LOGIC 0時,電流應該會往LOGIC 0方向送,會不會有電流貫道uC的問題..

cooper maa 提到...

你把微控換成直接接 5V/GND
接 5V 可以順利讓繼電器銜鐵吸到 NO
接到 GND 是指什麼?
切到 NO 後,如果直接切斷 5V 的電繼電器會跳回 N.C 嗎?

你把 B 的控制端改到 E ?
好像有點不合常理...
我不知道電晶體可以這樣玩
這樣會動嗎?

Unknown 提到...

實在很不想承認..我接錯了><
真是抱歉XDD

cooper maa 提到...

沒關係的
這種傻事我幹過無數遍了,呵~
還好,現在 uC 心臟都很強,沒被我電壞

桃園法拍屋 提到...

請問版主:
您提供的電路,電晶體B點只有0.5V的訊號可作動嗎!零件需改規格嗎!謝謝
想DIY遙控開關,但遙控主機輸出訊號僅0.5V,無法推動電晶體!

coopermaa 提到...

我不是學電子的,這問題考倒我了
倒是 2n2222 datasheet 裏只有寫 Max voltage,而 low voltage 卻沒有提到,說不定只要有一些電壓不同還是辦得到,因為我認為電流有在流動電晶體應該會動才對
請問你遙控主機 GND 有跟電晶片的 GND 接在一起嗎?

桃園法拍屋 提到...

遙控主機 GND 有跟電晶體的 GND 接在一起,但是遙控主機輸出訊號僅0.5V推不動晶體,像是有低壓作動的限制說

桃園法拍屋 提到...

謝謝版主:
利用您的教學已完成囉~~
晶體有低電流限制,主機的訊號輸出僅DC0.5v(電流不會量),但串個水銀電池讓電壓上升就可推動電晶體完成繼電器作動了~~
太感謝囉

coopermaa 提到...

不客氣,其實我也沒幫什麼忙啊。:)

Beordle 提到...

我是大陸高中畢業生,正在看您的blog。我想有幾個問題要問一下,那個電晶體是防止反向的電壓嗎?我可不可以不要它呢?又會有什么后果呢?

coopermaa 提到...

你是說電晶體還是二極體?

Beordle 提到...

老長時間沒看您的博客,沒發現回復。但是訂閱了您的RSS。原來電晶體就是大陸“三極管”啊。。。三極管的作用我到知道。我是說那個而二極體"二極管"可以可以不要呢?謝謝您啦

coopermaa 提到...

保險起見 (避免燒錄電晶體 "三極管",那個二極體 "二極管" 留著會比較安全

你可以參考一下這裏的討論:
http://gcbbs.digitw.com/phpbb2/viewtopic.php?f=1&t=2882&hilit=

Beordle 提到...

呵呵,謝謝您啦

coopermaa 提到...

歡迎常來,或是到 Openlab Taipei FB 一起交流:

https://www.facebook.com/groups/openlab.taipei/

cropse 提到...

不好意思請問一下
如果想要控制大電壓(20~30v)低電流(200~300ma)
但是想要控制轉速或亮度要怎麼辦呢?

coopermaa 提到...

交流電嗎?
也許可以用 TRIAC, see:
http://www.youtube.com/watch?v=YREOjmNQf84&feature=plcp

cropse 提到...

不好意思我的說法可能挺含糊的
簡單來說我想要用arduino的低電壓PWM達到控制大功率的LED調光
因為LED電壓本身需要另外使用電供
目前考慮幾種方法
1.L293D
2.固態繼電器
3.TRIAC
不知道哪種方法比較適合我呢???

柏毅吳 提到...

Dear Cooper Maa
不好意思,我想請教一下,假如我想要把按鈕和紅外線控制風散的部分變成DHT11的溫度感測器,溫度高於某數起動風散,低於則關閉風散,請問也是用繼電器的方法嗎,感謝回覆。

Cooper Maa 提到...

你只是換 Sensor 把紅外線換成溫度感測器,風扇控制的部不受影響

EagleCross Steven 提到...

我想用IR遙控來控制馬達...我已經解碼了, 可是不知道如何讓不同的ircode來控制前進,後退與左右~請救救我...謝謝~

上日下月 提到...

2n2222 可換成C9013 NPN嗎?

Cooper Maa 提到...

@冐(上日下月),應該可以

Cooper Maa 提到...

@EagleCross Steven,

你已經會解碼,那很簡單啊

if (irrecv.decode(&result)) {
if (result == keyForward) {
motorForward();
else (result == keyBackward)) {
motorBackward();
} else
...
}

照這邏輯寫應該就行了

賴東谷 提到...

若我想要寫給12V一個PWM訊號,是用relay嗎?還是其它開關可以寫入PWM

柏毅吳 提到...
作者已經移除這則留言。
Kevin Wang 提到...

除了relay外, MOSFET也是個選擇喔. 兩者都有可控制開關的特性.

另, 這裡有人熟USB的控制嗎? 我想從電腦經過USB來控制MOSFET/relay開關(沒經過微控制器), 但又希望能不用另裝USB-to-serial(RS232)轉換器. 目前整理出兩個方向. 1)找方法從電腦控制USB的5V電源(沒找到). 2)解析USB的傳輸協定來扭曲操作來控制USB裡的data+或data-的pin.

不知道有高手能給點意見嗎?

柏毅吳 提到...
作者已經移除這則留言。
Cooper Maa 提到...

@Kevin Wang

謝謝你的分享
不經過微控制器控制 USB 的 5V 電源?
如果用 RS232 好像是可以的
但 USB 辦得到嗎?

Yew Tze Ee 提到...

hi Cooper Maa,
我想学Arduino,要从哪里开始?

Cooper Maa 提到...

hi,
如果不嫌棄的話,可以從我部落格上的「Arduino 入門教學」開始。

另外,這些教學影片也不可能錯過:

http://coopermaa2nd.blogspot.com/2011/12/arduino-video-workshop.html
http://coopermaa2nd.blogspot.tw/2012/11/arduino-starter-kit.html
http://www.youtube.com/watch?v=fCxzA9_kg6s

wang bibi 提到...

你好想請問一下,如果想讓風扇項自然風一樣,慢到快一直循環,程式中應該加入怎樣的指令呢?

Lee James 提到...
作者已經移除這則留言。
Cooper Maa 提到...

@wang

可能要用 PWM 控制風扇轉速喔
不過,控制轉速不可以用繼電器,可以用 TIP-122 電晶體,底下有參考資料:

http://arduino-for-beginners.blogspot.tw/2011/03/controlling-12v-dc-motorfan-with.html