スマートフォンからリモート撮影できるWiFi対応Raspberry Piデジカメ「RaspicamWiFi」を作ってみた

f:id:karaage:20151115151145j:plain:w640

スマートフォンからリモート撮影できるRaspberry Piデジカメ

 最近赤外線デジカメを自作して撮影しています。

 初回テスト撮影したときの感想にも書いたのですが、このままだとモニタもプレビュ画面もないので、非常に撮影が難しいです。以前に、モニタがついたデジカメも自作したことあるのですが、作るのが結構大変なのと、操作するボタンをたくさんつけるのは中々大変ですし、後からボタンを増やしたり位置を変えるのは非常に大変です。何よりモニタは高いです。

 そこで良さそうだなと思うのが、モニタや操作ボタンのないカメラにWiFiでアクセスして、スマートフォンをモニタや操作画面として使うような最近流行りのレンズスタイルカメラのアイディア。SONYのQXシリーズとかOLYMPUSのAIR01とかがありますね。

 こういうのをまともに作ろうとするとiPhoneやAndroidアプリをつくる必要があって、スマホごとにアプリを作ったり、作るための開発環境はプログラム言語の知識が必要だったり、特にiPhoneの場合はAppleに登録して上納金を支払う必要があったりと非常に大変なのですが、Raspberry Piの場合はWebIOPimjpg-streamerHTML5/Javascriptという複数の技術を組み合わせることで、スマートフォンの標準のブラウザからRaspberry Piにアクセスして制御することが可能になります。

f:id:karaage:20151115160041j:plain:w640
 図にするとこんな感じね(多分)

 厳密には、この場合だとブラウザ毎に色々細かく変える必要があったり、できないことがあったりと色々あるのですが、個人が手軽にスマートフォンからRaspberry Piを制御するにはかなり現実的な選択肢かなと思います。
 スマートフォンからRaspberry Piにアクセスする方法は、WebIOPi以外にもNode.jsGoogle Coder等あるみたいなので、興味ある方は他も試してみるとよいと思います(まだ私は手を出していません)。
 ここらへんに関しては、以前ロボットを作った時に参考にした、「Raspberry Piで学ぶ電子工作」という本と作者のブログでの補足情報がベースになっています。特に作者のブログの補足にはRaspberry Piの最新パッケージのJessie対応まで追記されていました。アフターケアの万全ぷりに頭が下がります。名著なのでRaspberry Piでモノ作りする人は是非買いましょう。

 以下はスマートフォンからリモート操作できるRaspberry Piデジカメこと「RaspicamWiFi」の作り方になるので、ここまで読んで激しく興味湧いた。作ってみたいという人のみ続きを読んでいただればよいかと思います。

RaspicamWiFi基本セットアップ

 以下を参考にしてください。

 注意点は下記です。

  • カメラモジュールLED消灯は設定しましょう
  • 必要なソフトで紹介しているソフトは特に入れなくても大丈夫です
  • カメラを持ち運ぶために電源にはモバイルバッテリを使用するとよいです


 2016/09/13追記

 Raspberry Pi Zero + Raspbian Jessie Liteの組み合わせでも動作確認できました。セットアップは以下参照下さい。

 WebIOPiのために、python3をインストールしておく必要があるので注意して下さい。

WebIOPiセットアップ

 ブラウザ経由でRaspberry Piのコマンドを実行するために必要なWebIOPiをセットアップ。

WebIOPiインストール

 WebIOPiを以下のサイトからダウンロード。最新版(0.7.1)です。

WebIOPi - Browse Files at SourceForge.net

 ダウンロードしたファイル(WebIOPi-0.7.1.tar.gz)をRaspberry Piにファイルを転送します(SFTP等で)。その後、ファイルをraspberry pi上で以下のコマンドで解凍してやりましょう。

$ tar xvzf WebIOPi-0.7.1.tar.gz

 次にパッチを当てます。同じフォルダで以下の要領でパッチを当てれば良いです。

$ wget https://dl.dropboxusercontent.com/u/69652790/bb/WebIOPi-0.7.1.patched.tgz
$ tar xvzf WebIOPi-0.7.1.patched.tgz
$ cd WebIOPi-0.7.1/
$ sudo ./setup.sh

 知らずに普通にインストールしちゃったーという人も、もう一回パッチを当てて setup.shを走らせれば正しくインストールされるようです。パッチといっても2行くらい書き換えるだけみたいなので、ネットで調べて手動でやってもよいかもしれません。お好きな方で。

 後は以下でWebIOPiのコンテンツディレクトリに一般ユーザ(以下はデフォルトのpiの例)が書き込めるように権限を設定してやります

