ラズベリーパイ: シャットダウンボタンを1行で有効化

ラズベリーパイ(RaspberryPi)用のDebian Linux「ラズビアン(Raspbian)」を使っていて気を付けないといけない事の一つとして:

電源を落とす前に必ずシャットダウンさせる

というのがあります。


忘れてはいけないシャットダウン

任天堂DSとかゲームボーイとかならまだしも (セーブ中でなければ)、最近ではほとんどのパソコンや家庭用ゲーム機だと、きちんとシャットダウンさせるステップを踏まないとエラーが出たり、最悪の場合は起動しなったりします。

Linuxだと特に記憶媒体の情報の更新をすぐには書き込まず、メモリ上に一時的にキャッシュ保存して、同じ情報が短期間でコロコロ変わる場合は記憶媒体の情報を何度も書き換えるのではなく一時保存されているメモリの情報を書き換える事で処理を早くしています。 なので、突然電源が落ちるとメモリにキャッシュされていた情報は書き込まれずに消えてしまい高い確率で問題が発生するようです。

特にラズベリーパイの場合はOSが書き込みスピードが比較的遅いSDカード上に保存されているのでメモリ上で一時的にキャッシュをしないと処理スピードにかなり影響があると思えます。

(※RAMディスクを設定して、SDカードは読み取り専用として使う事も出来ますがそれはそれで使い方が限られるので。。 例:組み込み用システムなど)

ラズビアンも含むLinuxの場合、デスクトップのメニューからシャットダウンを選ぶか、コンソールから「shutdown -h nowなどのコマンドをroot権限で送る必要があります。

で、ラズベリーパイ上で動くラズビアンの場合は自動的に電源が落ちないので、ボード上の緑色LEDの点滅が終って赤色LEDだけが点灯している状態になるまで待ってから手動で電源を切らないといけません。

常時、モニターとキーボード、マウスを繋げて、デスクトップコンピュータとしてラズビアンを使っている場合は比較的簡単に上記のシャットダウンのステップを踏めるのですが、モニターやキーボードを繋げずに使っている場合は、シャットダウンさせるのにネットワーク越しでログインしたり、モニターとキーボード繋げ直したりしないといけないとちょっと面倒になります。


ラズビアンにシャットダウンボタン

そこで、沢山の人がラズビアンに『ボタンをGPIOに繋げて、ボタンが押されたらラズビアンをシャットダウンさせる』という設定をしているみたいで、検索エンジンで「ラズパイ シャットダウン ボタン」などとのキーワードで検索をかけるとその設定の仕方を説明したページが検索結果に沢山出てきます。

出てくるほとんどのページが「GPIO3のピンにボタンを繋げて、GPIO3電圧の変化を監視して0Vになったらシャットダウンさせるというスクリプトを書く」といった内容なのですが、でも、実はそういった機能は最近のラズビアンにはもう既に実装されているそうです。

しかも、有効にするのには コンフィグファイルに1行だけ変更を加えてラズビアンを再起動すればれば良いだけです


1行の変更だけでシャットダウンボタンを有効にする方法

ラズビアンのシャットダウンボタンを有効にするのには /boot/config.txt というファイルに:

dtoverlay=gpio-shutdown,gpio_pin=3

👆という1行を加えれば良いだけで、後は再起動するだけです。

これで、ラズベリーパイのボード上にあるGPOI3のピンと GND (0V)ピンをショートするとラズビアンが強制的にシャットダウンする設定になります。

後は、押したらオンになる押しボタンスイッチをGPOI3ピンと GNDピンに繋げて、ボタンが押されたらGPOI3ピンがGNDにショートされる様にすればシャットダウンボタンの設定完了です。


因みに初期設定のラズビアンは、シャットダウンした状態でGPOI3をGNDにショートさせるとまた起動(wake-from-halt) するという設定なので、同じGPOI3のピンを使う事で、同じボタンでシャットダウンと再起動が出来ます。


やってみた

ラズベリーパイ:シャットダウンボタンを1行で有効化

PaspberryPi 1 B+ 以降のフルサイズのボードだと、GPIOとGNDのピンはボード上の40ピンの「GPIOヘッダー」(2.54mmピッチ)の中にあります。

