Raspberry Pi を使って、小学生の自由研究にも活用できる定点観測システムを作ってみましょう。
Raspberry Pi に ウェブカメラを接続すれば、簡単なプログラミングで実現できます。
さっそく試してみましょう。
ウェブカメラ
Raspberry Pi に接続する、USB接続のウェブカメラを導入しましょう。
Raspberry Piで使用できるウェブカメラについては、"相性"のようなものもあるらしく、接続しても使用できないモデルもあるようです。ご購入に際しては、ネットで調べてみて実績があるものを選ぶのが無難です。
少なくとも、以下の製品は実績があるようです。
私も使ってみたことがあります。比較的安価ですので、試しに導入するモデルとしてはよいと思います。
ただし、120万画素で固定フォーカス、焦点距離は40cm以上ということで、撮影対象に合うかどうかはご自身でご判断ください。
fswebcam のインストール
上記のようなウェブカメラを購入し、USB接続すると、カメラ自体はたいていそのまま認識してくれます。
でも、そのカメラを実際に使用するには、カメラを動かすツールが必要です。
代表的なものに、fswebcam というツールがあります。
これは自分でインストール必要があります。やってみましょう。
"○○ターミナル"とか"○○ Terminal"とか"○○端末"などという名前のツールがあると思いますので、まずはそれを起動しましょう。
Ubuntu MATEでは、アプリケーション→システムツールとたどると、"MATE端末"というツールがあると思います。これを起動します。
起動後、以下のコマンドを打ち込みます。(インターネットにつながっていることが条件です。有線でも無線(Wifi)でもかまいません。)
1 |
sudo apt-get install -y fswebcam |
この実行により、fswebcamというツールがインストールされます。
上記のC270というウェブカメラなら、このツールをインストールすればすぐに撮影できるはずです。
試しに、上記の続きに次のコマンドを打ってみましょう。ただし、ウェブカメラは、先に Raspberry Pi とUSB接続しておいてください。
1 |
fswebcam test.jpg |
すると、カレントディレクトリ(コマンドを実行したときに自分がいるディレクトリ)に、test.jpg というファイルができたと思います。
これを、標準添付の画像ビューアで開いてみると、撮影できていることがわかると思います。
fswebcam には、さまざまなオプションがあります。まず設定するとしたら、画面の解像度でしょうか。
1 |
fswebcam -r 1280x720 test2.jpg |
というように、"-r 1280x720" で解像度を1280x720に指定できます。
オプションは豊富で、確認するには "fswebcam -h" や、詳細には "man fswebcam"とやれば表示されますので、いろいろ調べることができます。
英語が苦手だ、という方や、よく使うオプションの簡潔な説明がほしいという方は、ネットで"fswebcam"を調べてみましょう。有名なツールなので、使用方法の情報はたくさんあります。
私は、解像度や、タイムスタンプ表示、スキップフレーム数などを指定しています。
スポンサーリンク
定点観測システムを作る
ここまで用意できたら、あとは簡単なプログラミングで定点観測システムを実現できます。
定点観測システムというと大げさですが、要はこのウェブカメラを観測対象に向けて固定し、上記のfswebcam というコマンドを定期的に実行すればよいのです。
プログラム言語は何でもよいですが、せっかくですので前回紹介した以下の記事:
で用いた sh スクリプトを使ってみます。
1 2 3 4 5 6 7 8 9 10 11 12 |
#!/bin/sh INTERVAL_TIME=1m INDEX=0 JPG_DIR=jpg while : ; do FNAME=$JPG_DIR/image_$INDEX.jpg fswebcam -r 1280x720 $FNAME sleep $INTERVAL_TIME INDEX=`expr $INDEX + 1` done |
上記のプログラムが、定点観測を実現するサンプルプログラムです。
簡単に解説します。
まず1行目、これは sh スクリプトの書き出しのおまじないでした。ここでは触れないでおきます。
3行目から5行目は変数の設定です。
INTERVAL_TIMEは、写真をとる間隔の時間です。1mとあるのは1分を表します。30分なら30mですね。
mは分を表しますが、sなら秒、hなら時間という指定になります。
INDEX は写真のインデックスです。後述します。
JPG_DIR は撮影した画像を格納するディレクトリ名です。ここではjpgとします。
7行目ですが、これは無限ループを表します。shスクリプト特有の指定方法です。
8行目は、これから写真撮影を行うにあたり、写真のファイル名を作って、変数 FNAME に入れています。写真を何枚も撮りますが、同じファイル名だと古い写真が上書きされるので、ここでインデックスを付けて1まいづつ区別します。
9行目で fswebcam を実行しています。先ほど試した通りですね。
10行目では sleep というコマンドを実行しています。これは、sleep コマンドのうしろに書いた時間だけ待つコマンドです。$INTERVAL_TIME と書いていますが、ここには "1m" という文字列が入っていて、これは1分を表すのでした。したがって、このsleep コマンドでは1分待ちます。
11行目は前回の上記記事で説明したとおり、INDEXという変数の値を1だけ加算しています。
ここまで書いた通り、この無限ループでは、写真を1枚撮り、1分待つという動作を繰り返します。その間、INDEXという変数を1だけ加算し、この値を元に次の写真のファイル名を作っています。
実行する前に、mkdir やファイルマネージャで、jpgというディレクトリ(Windowsでいうフォルダ)を作成しておいてください。
実行すると、写真は jpg の下に格納されていきます。
どうでしょうか?プログラムの基本要素だけで、定点観測を行うシステムを作ることができました。
例えば小学生の自由研究で、植物や動物の観察や天候の観察などを行うための実験機材として、十分に役目を果たしてくれると思います。
なお、撮影を止めるには、Ctrl-C (Ctrlキーを押しながらcキーを押す)です。
サンプルプログラムの改造
さて、上記のプログラムですが、試しに使ってみるといろいろ使いにくいところがでてくると思います。
- 撮影を止めるには、Ctrl-Cを押さなくてはならない。
- 撮影時間の間隔を変えるには、INTERVAL_TIME の値を編集すればよいとはいえ、いちいちエディタで書き直さないといけない。
- ウェブカメラがときどきエラーを出すことがあり、その度に撮影が失敗する。
- Raspberry Pi が謎の文字列をたくさん出力して(カーネルパニック)止まったときに撮影が止まってしまう。
前者の2つは、shスクリプトのプログラミングのレベルを上げるよい練習です。もしこれらをなんとかしたいと思ったら、ぜひ調べてみて解を探してみましょう。
例えば、ループ回数を100回と指定したら100回で止まる、その回数は実行時にオプションとして指定できるようにする、夜間は撮影しないようにする、INTERVAL_TIME の値をオプションで指定できるようにする、などです。
いずれも、もちろん sh スクリプトのプログラミングの範囲でできます。
後者の2つはもっと高度な問題ですが、C270などのウェブカメラを長時間使っていると、いずれ上記のような問題に遭遇するかもしれません。
もしこのような不具合に遭遇したらどうするか?完璧ではありませんが、いずれも解はあります。ぜひ挑戦してみてください。いずれ機会があれば解説したいと思います。