HOME
  Security
   Software
    Hardware
  
FPGA
  CPU
   Android
    Raspberry Pi
  
nLite
  Xcode
   etc.
    ALL
  
LINK
BACK
 

2023/09/05

Raspberry Piの GPIOでシャットダウン機能をスクリプト不要で有効にする、電源切断判別の LEDも! Raspberry Piの GPIOでシャットダウン機能をスクリプト不要で有効にする、電源切断判別の LEDも!

(ラズパイの GPIOにボタンを取り付けてシャットダウン機能を dtoverlayで超簡単に実現する方法)

Tags: [Raspberry Pi], [電子工作]




● Raspberry Piの GPIOに LEDとスイッチを接続して Lチカする方法

 下記で LEDとタクトスイッチを GPIOに接続して入出力を行ないました。

2016/04/02
Raspberry Pi 3の GPIOに LEDとスイッチを接続して Lチカする方法
Raspberry Pi 3の GPIOに LEDとスイッチを接続して Lチカする方法

  ラズパイ3の GPIOに LEDとスイッチを取り付けて Lチカ実験する方法

 詳細は上記の記事を参照してくだしあ。

・Raspberry Piの GPIOに LEDとスイッチを接続して Lチカする方法の回路図
Raspberry Piの GPIOに LEDとスイッチを接続して Lチカする方法の回路図


Raspberry Piの GPIOに LEDとスイッチを接続して Lチカする方法


Raspberry Piの GPIOに LEDとスイッチを接続して Lチカする方法




● Raspberry Piの GPIOに LEDとスイッチを接続してシャットダウンボタンを実装する方法

 ラズパイの GPIOにボタンを取り付けてシャットダウン機能を作成する方法。

 今回は、上記の「GPIOに LEDとスイッチを接続して Lチカ」を使ってシャットダウン機能を作成します。

 作成と言っても Raspberry Pi OS自体にその機能が有るので 1行記述してシャットダウン機能を有効にできます。

 2017/08/11に「シャットダウン機能」が追加されましたが、私は 2023年の今になって気が付きました。
overlays/README
Update to latest master - Aug 12 2017
 2017/08/12に gpio-shutdownが追加された。

Update to lastest master - Jul 1 2017
 2017/07/01には gpio-shutdownが存在していない。

 Chromeブラウザを使って GitHubを閲覧していると GitHubが固まる(ブラウザがフリーズする)GitHubのマイクソソフトは糞。


● Raspberry Piの dtoverlay gpio-shutdownでシャットダウンボタンを実装する方法

 2023/09現在の最新の Raspberry Pi OSで動作を確認します。

Operating system images - Raspberry Pi
Raspberry Pi OS Lite
Release date: May 3rd 2023
System: 32-bit
Kernel version: 6.1
Debian version: 11 (bullseye)
$ uname -a
Linux raspberrypi 6.1.21-v7+ #1642 SMP Mon Apr  3 17:20:52 BST 2023 armv7l GNU/Linux

$ cat /proc/device-tree/model
Raspberry Pi 3 Model B Rev 1.2

 ラズパイ本体は Raspberry Pi 3Bで動作確認しました。

// LED 0="ON" 1="OFF"
#define GPIO_LED 22
// BUTTON 0="PUSH" 1="OPEN"
#define GPIO_BTN 27
 今回はボタン(スイッチ)を GPIO 27に Lアクティブ(ボタンを押した時に GNDに接続= 'L'になる)で接続しています。

 dtoverlayには下記の様に /boot/config.txtの「一番下」に記述します。

/boot/config.txt
[all]
dtoverlay=gpio-shutdown,gpio_pin=27,active_low=1,gpio_pull=up,debounce=3000

/boot/config.txt
 を変更する場合は sudoを使って管理者権限が必要です。

 変更後は
sudo reboot
 で再起動して設定内容を反映します。

 上記の設定で GPIO 27のボタンを 3秒間の長押しでラズパイがシャットダウンしました!

記述内容意味
dtoverlay=dtoverlay機能を宣言
gpio-shutdowngpio-shutdown機能
gpio_pin=27GPIOの 27にシャットダウン ボタンを接続
active_low=1ボタンを押した時に 'L'になる(Lアクティブ、負論理)
gpio_pull=upGPIOのプルアップ抵抗を有効にする(ボタンを押していない時は 'H'にする)
debounce=30003秒間(=3000ms)ボタンを長押しでシャットダウンする
 ※ debounce=100 にすればボタンを「チョイ押し」でシャットダウンします。
 ※ debounce=10000 にすればボタンを「10秒間の長押し」でシャットダウンします。