たまたま、ネット通販で買ったATXコンピュータ用の外付けパワー&リセットボタンが近くにあって、2.54mmピッチのコネクターが付いていてぴったりだったでの実際に手元にあったPaspberryPi 1 B+でにシャットダウンボタンとして取り付けてみました。

ラズビアンはのバージョンを使いました。

繋げたコネクターはボタン本体の銀色の部分の電源ボタンに繋がっているので「スタートボタンでシャットダウン」というどこかのOSみたいな仕様になっていますが、一時的な処置ですのでw。。。

実際にボタンを繋げる場合はボードの種類によってピンの位置が違う場合もあるので個人でしっかりどのピンがGPIO3とGNDか確認して正しいピンに接続してください。間違った接続をしてボードを壊してしまう場合もありえるのですべて自己責任でお願いします。


GPIOピン

英語ですがラズベリーパイ財団のサイトにもGPIOのページもあったりするので参考までに

因みにこのページの情報によると、ターミナルで実行するとラズベリーパイのピンの名前を図解してくれる「pinout」コマンドというのもあるみたいです。


結果と結論

たった1行で外付けのボタンでシャットダウンを可能にする便利な機能ですが、ボタンを押したと同時にシャットダウンが始まるので間違えて押す事がない様に注意が必要です (頻繁に作業中のファイルを保存する癖をつけたりw)。

Stack Overflow」のgpio-shutdown関連の投稿にあったリンク 「https://www.stderr.nl/Blog/Hardware/RaspberryPi/PowerButton.html」によると、gpio-shutdownの設定は 以降リリースのラズビアンに実装されているそうで、有効にした場合は指定されたGPIOピン (規定値はGPIO3) が指定された値 (規定値はLo) になると「power-switching」というTAGがudevからsystemdに渡されて、systemdによってラズビアンのシャットダウンが始まるそうです。




デバイスツリーオーバーレイについて

上で/boot/config.txtのファイルに付け足した「dtoverlay」で始まる一行ですが、「dtoverlay」は「Device Tree (デバイスツリー)」の「Overlay (オーバーレイ)」の意味になります。 デバイスツリーは、ラズベリーパイなどのSoC (System on Chip)と呼ばれるタイプのコンピュータで、インターフェイスなどのハードウェアがどのように接続されているかを記述していて、それを元にカーネルがインターフェイスに繋がっているデバイスなどにアクセスすることが出来るそうです。

デバイスツリーオーバーレイはカーネル起動時に読み込まれたデバイスツリーを上書きする形でデバイスツリーの変更をします。 オーバーレイによって、カーネルを再コンパイルせずに、SoCのチップ上には存在するけれど使う様に設定されていなかったインターフェイスやデバイスを設定したり、既に設定されているインターフェイスやデバイスを変更・無効にすることを可能にしているそうです。

デバイスツリーについて、詳しくは英語ですがラズビアンの /boot/overlay/README のファイルを参照してください。



コメント

  1. Raspberry Piにこのボタンは良いアイデアですね。
    ご存じかとはおもいますが、このボタンに内蔵の赤LEDはRPiの状態表示に使えますね。ボタンと同じく、LED用にdtovelayを下記のように定義し、LEDの線をGPIOピンとGNDピン接続すれば、ボードにある緑LEDと同様にRPiのAcvtive時に点灯するようになります。
    dtoverlay=gpio-poweroff,gpiopin=18,active_low=1 
              (gpiopin=は接続GPIO番号に変更)
    RPiボードが見えないところにあるときやボード上の緑LEDが見にくいときに便利です。
    記事にはこのボタン、豪ドル$7.70 (約520円@1ドル67円換算)とありましたが、eBayを検索すると、Price:AU $10.43 JPY 850、と値上がりしているようです。
    そこで私の場合はGoogle AIY Voice Kit V1(https://aiyprojects.withgoogle.com/voice-v1/)
    を持ってましたので、このボックスの頭についている緑色のLED付き押し釦(ゲーム機のボタンのような形状)を使い、下記のようにAIY Kit V1の配線に合わせ定義しました。
    dtoverlay=gpio-shutdown,gpio_pin=23
    dtoverlay=gpio-poweroff,gpiopin=26,active_low=1
    ただShutdownのGPIOピンを3以外にするとShutdownはできますが再起動はできません。

    いつも楽しくそして参考に読ませてもらってます。

    ヨッシー

    返信削除

コメントを投稿