読者です 読者をやめる 読者になる 読者になる

自作デジカメ制作 【ソフトウェア編その1】 ボタンでシャットダウンできるようにしよう

ソフトウェア開発しよう!

 初めて読む人はまず下記の記事から読むとよいかもしれません。

 ハードウェア、ソフトが無ければ只の箱。というわけで魂となるべきソフトを作っていきます。ソフトウェア編は、私が満足するまで続きます。すぐ終わるかもね。

シャットダウンボタンをつけよう!

 今Raspberry Piの開発環境は、下図のような感じです。

f:id:karaage:20140920162612j:plain

 このままだと電源切るとき、いちいちログインしてシャットダウンしないといけません。もしネットの調子が悪くログインできないときは、shutdownコマンド打つためにわざわざUSBキーボードをなかよしデジカメに繋がないといけなくてめんどくさいので、最初になかよしデジカメのシャッターボタンでシャットダウンできるようにしてやりましょう。シャッターだけにね☆
 以下はほとんど参考サイトのリンク先のコピペです。

シャットダウンデモ動画

 まずは早速完成物のデモ動画。こんな感じだお。音量上げると私の生々しい息づかいが聞こえるのでミュート必須。あと、最初USBコネクタの向き間違えているのも早送りして下さい。編集?何それ美味しいの?


シャットダウンスクリプト作成

 スクリプトをつくりましょう。自分でつくった管理者権限で実行するようなスクリプトは /usr/local/sbin に置くのがLinuxの作法らしいので /usr/local/sbin にcamera_shutdown.shというスクリプトをつくります。
 ホームディレクトリにSFTPでcamera_shutdown.shを作ったら以下のようにコピーしてやりましょう。

$ sudo cp camera_shutdown.sh /usr/local/sbin/camera_shutdown.sh

 camera_shutdown.shの中身は以下ね。WatchGpioNo =17 というところの数字を変えれば、好きなスイッチをシャットダウンボタンにできるよ。


shutdown script for Nakayoshi Camera

 実行権限を与えてやりましょう。

$ sudo chmod 755 /usr/local/sbin/camera_shutdown.sh


 とりあえず一回テスト。

$ sudo /usr/local/sbin/camera_shutdown.sh &

 最後の&はバックグラウンドで実行するという意味ね。これで、この後いつでもGPIO17と繋がっているスイッチを5秒くらい押すとシャットダウンできるようになります。試してみてシャットダウンできたら成功。

シャットダウンスクリプト自動起動

 このままだと、最初にシャットダウンコマンドを毎回実行しないといけないので、自動でシャットダウンコマンドが起動するようにします。
デジタルカメラを自作してみよう【Raspberry Pi Setup編】 - karaage. [からあげ]でtightvncserverを自動起動設定したのと同じ要領で設定してやります。

 最初に /etc/init.d に camera_shutdown というファイルを作成します。

$ sudo vi /etc/init.d/camera_shutdown

 camera_shutdownの中身は以下ね。

### BEGIN INIT INFO
# Provides: camera_shutdown
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start Camera Shutdown Server at boot time
# Description: Start Camera Shutdown Server at boot time
### END INIT INFO
#! /bin/sh
# /etc/init.d/camera_shutdown
PIDFILE=/var/run/camera_shutdown.pid
case "$1" in
        start)
                if [ -f $PIDFILE ]; then
                        echo $PIDFILE exists.
                        exit 1
                fi
                start-stop-daemon -S -x /usr/local/sbin/camera_shutdown.sh -b -m -p $PIDFILE
                ;;
        stop)
                if [ ! -f $PIDFILE ]; then
                        echo $PIDFILE not found.
                        exit 1
                fi
                start-stop-daemon -K -p $PIDFILE
                rm $PIDFILE
                ;;
        *)
                echo "Usage: /etc/init.d/shutdown-button {start|stop}"
                exit 1
                ;;
esac
exit 0


事前にテストしてみましょう。実行権限与えて

$ sudo chmod 755 /etc/init.d/camera_shutdown

実行

$ sudo /etc/init.d/camera_shutdown start
$ sudo /etc/init.d/camera_shutdown stop

 エラー無く実行ストップできたらOK

 仕上げに以下のコマンドで自動起動を設定します。

$ sudo update-rc.d camera_shutdown defaults

update-rc.d: using dependency based boot sequencing
と表示されたらOK。warningとかerror出たら、表示されたエラーメッセージでググったり、参考リンクで調べてみて下さい。

 一旦再起動しましょう。起動したらちゃんと camera_shutdown.sh スクリプトが動いているか確認してみましょう。

$ ps aux | grep camera_shutdown

 今動いているプロセスを 'camra_shutdown'という単語で検索してます。以下みたいな表示が出たらOKかな。

root      1962  0.8  0.9   6608  3640 ?        S    22:21   0:00 /usr/bin/python /usr/local/sbin/camera_shutdown.sh
pi        2274  0.0  0.2   4100   872 pts/0    S+   22:21   0:00 grep --color=auto camera_shutdown

 後は実際にボタン5秒くらい押してシャットダウンされることを確認して下さい。

 今後、シャットダウン機能が邪魔になったら以下のコマンドで外してやれば自動起動しなくなります。

$ sudo update-rc.d camera_shutdown remove

Question:なんでこんなことするの?

Answer:SDカードは急に電源切るとぶっ壊れるものだからです

 なんでこんな面倒くさいことするの?いきなり電源切っちゃえばいいじゃん!という人もいるかと思いますので一応説明します。Raspberry PiではOSや色んなデータをSDカードに保存しています。そのSDカードの規格をみるのです!
 SDカードの仕様はSD Associationという団体に加入し、上納金を支払わないと見れないのですが、バンピー向けに簡易仕様が公開されています。

https://www.sdcard.org/jp/downloads/pls/simplified_specs

 その中のPhysical Layer Simplified Specificationという仕様をよく読むと、SDカードはデータを書き込み終わってから250ms(SDXCだと500ms)電源を保持しないといけないのです。そして書き込んでいる途中や250ms以内に電源切ると…恐ろしいことに書き込んでいるデータはおろか、その他のデータまで破壊されてしまう可能性があるのです。OSが破損したら、最悪起動できなくなるというわけです。恐ろしや恐ろしや。
 そのためにちゃんとシャットダウンしてから電源を切るのです。だからデジカメとかもいきなりバッテリ抜くと写真データぶっ壊れることあるから注意してね☆まあjpegは多少壊れても普通に表示しちゃうので気づかないかもですが。どうしても急な電源の遮断が避けられないようなシステム(車載とかね)だと、電源の急な電源切断に対応したSDカードがあるので、そういうのを使うというのも一つの手ですが高いのであんまりオススメはできません。

 以下とかね。

参考リンク

 偉大な先人に本当に感謝です。

Make: Japan | Raspberry Piにシャットダウンボタンを追加する方法

Programminblog: Raspberry Piにshutdownスイッチ追加
 シャットダウンスクリプトはここのやつからLEDの点灯部分を削除しただけです。

[Jetty 9] Raspbian on Raspberry Pi における起動スクリプト | hirooka.pro
 自動起動で色々トラブったとき、超参考になりました。