● dtoverlay -h gpio-shutdownで英語ですが説明が出ます(良く読もうね)
$ dtoverlay -h gpio-shutdown
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"

        Alternatively this event can be handled also on systems without
        systemd, just by traditional SysV init daemon. KEY_POWER event
        (keycode 116) needs to be mapped to KeyboardSignal on console
        and then kb::kbrequest inittab action which is triggered by
        KeyboardSignal from console can be configured to issue system
        shutdown. Steps for this configuration are:

            Add following lines to the /etc/console-setup/remap.inc file:

                # Key Power as special keypress
                keycode 116 = KeyboardSignal

            Then add following lines to /etc/inittab file:

                # Action on special keypress (Key Power)
                kb::kbrequest:/sbin/shutdown -t1 -a -h -P now

            And finally reload configuration by calling following commands:

                # dpkg-reconfigure console-setup
                # service console-setup reload
                # init q

        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. Please note that
        Raspberry Pi 1 Model B rev 1 uses GPIO1 instead of GPIO3.

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

Params: gpio_pin                GPIO pin to trigger on (default 3)
                                For Raspberry Pi 1 Model B rev 1 set this
                                explicitly to value 1, e.g.:

                                    dtoverlay=gpio-shutdown,gpio_pin=1

        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. Same applies for GPIO1
                                on Raspberry Pi 1 Model B rev 1.

        debounce                Specify the debounce interval in milliseconds
                                (default 100)

        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.
 ここの説明を読むと GPIO 3にボタンを取り付けると「シャットダウン」と「起動」の両方の機能を実現できる。と書いてあります。
 (GPIO 3って何かと思ったら I2Cの SCLだ! GPIOの SCLに「起動」の機能が有るのも今回初めて知った!)

 元々 GPIO 3を 'L'にすると「起動する」機能が有り、そこに gpio-shutdownで GPIO 3を指定すると「シャットダウン」の機能が「追加」に成るのです。

        gpio_pull               Desired pull-up/down state (off, down, up)
                                Default is "up".

                                Note that the default pin (GPIO3) has an
                                external pullup. Same applies for GPIO1
                                on Raspberry Pi 1 Model B rev 1.
 なお、gpio_pullの説明を読むと GPIO 3には外部回路にプルアップ抵抗が付いているので
gpio_pullは offで良い。と成ります。

 なので、結論として GPIO 3を使用する場合は、下記の指定だけで大丈夫です。
dtoverlay=gpio-shutdown
 上記の場合 debounceはデフォルトの 100ms(=0.1秒)なので、チョイ押しでシャットダウンします。

 GPIO 3の場合も長押しでシャットダウンにしたい場合は下記の様に debounceを指定します。
 この例では 2000を指定してるので 2秒間の長押し、に成ります。
dtoverlay=gpio-shutdown,debounce=2000

 上記の設定で GPIO 3のボタンを 2秒間の長押しでラズパイがシャットダウン、チョイ押しでラズパイが起動、の動作を確認できました!



● Raspberry Pi 4の I2Cにはプルアップ抵抗は有るの?回路図には記載が無いのだが?

 Q:Raspberry Pi 4の I2Cにはプルアップ抵抗は有るの?回路図には記載が無いのだが?
 A:簡易回路図には書いていないけど従来モデルと同じに 1.8kΩのプルアップ抵抗が在るよ。

Raspberry Pi Documentation - Raspberry Pi hardware

[SOLVED] Pi 4 I2C pull-up resistors
ラズパイの中の人:6by9 Raspberry Pi Engineer & Forum Moderator
Pull ups for GPIOs 2&3 on the Pi4 are definitely 1k8 - I've just checked the full schematics for it. 1% 63mW M1005 if you really care.

Same is true for GPIOs 44&45 for I2C to the camera and display connectors.

Pi4 の GPIO 2&3 のプルアップは間違いなく 1k8 です - 完全な回路図を確認したところです。 本当に気になるなら1% 63mW M1005。

カメラおよびディスプレイ コネクタへの I2C 用の GPIO 44&45 にも同じことが当てはまります。
 簡易回路図にも反映しとけよ!!!(怒)
Raspberry Pi 4の簡易回路図



ちなみに、Raspberry Pi Compute Module 4 ( CM4 ) IO ボードは回路図では 2.2kΩだが実際は 1.8kΩっぽい



● GPIO 3で起動する機能って安全性ってどうよ?

 外部にプルアップ抵抗が有るから普段は 'H'を維持できる(=不意に起動しない)けどちょっと不安。



●ラズパイをシャットダウン操作して電源が切れたかを簡単に確認する設定方法

 ラズパイの基板の緑 LED(/sys/class/leds/led0)を自前で制御する方法

 ラズパイが生きている時は緑の LEDが点滅する。電源が切れたら消灯する。
 (但し、ラズパイが異常にハングアップした場合も点滅を続ける。経験則で言うと{高速}で点滅する)
# ハートビート(死活確認)
sudo bash -c "echo dtparam=act_led_trigger=heartbeat >> /boot/config.txt"

