にせねこメモ

はてなダイアリーがUTF-8じゃないので移ってきました。

Raspberry Pi Zero Wで物理電源ボタンを実装することについて

やりたいこと

ヘッドレスで運用しているRaspberry Pi Zero Wがネットワーク経由でアクセスできなくなった場合に、再起動したいことが度々あった。
これまでは電源断→電源投入で再起動していたが、あまりよろしくない。

物理的なボタンを接続し、それを押すことでRaspberry Piの再起動ができれば、この問題は解決できるはずである。

調べてみると

2つほど手法がありそうだった。

  1. GPIO 3とGNDにボタンを接続し、overlaysのgpio-shutdownを利用する
  2. GPIOでボタンを押されているのをプログラムで検知し、再起動コマンドを動かす

2.は単純にコード書いて動かすというもので、1.の方が楽そうに見える。1.を検討する。

システム

overlaysのgpio-shutdownを利用した電源オンオフボタン

これにより電源オフ/電源オン用のボタンが実装できる。

設定手順

まず、ボタン(というか、短絡できればなんでもいいのだが)をGPIO 3 (5番ピン)とGND (6番ピンなど)に接続する。

次に、/boot/firmware/config.txtを編集する。

sudo nano /boot/firmware/config.txt

最終行に、

dtoverlay=gpio-shutdown,debounce=3000

と書いて保存(debounceは何ミリ秒長押ししたらシャットダウンするかを指定する。デフォルト100ミリ秒)。

これでRaspberry Piを再起動すると、電源オフ・オンボタンが動くようになる。

動作

  1. Raspberry Pi Zero Wが電源が入り起動した状態になっていて、状態表示LEDが点灯している。
  2. この状態でボタンを3秒ほど押す。
  3. すると、10秒ほどLEDが点滅し、その後消灯する。
    • これでシャットダウンができたと思われる。ボタンを押してからシャットダウンまでに少し時間がかかることから、比較的安全にシャットダウンができていると思われる。
  4. この電源オフの状態から、ボタンを短時間押す。
  5. すると、LEDが点滅を始め、Raspberry Piが起動する。

GPIO 3以外のピンを利用して電源オフ・オンボタンにできるか?

さて、実運用しているシステムでは、GPIO 3のピンはすでに他用途で利用しているため、できれば別のピンを使いたい。

gpio-shutdownの設定で別のGPIOに変更できるようなので、試しにGPIO 5にしてみる。ボタンの接続をGPIO 5とGNDにする。

/boot/firmware/config.txtを編集し、最終行に、

dtoverlay=gpio-shutdown,debounce=3000,gpio_pin=5,gpio_pull=up

と書いて保存する。gpio_pinがGPIOピンの指定、gpio_pull=upはプルアップを指定している*1

その後再起動する。

動作確認

Raspberry Piが起動状態でGPIO 5に接続されたボタンを3秒ほど押すと、しばらくLEDが点滅したのち、消灯し、シャットダウンした。

一方で、シャットダウンした状態でGPIO 5に接続されたボタンを押しても起動はしなかった。

ここで試しにGPIO 3とGNDを短時間短絡してみたところ、Raspberry Piが起動した*2

つまり

電源オフ状態でGPIO 3とGNDを短絡すると起動するのはRaspbery Pi Zero Wのデフォルトの仕様であり、変更できるかはわからない。特に設定せずとも使える。

gpio-shutdownは、設定すると、起動時に任意のGPIOを監視し、ボタンが押されたのを検知してシャットダウンを行うことができる。これはデフォルトでGPIO 3を利用するが、電源オンの挙動をするピンと同一にすることで、電源のオン・オフ両用のボタンとして実装できるということのようだ。

というわけで

GPIO 3を利用していたのはI2Cである。I2Cは設定で別のバスを有効にすることで異なるピンを使えるらしく*3、そのようにI2Cで別ピンを使うようにしてGPIO 3を空ける方が筋がいいかもなあと思った。

*1:プルアップがデフォルトなので指定しなくても良い。なお、GPIO 3 (とGPIO 2)にはハードウェア的に外部プルアップ抵抗が接続されている: https://datasheets.raspberrypi.com/rpizero/raspberry-pi-zero-reduced-schematics.pdf

*2:実際には、短絡させようと思ったけど、逆端がどこにもつながっていないコード接続した段階で起動を始めてしまった。

*3:Raspberry Pi OS ① I2Cバスがたくさん使える | 電子工作の環境向上 https://www.denshi.club/pc/raspi/raspberry-pi-os-1-i2c.html