Rapsberry Pi 的實作 - 製作一顆用來關機的電源按鈕

by 3月 13, 2017 3 意見        


「要是 Raspberry Pi 有關機按鍵,不知道有多好。上次因為忘了下指令關機,就直接把電源拔掉,結果害 SD 卡上的資料損壞,OS 重灌還算小事,更嚴重的是搞了好幾天的程式跟設定檔全沒了。」

事前準備

  • Raspberry Pi * 1
  • 按鈕開關 (Power Switch Button) * 1
  • 杜邦線 (Dupont line),規格是公對母 * 2
除了樹莓派之外,按鈕開關跟杜邦線在電子材料行就買的到,北部的朋友大多會到光華新天地附近,中部的朋友可以到電子街,南部的朋友大概就是去長明街找,至於東部 ....,我也不知道 XDDD

按鈕開關就選順手好按、接線方便為主就可以了,造型或大小就看各人喜好。

杜邦線很容易買,因為我們要接兩支 GPIO 腳,所以兩條就夠了。

也可以直接買現成的電腦 Power 或 Reset 開關線,我是直接拆故障 PC 機殼的開關來用。

連接硬體線路


我們把其中一條杜邦線母頭插在 Raspberry Pi 的 GPIO 3,公頭黏在按鈕開關的正極;另一條線的母頭插在 GPIO 3 上方的 Ground 接地,再把公頭黏在按鈕開關的負極。

這是 Raspberry Pi Model A / B 的 GPIO 的腳位圖。

這是 Raspberry Pi Zero / A+ / B+ / 2B / 3B 的腳位圖。

GPIO 3 是正極,通常是接有顏色的線,GND 是負極,習慣上會用白色的線。


輸入程式指令


新增一支 Python 程式來讓 GPIO 讀取 Power 開關的動作。
sudo vi /usr/local/bin/halt.py

輸入下列程式碼。
##### 我是分隔線 #####
#!/usr/bin/env python

# Import Libraries
import RPi.GPIO as GPIO
import subprocess

# Define GPIO Pin Number
gpioPin=3

# Define GPIO Function
GPIO.setmode(GPIO.BCM)
GPIO.setup(gpioPin, GPIO.IN)
GPIO.wait_for_edge(gpioPin, GPIO.FALLING)

# Command
subprocess.call(['shutdown', '-h', 'now'], shell=False)

##### 我是分隔線 #####

新增一支 Shell Script 讓我們方便管理。
sudo vi /etc/init.d/listening-for-shutdown.sh

輸入下列程式碼。
##### 我是分隔線 #####
#! /bin/sh

### BEGIN INIT INFO
# Provides:          listen-for-shutdown.py
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
### END INIT INFO


case "$1" in
  start)
    echo "Starting listening-for-shutdown"
    sudo python /usr/local/bin/halt.py &
    ;;
  stop)
    echo "Stopping listening-for-shutdown"
     sudo killall python
    ;;
  *)
    echo "Usage: service listening-for-shutdown {start|stop}"
    exit 1
    ;;
esac

exit 0

##### 我是分隔線 #####

讓程式在開機後自動啟動。
sudo update-rc.d listening-for-shutdown.sh defaults

也可以手動啟動服務。
sudo /etc/init.d/listening-for-shutdown.sh start


功能實測


有圖有真相,我們直接看一下實際使用的狀況。


我從 Mac 這邊一直 ping 它的 IP,可以看到本來是沒有回應,開機起來之後,才收到回應的封包;接著按下按鈕,它開始執行關機指令,所以就又變成 ping 不到了。


同場加映:改成 Reset 鍵


其實這個動作超級簡單,看得懂 Linux 指令的朋友應該都辦得到。

在 Python 程式碼的最後一行,執行的就是關機指令,我們只要把「-h」改成「-r」就行了。
subprocess.call(['shutdown', '-r', 'now'], shell=False)


參考資料

圖片來源
  • https://pixabay.com/
  • http://www.itweba.com/zh-TW/category/12mm-/A0201.html
  • https://ezprice.com.tw/s/%E9%96%8B%E9%97%9C%E7%B7%9A/price/

更新紀錄
  • 2017/03/13 發文。

Heracles Jam,江湖人稱「海公公」

IT 技術家 - 創站部落客

一個常用 Windows、慣用 macOS、愛用 Linux 的 3C 阿宅
現職 MIS / 業界講師 / 資訊顧問 / 部落客

3 則留言 :

  1. 謝謝提供這有用的訊息,請問是否可以用來開機?

    回覆刪除
    回覆
    1. 很遺憾,答案是「不行」...
      因為這個關機功能的原理是啟動一個背景服務在等到按鈕的動作,所以沒開機的狀況,當然沒有任何服務來運作。
      要實現開機的功能也很簡單,就直接用帶開關的 USB Hub 就可以啦,樹莓派偵測到有電源時,就會開機啦!

      刪除
  2. 如果關機後在沒有移除PI的電源時按下還是會啟動PI

    回覆刪除