$ sudo chown -R pi /usr/share/webiopi/htdocs

 以下のコマンドでパスワードの設定もお忘れなく

$ sudo webiopi-passwd

WebIOPi動作確認

 ここまでできたら起動して動作確認しましょう。Raspbian Jessieでは、サービスとして起動できるように以下コマンドで準備してやる必要があります。

$ wget https://raw.githubusercontent.com/karaage0703/raspberry-pi-setup/master/service/webiopi.service
$ sudo mv webiopi.service /etc/systemd/system/

 後は以下コマンドで起動。

$ sudo systemctl start webiopi

 動作確認のため、Raspberry PiのWebIOPiにアクセスします。例えば IPアドレスが192.168.0.1の場合は、ブラウザでhttp://192.168.0.1:8000/にアクセス。設定したユーザー名とパスワードを入力するとWebIOPiの画面が表示されます。

 うまく接続できなかった場合は以下コマンドでwebiopiが起動しているか確認しましょう。

$ sudo systemctl start webiopi
もしくは
$ ps aux | grep webiopi

 起動できていなかったら、以下で起動してエラーメッセージを確認してみましょう。

$ sudo /usr/bin/python3 -m webiopi -l /var/log/webiopi -c /etc/webiopi/config

WebIOPi自動起動設定

 一通り動作確認ができたら自動起動するように設定しましょう。Raspbian Jessieからは自動起動に/etc/init.dは使わずsystemdを使うことが推奨されています。以下を実行するとWebIOPiを自動起動できるようになります。

$ sudo systemctl enable webiopi

WebIOPi終了設定(2015/11/22追記)

 シャットダウンのとき、A stop job is runningと表示が出て終了まで90秒待たされることがよくあります。調べたのですが、根本の原因はよくわかりませんでした(systemdのバグ?)。暫定対策として/etc/systemd/system.confDefaultTimeoutStopSecの秒数(デフォルト90)を調整する(とりあえず5にしました)ことで対処しました。ちょっと気持ち悪い。

WiringPi2-Pythonインストール

 今回はWiringPi使用していないので不要なのですが、今後の拡張のために入れておきます。WebIOPiのためにpython3対応してやる必要があります。WebIOPiをインストールした後にインストールするのがよいそうです。

$ git clone https://github.com/Gadgetoid/WiringPi2-Python.git
$ cd WiringPi2-Python
$ sudo python setup.py install
$ sudo python3 setup.py install

mjpeg-streamerセットアップ

mjpeg-streamerインストール

 以下のコマンドでmjpeg-streamerをインストール。

$ sudo apt-get update
$ sudo apt-get install cmake libjpeg-dev
$ git clone https://github.com/jacksonliam/mjpg-streamer.git mjpg-streamer
$ cd mjpg-streamer/mjpg-streamer-experimental
$ make
$ cd ..
$ sudo mv mjpg-streamer-experimental /opt/mjpg-streamer

 後は「Raspberry Piで学ぶ電子工作」の作者様が公開されている素晴らしいスクリプトを使えば簡単に起動できます。gistを使って以下のコマンドでスクリプトを/usr/local/bin/にインストールするようにしました。

$ git clone https://gist.github.com/271f93b212b14d5d04e0.git stream
$ cd stream
$ chmod 755 stream.sh
$ sudo cp stream.sh /usr/local/bin/

 これで以下コマンド実行すればmjpg-streamerが実行するようになります。

$ stream.sh

mjpeg-streamer動作確認

 動作確認は、例えば IPアドレスが192.168.0.1の場合は、ブラウザでhttp://192.168.0.1:9000/にアクセスするだけ。mjpg-streamerの画面が表示されたら成功です。

mjpeg-streamer自動起動設定

 systemdを使って起動したいところですが、私がよくわかってないので手っ取り早く/etc/rc.localを使います。ここに自動起動したいコマンドをかいておけば何でも自動起動してくれるすぐれものです。以下コマンドで/etc/rc.localを編集します。

$ sudo vi /etc/rc.local

 終了を表すexit 0の手前に実行したいスクリプト。今回だとstream.shを以下のように記載します。