[UPDATE] 2023/09/05
Raspberry Pi 3をシャットダウンした時に電源が切れたかを簡単に確認する方法
Raspberry Pi 3をシャットダウンした時に電源が切れたかを簡単に確認する方法

  ラズパイをシャットダウン操作した時に電源が切れたかを簡単に確認する方法


● ラズパイをシャットダウン操作して電源が切れたかを簡単に確認する設定方法

 上記の「電源が切れたかを簡単に確認する」と併用すると良いと思います。

kernel: Bump to 4.1.6 - Aug 19 2015
 2015/08から存在している。

Name:   gpio-poweroff
Info:   Drives a GPIO high or low on reboot

dtoverlay=gpio-poweroff,gpiopin=22,active_low=1,active_delay_ms=2000,inactive_delay_ms=5000

記述内容意味
dtoverlay=dtoverlay機能を宣言
gpio-poweroffgpio-poweroff機能
gpiopin=22GPIOの 22に LEDを接続
active_low=1電源が ONの時は GPIOが 'H'、電源が切れた時に GPIOが 'L'になる。LEDの配線が Lアクティブ(負論理)の場合は電源が切れた時に LEDが点灯する
input正体不明、Set if the gpio pin should be configured as an input.
export正体不明、Set to export the configured pin to sysfs
active_delay_ms=2000シャットダウンの直前に 2秒間 GPIOが 'L'に成る
inactive_delay_ms=5000active_delay_msの後に 5秒間 GPIOが 'H'に成る。そして本当に電源が切れたら 'L'に成る。
 ※ active_low=0は電源が切れた時に GPIOが 'H'になる。
 ※ 表の active_delay_ms、inactive_delay_msの GPIOの出力は active_low=1の時の場合です。active_low=0は 'L'/'H'が逆になります。

[all]
dtoverlay=gpio-shutdown,debounce=2000
dtoverlay=gpio-poweroff,gpiopin=22,active_low=1
 にしたら、GPIO 3のボタンで「シャットダウン」はできて、「シャットダウン後」に LEDが点灯('L'アクティブ、負論理)は動作したけど、その後に GPIO 3のボタンで「起動」ができなくなったぞ!?

[all]
dtoverlay=gpio-shutdown,debounce=2000
dtoverlay=gpio-poweroff,gpiopin=22,active_low=0
 で、active_low=0でも同様に「起動」ができない。

[all]
dtoverlay=gpio-shutdown,gpio_pin=27,active_low=1,gpio_pull=up,debounce=3000
dtoverlay=gpio-poweroff,gpiopin=22,active_low=1
 で、gpio-shutdownの gpio_pinを 3以外にしても同様に GPIO 3で「起動」ができない。
 (GPIO 27を押しても起動しない)

[all]
# dtoverlay=gpio-shutdown,gpio_pin=27,active_low=1,gpio_pull=up,debounce=3000
dtoverlay=gpio-poweroff,gpiopin=22,active_low=0
 で、dtoverlay=gpio-shutdownをコメントにしても同様に「起動」ができない。
 つまり、gpio-shutdownは関係無さそう。

[all]
dtoverlay=gpio-shutdown,debounce=2000
# dtoverlay=gpio-poweroff,gpiopin=22,active_low=1
 で dtoverlay=gpio-poweroffをコメントにして無効化した場合はシャットダウン後からの起動が動作した。(更に「シャットダウン」してからの「起動」も大丈夫)

 結論:gpio-poweroffを有効にした場合は GPIO 3での起動機能が無効になるっぽい。


● active_delay_ms、inactive_delay_msは下記で追加になりました。

gpio-poweroff and active-delay-ms - Raspberry Pi Forums

overlays: Additional parameters for gpio-poweroff



● GPIO3でググッたらこんな機能も有るんだね

gpio-key
 gpio-keyって何をするもの?
 ボタンを押した時に任意のキーコード(キーボードの)を送信できるっぽい。

 keycode=116(KEY_POWER)でキーボードの電源キーを押した事になる?
  >> シャットダウンはできた
[all]
# dtoverlay=gpio-shutdown,gpio_pin=27,active_low=1,gpio_pull=up,debounce=2000
dtoverlay=gpio-key,gpio=27,active_low=1,gpio_pull=up,lavel=POW,keycode=116
 で、GPIO 27のボタン押下でシャットダウンしました。OS起動はしませんでした。

Name:   gpio-key
Info:   This is a generic overlay for activating GPIO keypresses using
        the gpio-keys library and this dtoverlay. Multiple keys can be
        set up using multiple calls to the overlay for configuring
        additional buttons or joysticks. You can see available keycodes
        at https://github.com/torvalds/linux/blob/v4.12/include/uapi/
        linux/input-event-codes.h#L64
