给树莓派添加一个开、关机按键(原创)

给树莓派添加一个开、关机按键(原创)

声明

本文由晓宇(xiaoyu_ebox)原创,转载及引用内容请注明出处,并标明本站网址。文中程序仅供学习使用,本人不承担任何由使用文中代码产生的法律责任。

关键词

树莓派 开关键 修改开关键 GPIO17开关键

问题起因

一直以来,树莓派关机1)要么直接拔掉电源,2)要么登陆后执行shutdown命令关机。
这两种方式:

  1. 第一种简单粗暴,但是直接关机对树莓派的SD伤害非常大,搞几次之后就会损坏SD卡。
  2. 第二种方式比较安全,但是很麻烦,如果树莓派没有接到显示器上时,需要SSH登陆树莓派,再执行关机命令。

今天我们给树莓派添加一个硬件的开关机按键,使树莓派开机、关机变得非常简单。

解决方案

一、实现方式

给树莓派添加开关机按键有两种方式。

  1. 第一种是在树莓派的GPIO口上接一个按键,然后在树莓派上写一个程序,这个程序不断的检测按键有没有按下,如果按键按下,则执行“sudo shutdown -h now”。 这种方式容易理解,但相比等会要讲的第二种方式来说,稍显麻烦。
  2. 第二种方式更为简单优雅,只需要添加一行代码即可实现。在/boot/config.txt 文件末尾添加这样一行代码:
dtoverlay=gpio-shutdown

  
 
  • 1

保存,然后重启树莓派,在树莓派的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.

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

即添加代码后,树莓派的GPIO3会不断的检测电平状态,如果检测到GPIO3变为低电平(GPIO3连接到GND时),树莓派就会关机,关机后再次将GPIO3变为低电平,则树莓派会开机。 这样在树莓派的GPIO3和GPND之间连接一个按键,就能够实现树莓派的开关机功能。 还可以按照以下格式进行自定义配置:

dtoverlay=gpio-shutdown,<param>=<val>

  
 
  • 1

其中的 parm 和 val 的值可以选择的配置有:

gpio_pin 打开触发功能的GPIO引脚(默认3)

active_low 当它为1(低电平有效)时,下降边缘生成按下事 件,并且上升沿会产生按键上升事件。 当它是0(高电平有效)时, 这时和1的状态相反。默认值为1(低电平有效)。

gpio_pull 所需的上拉/下拉状态(关闭,下拉,上拉) 默认为“上拉”。 请注意,默认引脚(GPIO3)具有一个 外部上拉。

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

大功告成!

如果你使用的和默认配置的一样是GPIO3引脚,那么确实大功告成了,我们可以看到GPIO3引脚也可以复用于I2C的SCL功能,如果你不需要使用到硬件I2C,那么你可以就此收工了。但如果你需要使用硬件I2C,需要使用其他引脚代替开关键,例如使用GPIO17引脚,相信你会修改为如下:

# 使用GPIO17(即序号为11的)做关机键
dtoverlay=gpio-shutdown,gpio_pin=17,active_low=1,gpio_pull=up

  
 
  • 1
  • 2

但是通过测试你会发现,只能通过GPIO17实现关机,却无法通过GPIO17开机,但是你还是可以通过GPIO3开机…啊,为什么会这样子…。

那么有没有两全其美的方法呢:我的GPIO3需要用作硬件I2C,就想通过GPIO17来开、关机呢?
答案必须要有:

  1. 使用两个按键,没毛病,但总是不够完美
  2. 添加部分电路,但需要有点动手能力,像我这追求完美的人,必须不能容忍使用两个按键 或者 GPIO17只能关机不能开机的问题,下面就来慢慢讲解。

三、改进方案

此方案还是基于GPIO17用于关机键,使用GPIO3作为开机键,但只需要一个开关按键。
大概原理图:
在这里插入图片描述

由于我说开发软件的,所以使用没有使用原理图工具来画,而是使用电路仿真工具画的,顺便仿真测试了下,实际参考时,图中的3.32V的电池和电压表是不需要的:

  1. 当按键按下时,标记2(即GPIO17)变为低电平,实现关机功能;
  2. 当再次按下按键,标记2(即GPIO17)变为低电平,左边三极管导通致使右边三极管导通,使标记1(即GPIO3)变为低电平,实现开机功能。
  3. 正常时候,按键未按下时,不影响GPIO3的使用,还可正常作为I2C功能或者其它功能使用。

配合以下配置,实测OK,开关机功能正常,且硬件I2C功能正常使用。

# 使用GPIO17(即序号为11的)做关机键
dtoverlay=gpio-shutdown,gpio_pin=17,active_low=1,gpio_pull=up

  
 
  • 1
  • 2

在这里插入图片描述

文章来源: blog.csdn.net,作者:xiaoyu_ebox,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/xiaoyu_ebox/article/details/113880269

(完)