stream.sh
exit 0

 これで再起動すれば自動的にmjpeg-streamerが起動するようになります。

Raspberry PiとWiFiでアドホック接続

 以下の記事の通り設定すればOK。

 よくわからない人は、とりあえずRaspberry Piをネットに繋いでIPアドレスを取得できるようにしておけばよいです。

「RaspicamWiFi」ソフトインストール

 ここまででようやく事前準備が完了したので、いよいよソフトインストール。一旦以下コマンドでWebIOPiを停止します。

$ sudo systemctl stop webiopi

 次に以下コマンドでファイルをコピー(clone)。

$ cd /usr/share/webiopi/htdocs
$ git clone https://github.com/karaage0703/raspicam_wifi.git

 以下コマンドでWebIOPiの設定ファイルを編集

$ sudo vi /etc/webiopi/config

 以下の行を変更。

#myscript = /home/pi/webiopi/examples/scripts/macros/script.py

 変更内容は以下。先頭の#をちゃんと削除しようね。

myscript = /usr/share/webiopi/htdocs/raspicam_wifi/script.py


 あとは以下コマンドで再起動すれば自動で起動する(はず)

$ sudo shutdown -r now

 うまくいかないときは以下コマンドでデバッグしてみましょう。

$ webiopi -c /etc/webiopi/config -d

「RaspicamWiFi」操作方法

 操作方法です。完成した図は以下です。

f:id:karaage:20151115151145j:plain:w640

 Raspberry Piの電源を入れたら、スマートフォンのブラウザでRaspberry Piにアクセスしましょう。Raspberry Piのホスト名を例えばhendigiとしていたら、ブラウザにhendigi.local:8000/raspicam_wifi/と入力すると、パスワード入力画面が出てくるので、自分で設定したWebIOPiのユーザ名とパスワード入力すると、RaspicamWiFiにアクセスできます。

f:id:karaage:20151115134510j:plain:w480
 RaspicamWiFiの操作画面。色が変なのは赤外線フィルタをつけているからです。

 左上のModeは、現在のモードを表していてAutoPreviewManualの3つあります。といってもまだManualは実装してないのでAutoと同じです。PhotoNumbは撮った写真の枚数です。
 画面のドラえもんの尻尾みたいな赤い丸は、シャッターボタンのつもりです。ボタンを押すと写真が撮れます。というか画面のどこ押しても写真が撮れます。下のShutterというボタン押しても写真が撮れます。故スティーブ・ジョブズが見たら「Stay hungry, Stay foolish!!」と叫びながらぶん殴ってきそうな最低なインターフェースですね。ちなみにその右のShutdownというボタンを押すと、Raspberry Piがいきなりシャットダウンします。ここらへんまでくると、スティーブ・ジョブズもお漏らししてしまいそう。

 左下のChangeModeを押すと、モードが切り替わります。一回押すとModePreviewとなって、過去にとった写真が表示されます。

f:id:karaage:20151115134514j:plain:w480
 こんな感じね

 左右の緑矢印をタッチすると、以前撮った写真を表示できます。PhotoNumbで、何回目に撮った写真が表示されているかが分かります。ちなみに今は何もエラー処理してないので数字は平気でマイナスとか表示します。凄いダロウ!
 気を良くしてもう一度、ChangeModeを押すと、Manualモードに切り替わります。といってもまだ何もつくっていないのでAutoと全く同じ。最低ですね。もう一回ChangeModeを押すとちゃんとAutoに戻ります。凄いダロウ!


f:id:karaage:20151115134523j:plain:w480
 Autoに戻る。偉い!

「RaspicamWiFi」ソースコード

 Githubで公開しています。

 好きに使ってください。眺めるもよし、cloneもよし、pull requestも歓迎です。

まとめ

 「RaspicamWiFi」未完成ながら、一応動くものはできたので公開してみました。エラー処理やら、マニュアルモード追加やら、新機能追加等まだ色々あるのですが、キリがなくなってしまうので。一緒に開発してくれる危篤な方がいたら大歓迎です。というかどんどん勝手に作って欲しいです。私が使うので。

参考リンク

Raspberry Piで学ぶ電子工作 補足情報
 「Raspberry Piで学ぶ電子工作」作者の方の補足情報。素晴らしいアフターサービス

関連記事