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 則留言:

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

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

    哪裡可以查看腳位圖呢?

    想用在燈泡去做控制

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

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

    回覆刪除
  3. 作者已經移除這則留言。

    回覆刪除
  4. 不好意思~

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

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

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

    回覆刪除
  6. 那您有MAIL嗎?

    我寄照片給您過目看看

    回覆刪除
  7. 我的 email 是: coopermaa77 gmail.com

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

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

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

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

    回覆刪除
  11. 實在很不想承認..我接錯了><
    真是抱歉XDD

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

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

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

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

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

    回覆刪除
  17. 不客氣,其實我也沒幫什麼忙啊。:)

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

    回覆刪除
  19. 你是說電晶體還是二極體?

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

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

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

    回覆刪除
  22. 歡迎常來,或是到 Openlab Taipei FB 一起交流:

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

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

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

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

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

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

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

    回覆刪除
  29. @EagleCross Steven,

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

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

    照這邏輯寫應該就行了

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

    回覆刪除
  31. 作者已經移除這則留言。

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

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

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

    回覆刪除
  33. 作者已經移除這則留言。

    回覆刪除
  34. @Kevin Wang

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

    回覆刪除
  35. hi Cooper Maa,
    我想学Arduino,要从哪里开始?

    回覆刪除
  36. 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

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

    回覆刪除
  38. @wang

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

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

    回覆刪除

注意:只有此網誌的成員可以留言。