給樹莓派添加一個開、關機按鍵(原創)
- 宣告
- 關鍵詞
- 問題起因
- 解決方案
- 一、實作方式
- 二、實作原理
- 三、改進方案
宣告
本文由曉宇(xiaoyu_ebox)原創,轉載及參考內容請注明出處,并標明本站網址,文中程式僅供學習使用,本人不承擔任何由使用文中代碼產生的法律責任,
關鍵詞
樹莓派 開關鍵 修改開關鍵 GPIO17開關鍵
問題起因
一直以來,樹莓派關機1)要么直接拔掉電源,2)要么登陸后執行shutdown命令關機,
這兩種方式:
- 第一種簡單粗暴,但是直接關機對樹莓派的SD傷害非常大,搞幾次之后就會損壞SD卡,
- 第二種方式比較安全,但是很麻煩,如果樹莓派沒有接到顯示幕上時,需要SSH登陸樹莓派,再執行關機命令,
今天我們給樹莓派添加一個硬體的開關機按鍵,使樹莓派開機、關機變得非常簡單,
解決方案
一、實作方式
給樹莓派添加開關機按鍵有兩種方式,
- 第一種是在樹莓派的GPIO口上接一個按鍵,然后在樹莓派上寫一個程式,這個程式不斷的檢測按鍵有沒有按下,如果按鍵按下,則執行“sudo shutdown -h now”, 這種方式容易理解,但相比等會要講的第二種方式來說,稍顯麻煩,
- 第二種方式更為簡單優雅,只需要添加一行代碼即可實作,在/boot/config.txt 檔案末尾添加這樣一行代碼:
dtoverlay=gpio-shutdown
保存,然后重啟樹莓派,在樹莓派的GPIO3(BCM3)和GND引腳之間接一個按鍵,這時按下按鍵樹莓派就關機了,再按一下按鍵,樹莓派開機,是不是非常的方便,樹莓派引腳圖如下,

二、實作原理
在樹莓派的/boot/overlays/檔案下,包含了大量的設備樹,使得樹莓派的內核支持大量的硬體配置,前提是你要開啟才行, 開啟的方式也比較簡單,只需要在/boot/config.txt檔案中添加或者洗掉相應的命令即可,樹莓派的/boot/config.txt檔案相當于電腦的BIOS, 這里只看/boot/overlays/README中和本文開關鍵相關的內容,完整的內容可以在以下兩個頁面中查看,
Name: gpio-shutdown
Info: Initiates a shutdown when GPIO pin changes. The given GPIO pin
is configured as an input key that generates KEY_POWER events.
This event is handled by systemd-logind by initiating a
shutdown. Systemd versions older than 225 need an udev rule
enable listening to the input device:
ACTION!="REMOVE", SUBSYSTEM=="input", KERNEL=="event*", \
SUBSYSTEMS=="platform", DRIVERS=="gpio-keys", \
ATTRS{keys}=="116", TAG+="power-switch"
This overlay only handles shutdown. After shutdown, the system
can be powered up again by driving GPIO3 low. The default
configuration uses GPIO3 with a pullup, so if you connect a
button between GPIO3 and GND (pin 5 and 6 on the 40-pin header),
you get a shutdown and power-up button.
Load: dtoverlay=gpio-shutdown,<param>=<val>
Params: gpio_pin GPIO pin to trigger on (default 3)
active_low When this is 1 (active low), a falling
edge generates a key down event and a
rising edge generates a key up event.
When this is 0 (active high), this is
reversed. The default is 1 (active low).
gpio_pull Desired pull-up/down state (off, down, up)
Default is "up".
Note that the default pin (GPIO3) has an
external pullup.
即添加代碼后,樹莓派的GPIO3會不斷的檢測電平狀態,如果檢測到GPIO3變為低電平(GPIO3連接到GND時),樹莓派就會關機,關機后再次將GPIO3變為低電平,則樹莓派會開機, 這樣在樹莓派的GPIO3和GPND之間連接一個按鍵,就能夠實作樹莓派的開關機功能, 還可以按照以下格式進行自定義配置:
dtoverlay=gpio-shutdown,<param>=<val>
其中的 parm 和 val 的值可以選擇的配置有:
gpio_pin 打開觸發功能的GPIO引腳(默認3)
active_low 當它為1(低電平有效)時,下降邊緣生成按下事
件,并且上升沿會產生按鍵上升事件,
當它是0(高電平有效)時,
這時和1的狀態相反,默認值為1(低電平有效),
gpio_pull 所需的上拉/下拉狀態(關閉,下拉,上拉)
默認為“上拉”,
請注意,默認引腳(GPIO3)具有一個
外部上拉,
大功告成!
如果你使用的和默認配置的一樣是GPIO3引腳,那么確實大功告成了,我們可以看到GPIO3引腳也可以復用于I2C的SCL功能,如果你不需要使用到硬體I2C,那么你可以就此收工了,但如果你需要使用硬體I2C,需要使用其他引腳代替開關鍵,例如使用GPIO17引腳,相信你會修改為如下:
# 使用GPIO17(即序號為11的)做關機鍵
dtoverlay=gpio-shutdown,gpio_pin=17,active_low=1,gpio_pull=up
但是通過測驗你會發現,只能通過GPIO17實作關機,卻無法通過GPIO17開機,但是你還是可以通過GPIO3開機…啊,為什么會這樣子…,
那么有沒有兩全其美的方法呢:我的GPIO3需要用作硬體I2C,就想通過GPIO17來開、關機呢?
答案必須要有:
- 使用兩個按鍵,沒毛病,但總是不夠完美
- 添加部分電路,但需要有點動手能力,像我這追求完美的人,必須不能容忍使用兩個按鍵 或者 GPIO17只能關機不能開機的問題,下面就來慢慢講解,
三、改進方案
此方案還是基于GPIO17用于關機鍵,使用GPIO3作為開機鍵,但只需要一個開關按鍵,
大概原理圖:

由于我說開發軟體的,所以使用沒有使用原理圖工具來畫,而是使用電路仿真工具畫的,順便仿真測驗了下,實際參考時,圖中的3.32V的電池和電壓表是不需要的:
- 當按鍵按下時,標記2(即GPIO17)變為低電平,實作關機功能;
- 當再次按下按鍵,標記2(即GPIO17)變為低電平,左邊三極管導通致使右邊三極管導通,使標記1(即GPIO3)變為低電平,實作開機功能,
- 正常時候,按鍵未按下時,不影響GPIO3的使用,還可正常作為I2C功能或者其它功能使用,
配合以下配置,實測OK,開關機功能正常,且硬體I2C功能正常使用,
# 使用GPIO17(即序號為11的)做關機鍵
dtoverlay=gpio-shutdown,gpio_pin=17,active_low=1,gpio_pull=up

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/261803.html
標籤:其他
