在本課程中,我們將使用一塊適用於Raspberry Pi Model B+的看門狗板。沒錯,這是一個可以安裝在Raspberry Pi上的看門狗板!
看門狗是一種保護系統免受可能導致系統停止反應的軟體或硬體故障影響的裝置。首先,我們將應用程式在看門狗裝置上登記。看門狗在系統上運行後,該應用程式必須定期向看門狗裝置發送資訊。如果看門狗裝置在指定的時間內沒有收到此訊號,就會執行適當的行動以重啟機器或重新開機應用程式。
看門狗是一種監視系統是否正常運行的功能。
這次所用的Raspberry Pi Model B+看門狗板有一個內建程式,能夠提前監控GPIO,因此安裝非常容易。
用於Raspberry Pi Model B+的看門狗計時器板
該IC具有內建倒計時器負責監視Raspberry Pi的GPIO。Raspberry Pi上的軟體以固定間隔向GPIO發送脈衝訊號,以重置IC中的計時器。
如果Raspberry Pi發生錯誤,沒有發送脈衝訊號,看門狗上的倒計時器不會復位。然後,電路板上的IC將停止為Raspberry Pi供電並重啟供電,以重新啟動Raspberry Pi。
我們就是使用該看門狗板。雖然我寫的是“Raspberry Pi Model B +”,但是該板也適用於Raspberry Pi Model A+以及Raspberry Pi 2 Model B。在本課程中,我們使用的是Raspberry Pi 2 Model B。
如何使用Raspberry看門狗計時器 這篇文章(日語)描述了今天所用的看門狗板的詳細資訊。下文中的很多內容都會參考此文章。
與Sense HAT一樣,將看門狗插入Raspberry Pi的GPIO引腳即可。如果您想要固定電路板,讓連接更牢固,請使用Raspberry Pi螺絲和墊片,沒有問題。
如圖3所示,請用DC插頭將電源連至看門狗板。該DC連接器將為看門狗和Raspberry Pi主體供電。
以下兩點可能會令人困惑,所以我們事先澄清一下……
1. 請用看門狗板上的DC插頭提供5V電源。
就像如何使用Raspberry看門狗計時器中描述的那樣,應使用看門狗板上的DC插頭進行供電。這與用GPIO引腳為Sense HAT供電不同。
2. 切勿使用Raspberry Pi自身的電源
電源由看門狗的的DC插頭提供,不能用Raspberry Pi主機的電源(microUSB)供電。使用其他電源無法重啟Raspberry Pi,即使看門狗運行正常。
我費了一番苦功——多次變換電源——才搞清楚這個狀況!
檢查運行情況時,LED狀態指示燈應亮起。預設情況下,為了節能,LED是熄滅的,但是短接LED開/關跳線後LED會點亮。我用的短接跳針,圖片用的是短接跳線。
LED的點亮遵循以下三種狀態。如果只是看到數值(秒)描述,我們可能很難想像相應的效果,但是當LED閃爍時您會注意到明顯的差異。
每種狀態下的LED點亮情況:
對於本課程,我們將使用Raspberry Pi 2 Model B和帶有PIXEL的Raspbian Jessie(2016.11.25發佈)。
sudo apt-get update
sudo apt-get upgrade
將Raspbian寫入SD卡後,像往常一樣運行上述命令。
看門狗的運行情況如圖5所示。只是開啟電源並不會啟動看門狗。預設狀態“狀態LED每2.56秒閃爍一次”繼續。有關如何啟動看門狗的詳細資訊,請參考如何使用Raspberry看門狗計時器(日語)。相關內容位於頁面底部。
要配置Raspberry Pi,我們需要運行這樣一個程式:準備好啟動後,為監控埠(默認為GPIO 17)自動生成一個脈衝訊號。
這非常重要。執行此功能的來源程式如下所示:
該程式“每秒向GPIO 17輸出一次脈衝”。
為了與看門狗板對接,我們應自動啟動一個向該GPIO提供脈衝的程式。這樣做,即使Raspberry Pi重新啟動,您也可以自動繼續使用看門狗功能。
讓我們用這個程式啟動看門狗!
sudo nano blink17.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#!/usr/bin/env python import RPi.GPIO as GPIO import time LEDPIN = 17 GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) GPIO.setup(LEDPIN, GPIO.OUT) while True: LEDon = GPIO.output(LEDPIN, 0) time.sleep(0.5) LEDoff = GPIO.output(LEDPIN, 1) time.sleep(0.5) |
首先,將程式保存在一個資料夾中,然後用以下命令執行。
python blink17.py
由於看門狗在檢測到5個脈衝時啟動,因此在此程式中,執行5秒後,狀態LED每0.32秒閃爍一次。之後,如果超過5秒沒有脈衝,狀態LED會變為每0.08秒閃爍一次,且重啟自動執行。(在視訊中,該過程透過[Ctrl]+[C]強行終止)。
將看門狗程式設定為開機運行非常方便,因為程式即使在自動重啟後也能運行!
我們調整程式進行測試,處理時間僅設為30秒(因為如果這個時間太短,很難釋放cron,建議至少30)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
sudo nano blink17_30sec.py #!/usr/bin/env python import RPi.GPIO as GPIO import time LEDPIN = 17 SEC = 0 GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) GPIO.setup(LEDPIN, GPIO.OUT) while SEC < 30: LEDon = GPIO.output(LEDPIN, 0) time.sleep(0.5) LEDoff = GPIO.output(LEDPIN, 1) time.sleep(0.5) SEC = SEC + 1 print SEC |
接下來,在授予執行許可權後將其登記到cron。
sudo chmod 755 blink17_30sec.py
crontab -e
因為我們想在“啟動”時執行它,所以我們應指定“@reboot”。我在最後一行添加了以下內容。
1 |
@reboot python /home/pi/blink17_30sec.py |
重新載入cron並重新啟動Raspberry Pi。
sudo /etc/init.d/cron restart
sudo reboot
LED的閃爍頻率會非常直觀地告訴我們是何種狀態。
檢查完畢後,我們撤銷cron設定。介紹此功能時,可以透過cron更改要調用的程式,以繼續無限制地發送脈衝(在這種情況下為閃爍17.py)。
看門狗非常有利於遠端存取和控制。Raspberry Pi由於某種原因當機後,您不再需要重新插拔來手動重啟Pi。
然而,我們有必要測試出現錯誤處理時脈衝是否能夠正確停止,或者是否存在任何衝突。切勿過分依賴看門狗。該功能應該作為一種“保險”使用。