Load:   dtoverlay=gpio-key,<param>=<val>
Params: gpio                    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
        label                   Set a label for the key
        keycode                 Set the key code for the button

spi-gpio35-39
Name:   spi-gpio35-39
Info:   Move SPI function block to GPIO 35 to 39
Load:   dtoverlay=spi-gpio35-39
Params: <None>


● Linuxカーネルの電源制御系の説明書

gpio-keys.txt

gpio-poweroff.txt

gpio-restart.txt




Tags: [Raspberry Pi], [電子工作]

●関連するコンテンツ(この記事を読んだ人は、次の記事も読んでいます)

Raspberry Pi 3をシャットダウンした時に電源が切れたかを簡単に確認する方法
Raspberry Pi 3をシャットダウンした時に電源が切れたかを簡単に確認する方法

  ラズパイをシャットダウン操作した時に電源が切れたかを簡単に確認する方法

Raspberry Pi 3の GPIOに LEDとスイッチを接続してシャットダウンボタンを実装する方法
Raspberry Pi 3の GPIOに LEDとスイッチを接続してシャットダウンボタンを実装する方法

  ラズパイ3の GPIOにボタンを取り付けて再起動&シャットダウン機能を作成する方法

【2023年】Raspberry Piに最新版や LTSの Node.jsを超簡単にインストールする方法
【2023年】Raspberry Piに最新版や LTSの Node.jsを超簡単にインストールする方法

  ラズパイで最新の Node.jsをインストールする手順の説明、LTS 18.x、最新 20.x

Raspberry Piで QMK firmware キーボード設定用の VIAを動かす方法、Remapも動かすよ!
Raspberry Piで QMK firmware キーボード設定用の VIAを動かす方法、Remapも動かすよ!

  Raspberry Pi and VIA configure a keyboard、Remap keyboard customization app

【2023年】QMK firmwareの開発環境を Windows WSLにセットアップする方法
【2023年】QMK firmwareの開発環境を Windows WSLにセットアップする方法

  Windows WSL環境でカスタマイズ キーボードのファームウェア QMK firmwareの開発環境を構築する方法

Raspberry Piの公式の回路図、ハードウェア情報の一覧
Raspberry Piの公式の回路図、ハードウェア情報の一覧

  Raspberry Pi Schematics Official Hardware information

【SDカード作成編】 Raspberry Pi 4で ARM64版 Windows 10を動かす!【動くだけ】
【SDカード作成編】 Raspberry Pi 4で ARM64版 Windows 10を動かす!【動くだけ】

  ラズパイ 4に Windows 10 on ARM 64 bitをインストールして動かす手順、SDカード作成手順

Raspberry Pi 4 Model Bに標準搭載の Boot用 EEPROM、ファームウェアのアップデート手順
Raspberry Pi 4 Model Bに標準搭載の Boot用 EEPROM、ファームウェアのアップデート手順

  Raspberry Pi 4 Model Bから新規搭載の Boot用 EEPROMのファームを更新する方法、起動しない場合の復旧方法

SDカードの全領域チェック、microSDカードのベンチマーク、Check Flash
SDカードの全領域チェック、microSDカードのベンチマーク、Check Flash

  USBメモリ、メモリカードの不良セクタ診断アプリ ChkFlsh

【メモリ8GB】Raspberry Pi 4 Model B 8GBを KSYで最安値で購入。ベンチマークレビュー
【メモリ8GB】Raspberry Pi 4 Model B 8GBを KSYで最安値で購入。ベンチマークレビュー

  【技適取得】ラズパイ4B 8GBモデルを入手。従来の Pi3、Pi3B+と速度比較

FWinSdCardImager SDカード イメージ書き込みアプリ、ラズパイの Raspbian OS、Jetson Nanoの Ubuntuの書き込みに便利
FWinSdCardImager SDカード イメージ書き込みアプリ、ラズパイの Raspbian OS、Jetson Nanoの Ubuntuの書き込みに便利

  ラズパイや Jetson Nano等のワンボードマイコン等への OSイメージの書き込みが簡単にできる

FWinPiFinder ラズベリーパイ IPアドレス発見アプリ。ARPコマンドでラズパイの IPアドレスを探索発見する
FWinPiFinder ラズベリーパイ IPアドレス発見アプリ。ARPコマンドでラズパイの IPアドレスを探索発見する

  Raspberry Piや NVIDIA Jetson Nano等の IPアドレスを MACアドレスの OUI部分を使用して発見する




[HOME] | [BACK]
リンクフリー(連絡不要、ただしトップページ以外は Web構成の変更で移動する場合があります)
Copyright (c) 2023 FREE WING,Y.Sakamoto
Powered by 猫屋敷工房 & HTML Generator

http://www.neko.ne.jp/~freewing/raspberry_pi/raspberry_pi_gpio_shutdown_dtoverlay/