スマートフォンからリモート撮影できるRaspberry Piデジカメ
最近赤外線デジカメを自作して撮影しています。
初回テスト撮影したときの感想にも書いたのですが、このままだとモニタもプレビュ画面もないので、非常に撮影が難しいです。以前に、モニタがついたデジカメも自作したことあるのですが、作るのが結構大変なのと、操作するボタンをたくさんつけるのは中々大変ですし、後からボタンを増やしたり位置を変えるのは非常に大変です。何よりモニタは高いです。
そこで良さそうだなと思うのが、モニタや操作ボタンのないカメラにWiFiでアクセスして、スマートフォンをモニタや操作画面として使うような最近流行りのレンズスタイルカメラのアイディア。SONYのQXシリーズとかOLYMPUSのAIR01とかがありますね。
こういうのをまともに作ろうとするとiPhoneやAndroidアプリをつくる必要があって、スマホごとにアプリを作ったり、作るための開発環境はプログラム言語の知識が必要だったり、特にiPhoneの場合はAppleに登録して上納金を支払う必要があったりと非常に大変なのですが、Raspberry Piの場合はWebIOPi
やmjpg-streamer
、HTML5/Javascript
という複数の技術を組み合わせることで、スマートフォンの標準のブラウザからRaspberry Piにアクセスして制御することが可能になります。
図にするとこんな感じね(多分)
厳密には、この場合だとブラウザ毎に色々細かく変える必要があったり、できないことがあったりと色々あるのですが、個人が手軽にスマートフォンからRaspberry Piを制御するにはかなり現実的な選択肢かなと思います。
スマートフォンからRaspberry Piにアクセスする方法は、WebIOPi
以外にもNode.js
やGoogle Coder
等あるみたいなので、興味ある方は他も試してみるとよいと思います(まだ私は手を出していません)。
ここらへんに関しては、以前ロボットを作った時に参考にした、「Raspberry Piで学ぶ電子工作」という本と作者のブログでの補足情報がベースになっています。特に作者のブログの補足にはRaspberry Piの最新パッケージのJessie対応まで追記されていました。アフターケアの万全ぷりに頭が下がります。名著なのでRaspberry Piでモノ作りする人は是非買いましょう。
Raspberry Piで学ぶ電子工作 超小型コンピュータで電子回路を制御する (ブルーバックス)
- 作者:金丸 隆志
- 発売日: 2014/11/21
- メディア: 新書
以下はスマートフォンからリモート操作できる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.conf
のDefaultTimeoutStopSec
の秒数(デフォルト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」操作方法
操作方法です。完成した図は以下です。
Raspberry Piの電源を入れたら、スマートフォンのブラウザでRaspberry Piにアクセスしましょう。Raspberry Piのホスト名を例えばhendigi
としていたら、ブラウザにhendigi.local:8000/raspicam_wifi/
と入力すると、パスワード入力画面が出てくるので、自分で設定したWebIOPiのユーザ名とパスワード入力すると、RaspicamWiFiにアクセスできます。
RaspicamWiFiの操作画面。色が変なのは赤外線フィルタをつけているからです。
左上のMode
は、現在のモードを表していてAuto
、Preview
、Manual
の3つあります。といってもまだManual
は実装してないのでAuto
と同じです。PhotoNumbは撮った写真の枚数です。
画面のドラえもんの尻尾みたいな赤い丸は、シャッターボタンのつもりです。ボタンを押すと写真が撮れます。というか画面のどこ押しても写真が撮れます。下のShutter
というボタン押しても写真が撮れます。故スティーブ・ジョブズが見たら「Stay hungry, Stay foolish!!」と叫びながらぶん殴ってきそうな最低なインターフェースですね。ちなみにその右のShutdown
というボタンを押すと、Raspberry Piがいきなりシャットダウンします。ここらへんまでくると、スティーブ・ジョブズもお漏らししてしまいそう。
左下のChangeMode
を押すと、モードが切り替わります。一回押すとMode
がPreview
となって、過去にとった写真が表示されます。
こんな感じね
左右の緑矢印をタッチすると、以前撮った写真を表示できます。PhotoNumb
で、何回目に撮った写真が表示されているかが分かります。ちなみに今は何もエラー処理してないので数字は平気でマイナスとか表示します。凄いダロウ!
気を良くしてもう一度、ChangeMode
を押すと、Manual
モードに切り替わります。といってもまだ何もつくっていないのでAuto
と全く同じ。最低ですね。もう一回ChangeMode
を押すとちゃんとAuto
に戻ります。凄いダロウ!
Autoに戻る。偉い!
「RaspicamWiFi」ソースコード
Githubで公開しています。
好きに使ってください。眺めるもよし、cloneもよし、pull requestも歓迎です。
まとめ
「RaspicamWiFi」未完成ながら、一応動くものはできたので公開してみました。エラー処理やら、マニュアルモード追加やら、新機能追加等まだ色々あるのですが、キリがなくなってしまうので。一緒に開発してくれる危篤な方がいたら大歓迎です。というかどんどん勝手に作って欲しいです。私が使うので。
参考リンク
Raspberry Piで学ぶ電子工作 補足情報
「Raspberry Piで学ぶ電子工作」作者の方の補足情報。素晴らしいアフターサービス