ラズパイZEROには、電源OFFスイッチがない?
パソコンを電源OFFする際に、いきなりコンセントを抜く人はいるだろうか?
あるいはいきなり電源ボタンを押してOFFにするとか・・・
基本的には、例えばwindowsであれば、電源ボタンを押さずに「シャットダウン」というコマンドを選ぶことで、パソコンにきちんと終了プロセスの動作を経てから電源が切れる、というのが通常の電源OFFのやり方だ、とされている。
いきなりコンセントを抜くのは、正常な終了プロセスを通過させないので、パソコンが壊れる原因になるらしい。
さて、Raspberry Piも、小さいけど一応パソコン。LinuxのOSが入っていて、電源をOFFにするためのコマンドもある
$ sudo shutdown -h nowこの終了コマンドを実行させずに、コンセントを抜くなどの強制的?な電源OFFのやり方は、やはりまれにmicroSDが壊れることがあるらしい。
ラズパイZEROには、ちゃんとした電源OFFボタンが無いし、毎回ターミナルから終了コマンドを打つのはめんどくさい。
という事で、物理的な終了ボタンを設置してみた。
この終了ボタンを押すことで、先の終了コマンドが実行され、安全にラズパイを終了させることができる。
※参考ページ

先輩、ありがとうございます。
しかしながら、月日が経ち、最新のOSをインストールし直したら、上記のプログラムがそのまま実行されないようになってしまっていたので、今回は修正版を備忘録として残しておきます。
基本手順
以前は、shutdown.shに記載した終了スクリプトを起動時に自動実行させるために、/etc/rc.localというのを使っていた。
しかし、新しいRaspberry Pi OS(Bookworm, Debian 12)からはsystemd に完全移行したため、rc.local は標準で廃止・無効化されているらしい。
ということで、ボタン押下でシャットダウンするために、Python スクリプト+systemdサービスで作成し直してみる。
- Python 3 で RPi.GPIO を使用
- 押下秒数を判定(3秒でシャットダウン)
- 未押下時は CPU 使用率を極力抑制
- ACT LED も制御(押下時ハートビート)
- systemd サービスで root 実行

実行手順とプログラム
① Python スクリプト
保存場所:/home/pi/Documents/shutdown-button/shutdown.py
#!/usr/bin/env python3
import RPi.GPIO as GPIO
import time
import os
# 設定
GPIO_PIN = 22              # 使用GPIO
PUSHTIME = 3               # 押下秒数でシャットダウン
SLEEP_INTERVAL = 0.1       # 監視間隔(秒)
LED_PATH_TRIGGER = "/sys/class/leds/led0/trigger"
LED_PATH_BRIGHT = "/sys/class/leds/led0/brightness"
# GPIO初期化
GPIO.setmode(GPIO.BCM)
GPIO.setup(GPIO_PIN, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
# LED制御関数
def set_led_mode(mode):
    try:
        with open(LED_PATH_TRIGGER, "w") as f:
            f.write(mode)
    except Exception:
        pass
def set_led_value(value):
    try:
        with open(LED_PATH_BRIGHT, "w") as f:
            f.write(str(value))
    except Exception:
        pass
print("Shutdown button service started")
try:
    while True:
        cnt = 0
        # ボタン押下時のみカウント
        while GPIO.input(GPIO_PIN) == GPIO.HIGH:
            cnt += SLEEP_INTERVAL
            if cnt == SLEEP_INTERVAL:
                set_led_mode("heartbeat")
            if cnt >= PUSHTIME:
                # シャットダウン合図
                set_led_mode("none")
                set_led_value(1)
                time.sleep(2)
                set_led_value(0)
                set_led_mode("mmc0")
                os.system("shutdown -h now")
            time.sleep(SLEEP_INTERVAL)
        # ボタン未押下時はLEDを通常表示
        set_led_mode("mmc0")
        time.sleep(SLEEP_INTERVAL)
finally:
    GPIO.cleanup()保存後、実行権限を付与:
chmod +x /home/pi/Documents/shutdown-button/shutdown.py② systemd サービス
作成は(root権限)で
sudo nano /etc/systemd/system/shutdown-button.service内容:
[Unit]
Description=Optimized Shutdown Button Python Service
After=multi-user.target
[Service]
ExecStart=/usr/bin/python3 /home/pi/Documents/shutdown-button/shutdown.py
WorkingDirectory=/home/pi/Documents/shutdown-button
User=root
Group=root
Type=simple
Restart=on-failure
[Install]
WantedBy=multi-user.target③ systemd に登録・有効化
sudo systemctl daemon-reload
sudo systemctl enable shutdown-button.service
sudo systemctl start shutdown-button.service
sudo systemctl status shutdown-button.serviceActive: active (running) なら常駐成功
ジャーナルログで動作確認:
journalctl -u shutdown-button.service -f④ 動作確認
再起動させる。
sudo reboot起動後、ボタンを 3 秒押すとシャットダウンすればOK
LED が押下時ハートビート → シャットダウン合図 → シャットダウン という流れになるはず。
終わりに

やっぱり終了ボタンがあると、安心感がありますね。
ラズパイは壊れやすいって聞いてましたが、最近実際に壊れてしまったので、気を付けて扱っていこうと思います。

 
  
  
  
  













コメント