给树莓派添加一个硬件开、关机按键

一直以来,树莓派关机要么直接拔掉电源,要么登陆后执行shutdown命令关机。这两种方式,第一种简单粗暴,但是直接关机对树莓派的SD伤害非常大,搞几次之后就会损坏SD卡。第二种方式比较安全,但是很麻烦,如果树莓派没有接到显示器上时,需要SSH登陆树莓派,再执行关机命令。今天我们给树莓派添加一个硬件的开关机按键,使树莓派开机、关机变得非常简单。

一、实现方式

给树莓派添加开关机按键有两种方式。 第一种是在树莓派的GPIO口上接一个按键,然后在树莓派上写一个程序,这个程序不断的检测按键有没有按下,如果按键按下,则执行“sudo shutdown -h now”。 这种方式容易理解,无非就是通过SSH执行关机命令,通过检测按键按下来关机, 这种方式相比等会要讲的第二种方式来说,稍显麻烦。下面讲树莓派添加开关机按键的第二种方式。 第二种方式更为简单优雅,只需要添加一行代码即可实现。在/boot/config.txt 文件末尾添加这样一行代码:
dtoverlay=gpio-shutdown
保存,然后重启树莓派,在树莓派的GPIO3(BCM3)和GND引脚之间接一个按键。这时按下按键树莓派就关机了,再按一下按键,树莓派开机。是不是非常的方便。 开关机按键连接好之后如下图:
给树莓派添加开关机按键
树莓派引脚
看到这里,你一定想知道为什么会这么简单,下面讲解原理。

二、实现的原理

在树莓派的/boot/overlays/文件下,包含了大量的设备树,使得树莓派的内核支持大量的硬件配置,前提是你要开启才行。 开启的方式也比较简单,只需要在/boot/config.txt文件中添加或者删除相应的命令即可。树莓派的/boot/config.txt文件相当于电脑的BIOS。 这里只看/boot/overlays/README中和本文相关的内容,完整的内容可以在以下两个页面中查看。 树莓派系统/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.
可能有人看不懂英文,这里大概翻译以下:
在/boot/config.txt文件中添加“dtoverlay = gpio-shutdown”时,当GPIO引脚的电平状态发生变化时关闭树莓派,此时给定的GPIO引脚被配置为KEY_POWER事件的输入键,即不断的监控连接到GPIO引脚的按键是否被按下。
树莓派关机后,树莓派系统可以通过将GPIO3驱动为低电平再次开机。 因此如果连接了GPIO3和GND之间的按钮(40引脚接头连接器上的引脚5和6),你就获得了关机和开机按钮。
即添加代码后,树莓派的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)具有一个
                                外部上拉。
大功告成!

原创文章,转载请注明: 转载自科技爱好者博客

本文链接地址: 给树莓派添加一个硬件开、关机按键 (https://www.tujing.site/3968)

如果博客对您有帮助,请给我 赞助


热度:9,260℃

给树莓派添加一个硬件开、关机按键》有5个想法

  1. 是不是得用一个无锁开关或者是一个按钮才行啊?
    我焊了一个自锁开关,结果发现只响应按下去的那一次,现在开机关机要按两次(先复位再按下)才能实现了

  2. 我用了和文章图片中一样的树莓派无锁开关,配置好config文件,重启,按按钮没反应,
    但是跳过按钮直接短接GPIO 5、6的电线可以实现关机/开机,已经更换了2个按钮都不行,求指导。谢谢!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注