2016年4月26日 星期二

樹梅派電源控制開關

一般樹梅派在使用Micro USB介面當作電源輸入時,當Pi執行關機指令(shutdown -h now)後電源還是會持續供電,前一陣子在網路上看到了一個關於樹梅派控制電源的電路,該電路實作結果有點類似PC上的ATX功能,在執行Pi關機後會自動把電源斷電以達到省電的效果。該產品在官網中售價為15歐元約台幣5百多。
本文則是利用該作者所公開的電路圖在所有零件成本不到台幣百元情況下利用洞洞板手工搭棚達到相同功能。



樹梅派一般常見控制電源方式有下列幾種方式:
1.在基板上找到Run這兩個洞並焊上兩根排針,只要將這排針裝個無段開關樣就有跟一般PC一樣有RESET的功能。
2.使用系統的看門狗(Watchdog),當系統出現當機、過熱或是指定的條件成立時就會自動重新開機。這也是一般在確保服務不中斷最常採用的方法。
3.利用GPIO做一個關機功能的開關,這個方法是利用誠是在背景監測一個GPIO動作,當按下一個按鈕就執行關機指令。這種方式可以在一些擴充版(shield)上經常看到。
4.一個完整的開/關電源開關,這個就是本文的主題。我們利用一個簡單的電路來控制電源在關機後的一段時間進行斷電。

電路:

上面電路完全參考 Adding an On/Off switch to your Raspberry Pi 這篇文章,其相關電路圖及電路板的Gerber(底片)檔案可在這裡下載
https://www.pi-supply.com/downloads/

零件表(BOM):

上圖的零件表則是在台中電子街就地取材購買,並非原廠建議的零件表。


完成品:


電路動作:
整體是利用達靈頓延遲電路來驅動一個繼電器做電源的開/關。達靈頓放大器在這電路的功用,主要為放大電流以驅動繼電器,並作繼電器負載匹配用。

1.當繼電器處於關閉狀態時,5V的輸入電壓會將電容進行充電(此時電容充飽電壓約2.4V)。
2.當按下ON按鈕後,此時繼電器會切換至電源導通。同時如果再沒有將pin接到樹梅派的GPIO情況下,電容會漸漸放電大約兩分鐘左右(電容會從2.4V漸漸到1.2V)將到達無法驅動達靈頓電路的電壓時,繼電器會回復到初始裝況,也就是段開電源。
3.接著我們將電路板的兩個針腳接到樹梅派的GPIO上,
以本文範例是:
電路板Pin1--->樹梅派Pin37 ,這裡PI會偵測是否按下soft off按鈕,如果按下按鈕則進行Pi關機動作。
電路板Pin2--->樹梅派Pin38 ,這裡的PI會給一個高電位(3.3V),主要作為:
   a.點亮LED使其確認動作無誤,
   b.提供達靈頓電路驅動繼電器,
   c.將電容維持充電狀態。
4.當Pi關機後,Pi此時會將原先提供給電路板上Pin2的電壓切換的Low電位,此時電路板上的電容開始放電大約兩分鐘左右就會進行斷電動作。
5.如果要再次啟動Pi的話,按下電路板上的ON按鈕既可。

再延遲時間部分,如果搭配著前面所述的 Watchdog 功能,是可以達到重新啟動的功能,如果要調整延遲時間的話可以更換220μF電容大小來達到需求,越小的電容值延遲時間越短;反之越長,相同容量不同廠牌也會因為漏電流的不同而有不同延遲時間。
另外,該網站作者建議主板上的OFF按鈕非不得已盡量不要使用,一般會影響到Pi上面的SD卡資料如果經常無預警的斷電可能會造成SD卡上的資料損毀。

程式碼:
要達到類似ATX開關機功能,在上面的電路還是需要寫個程式功能才會達到完整的功能。
此電路的作者提供了兩種方法,一種是Interrupts(中斷)方式;另一種則是Loop(無窮迴圈)方式。
兩者目的相同、使用的是python語言。差別地方在於採用中斷的方式是即時偵測事件發生(按下按鈕),該作者也是建議用這個方法但我在實作過程中問題也不少;
迴圈的方式則是每一秒鐘偵測一次事件發生,以下是程式碼內容:
在pi的家目錄下/home/pi 建立一個目錄:
mkdir PiSupply
cd PiSupply
用編輯器編譯一個檔名為softshut.py內容挑選下列兩項比較沒問題的項目:
======================================================================
Interrupts(中斷)方式程式碼:
from subprocess import call
import RPi.GPIO as gpio

# Define a function to keep script running
def loop():
    flag = 1
    while (flag): var=1

# Define a function to run when an interrupt is called
def shutdown(pin):
    gpio.output(38, gpio.LOW)
    print('System power-off ....')
    call('halt', shell=False)

gpio.setmode(gpio.BOARD) # Set pin numbering to board numbering
gpio.setup(37, gpio.IN) # Set up pin 37 as an input
gpio.setup(38, gpio.OUT, initial=gpio.HIGH)
gpio.add_event_detect(37, gpio.RISING, callback=shutdown, bouncetime=200) # Set up an interrupt to look for button presses

loop()

======================================================================
Loop(無窮迴圈)方式程式碼:
import RPi.GPIO as GPIO
import time
import os

