2013年7月25日木曜日

RaspberryPi #9 シャットダウンボタンをつくろう

RasberryPiは電源供給源のUSBに接続すれば起動する。
終了時はコマンドからshutdownしなくちゃいけない。
イヌ用の監視カメラをこしらえて実家に設置したところで、年老いた両親に
「リモートでログインしてshutdownコマンドを、、、」
などと言えるハズもない。

というわけで押すとシャットダウンしてくれるボタンを付けてみる。
ボタンを長押しして、LEDランプが消えたら電源抜いてOK、というもの。



用意するもの。
  • ブレッドボード 1つ
  • ジャンパワイヤ 3本
  • タクトスイッチ 1つ
  • 10KΩ抵抗 1つ

配線は参考図書「RaspberryPiで遊ぼう!」に掲載されているままなので省略。

次にRaspberryPi用のGPIOプログラミングライブラリであるwiringPiをインストールする。こちらも本に掲載のままなので省略。たぶんググればある。
で、以下のようなプログラムを書く。

#include <stdio.h>
#include <wiringPi.h>

#define BTN_PORT 25

int main(void) {
        int data = 0;
        int cnt = 0;

        if(wiringPiSetupGpio() == -1) return 1;
        pinMode(BTN_PORT, INPUT);

        while(1)  {
                data = digitalRead(BTN_PORT);
                if(data == 0) cnt = 0;
                else cnt++;

                if(cnt >= 10) {
                        system("shutdown -h now");
                        return 0;
                }
                usleep(300000);

        }
        return 1;
}


300ミリ秒(300000マイクロ秒)ごとにボタンの押下状態をチェックして
10回連続で押された状態(=3秒間の長押し)ならshutdownする、というだけのもの。
これを書いたら

cc -o off_button off_button.c -lwiringPi

としてコンパイルする。
ファイル名は適宜読み替えてください。

そして起動時にデーモンとして起動するように/etc/rc.lodalに以下のような記述を追加する(exit 0の前に追加)。

/home/pi/off_button &

とすれば起動時に先ほどのプログラムがデーモンとして起動するので
いつでもボタンを押せばシャットダウンしてくれるのだ。