GPIO.setmode(GPIO.BOARD) # Set pin numbering to board numbering
GPIO.setup(37, GPIO.IN) # Setup pin 37 as an input
GPIO.setup(38, GPIO.OUT, initial=GPIO.HIGH)
while True: # Setup a while loop to wait for a button press
    if(GPIO.input(37)): # Setup an if loop to run a shutdown command when button press sensed
        GPIO.output(38, GPIO.LOW)
        print "System power off ..."
        os.system("sudo shutdown -h now") # Send shutdown command to os
        break
    time.sleep(1) # Allow a sleep time of 1 second to reduce CPU usage

上述程式兩者選擇其一即可,可以用下列指令進行測試:
sudo python /home/pi/PiSupply/softshut.py

程式撰寫完後務必確認程式沒問題,不然當程式一開機執行後立刻會進入關機模式,到時候會很麻煩!必須要在另外Linux系統下掛載才能進行修改,這對於Linux不熟悉的話下場將會是重新安裝系統。
接著按照下面步驟將讓程式在一開機就執行。
用nano或vi等編輯軟體編輯/etc/rc.local
sudo vi /etc/rc.local
在最後一行加入:
python /home/pi/PiSupply/softshut.py
exit 0

然後存檔,重新啟動後這個程式就會自動執行了。(再次提醒務必確認程式沒問題!)

程式碼除了python語言外,也可以使用自己習慣的程式語言來撰寫,主要是針對電路板上的兩支Pin腳進行控制,Pin1偵測按鈕的事件,Pin2程式執行時給高電位,一旦Pin1產生事件則Pin2給低電位然後呼叫系統執行關機指令如此即可。

後記:

經常可以看到達靈頓電路相關應用這算是高中職電子學或基本電學上的教材,當然網路上搜尋也可以得到許多的相關資料。
樹梅派的GPIO輸出電流大概在 2mA 到 16mA ,由於達靈頓電路其中一個特色就是電流增益,因此如果有裝置需要比較大的電流來驅動時就可以應用上了。
這邊的範例使用的電晶體是BC548,在台中電子街一顆3元如果手上沒有這顆只要用NPN的電晶體兩顆也可以達到這樣的功能。
其他比較貴的零件就是5V繼電器了,這顆我買的型號是LU-5價格是25元其接腳圖如下:

如果使用其他型號繼電器的話得先確認一下接腳。至於電容容量部分影響到的是延遲時間,這部分我沒花時間進行測試如果要延長/縮短延遲時間就得要自己測試了。其他部分的零件就沒啥特別了。另外,再三叮嚀 softshut.py 這支程式要多測試幾次,沒問題再寫入 rc.local 不然出問題會很麻煩!!

一直以來我在這個部落格幾乎沒有分享有關電路的教學,這次看到了這個電路覺得十分有趣加上全部買齊的零件不到百元然後就是找出無價的DIY樂趣,有興趣的同好可以玩玩試試看!!


參考:
1.Pi Supply Switch – On/Off Power Switch for Raspberry Pi
https://www.pi-supply.com/product/pi-supply-raspberry-pi-power-switch/
2.Adding an On/Off switch to your Raspberry Pi
http://www.raspberry-pi-geek.com/Archive/2013/01/Adding-an-On-Off-switch-to-your-Raspberry-Pi#article_f5
3.Pi Supply Switch v1.1 Code Examples
https://www.pi-supply.com/pi-supply-switch-v1-1-code-examples/
4.電路圖
https://www.pi-supply.com/downloads/

==============延伸閱讀=====================
1. Raspberry Pi 第一次接觸
http://cheng-min-i-taiwan.blogspot.tw/2013/02/raspberry-pi.html

2.Raspberry Pi 網路設定
http://cheng-min-i-taiwan.blogspot.tw/2013/02/raspberry-pi_23.html

3.Raspberry Pi 應用之Windows檔案伺服器
http://cheng-min-i-taiwan.blogspot.tw/2013/02/raspberry-pi-windows.html

4.Raspberry Pi 應用之DLNA影音伺服器
http://cheng-min-i-taiwan.blogspot.tw/2013/02/raspberry-pi-dlna.html

5.Raspberry Pi 硬體控制-- Python 語言篇
http://cheng-min-i-taiwan.blogspot.tw/2013/04/raspberry-pi-python.html

6.Raspberry Pi 硬體控制-- C 語言篇
http://cheng-min-i-taiwan.blogspot.tw/2013/04/raspberry-pi-c.html

7.Raspberry Pi 整合 GPS 模組教學
http://cheng-min-i-taiwan.blogspot.tw/2014/03/raspberry-pi-gps.html

8.Raspberry Pi 2 Model B 使用心得
http://www.cheng-min-i-taiwan.blogspot.tw/2015/02/raspberry-pi-2-model-b.html

9.Raspberry Pi 藍牙4.0應用之iBeacon 發射器
http://www.cheng-min-i-taiwan.blogspot.tw/2015/03/raspberry-pi-40ibeacon.html

10.Raspberry Pi安裝MQTT之應用 -- Android訊息推播
http://www.cheng-min-i-taiwan.blogspot.tw/2015/03/raspberry-pimqtt-android.html

11. Raspberry Pi安裝MQTT之IoT應用 -- Android示範
http://cheng-min-i-taiwan.blogspot.tw/2015/03/raspberry-pimqttiot-android.html

12.Raspberry Pi 3 Model B 使用心得
http://cheng-min-i-taiwan.blogspot.tw/2016/03/raspberry-pi-3-model-b.html

13.樹梅派電源控制開關
http://cheng-min-i-taiwan.blogspot.tw/2016/04/blog-post.html

沒有留言:

張貼留言