我が家にはハムスターが2匹います。
とても可愛いので、いつでも見られるようにしたい!という建前でカミさんに監視カメラを設置する許可をもらったので、Raspberry Piを使ってカメラ動画を配信する仕組みを作ってみました。
実は訳あってすでに撤去していますが、カメラの明るさを変えるなど、自分なりに工夫したこともあったので、ここに記します。
(ここに記載していることはRaspberry Piに特化したものではありません。Ubuntu など普通のパソコンで動作するLinuxにも使える話です。)
下記の流れで作業を行いました。
カメラを選定する
まずカメラを選びます。Raspberry PiはUVCに対応したUSBカメラなら刺すだけで使えますので、たまたま最寄りのヤマダ電機で500円で叩き売られていた下記のカメラをゲットしました。
オートフォーカスの200万画素です。500円の割には結構きれいに撮れます。
ちなみに、UVC対応のカメラは「USBに刺すだけで使えます」と書いてあります。

【2010年モデル】ELECOM WEBカメラ 200万画素 1/4インチCMOSセンサ オートフォーカス マイク内蔵 イヤホンマイク付 ホワイト UCAM-DLB200TAWH
- 出版社/メーカー: エレコム
- 発売日: 2010/04/15
- メディア: Personal Computers
- クリック: 1回
- この商品を含むブログを見る
カメラ動画配信ソフトを選ぶ
カメラ動画の配信には、mjpg-streamerを使います。
mjpg-streamerの導入等については、下記のWebページを参考にさせていただきました。
延長ケーブルを導入する
うちはRaspberry Piをテレビにつなげています。Kodiを使うためです。
しかし、ハムスターのケージはテレビから離れているので、カメラのケーブルが届きません。そこで延長するケーブルが必要になります。しかし、ただの延長ケーブルでは5mまでしかカメラの映像信号が届きません。
そこでリピーターケーブルの出番です。これを使うと最大20mまでUSBケーブルを延長できます。(下記のケーブルは5mですが、3本つなぐと20mまでいけるらしいです。)

iBUFFALO USB2.0リピーターケーブル (A to A) 5.0m ブラックスケルトン BSUAAR250BS
- 出版社/メーカー: バッファロー
- 発売日: 2012/05/31
- メディア: Personal Computers
- クリック: 1回
- この商品を含むブログを見る
mjpg-streamerを起動する
mjpg-streamerはWebサーバー機能をもっているので、下記のように起動するだけで、ブラウザで配信動画が見れます。
./mjpg_streamer -i "./input_uvc.so -f 1 -r 640x480 -d /dev/video0 -y -n" -o "./output_http.so -w ./www -p 8080 -c <ユーザー名>:<パスワード>" &
各オプションについては、下記のWebページにまとめていただいていますので、参考にご覧ください。
Devel/電子工作/RaspberryPi/ウェブカメラでストリーミング - cubic9.com
かいつまんで言うと、-f は1秒当たりのフレーム数、-r は解像度、 -w はコンテンツの場所、-p はポート番号、-c はBASIC認証のユーザー名とパスワードです。
カメラの明るさを変えられるようにする
上記だけでもブラウザを使って配信動画を見られますが、問題がひとつ。
私の使ったカメラは明るさの自動調整ができないので、朝方など、部屋が暗いときの明るさに合わせると昼間は真っ白に、昼間の明るさに合わせると朝は真っ暗になってしまいます。
そこで、CGIを使ってカメラ動画のWebページから明るさを変更可能にしました。
CGIを使うために apache を使います。
apacheで配信するカメラの動画ページのhtml(抜粋)は以下のような感じです。
htmlに詳しくないのでおかしなところもあるかもしれませんが、一応動きました。
テキスト型フォームに1~5000の数値を入れて「変更」ボタンを押すと、CGI(set-exposure.cgi)が実行され、明るさが変わります。
<head>
<title>Hamster's home</title>
</head>
<body>
<h2>動画</h2>
<a href="index.html">戻る</a>
<center>
<img src="<Raspberry PiのURL>:8080/?action=stream" width="100%" height="100%">
</center>
<input type="button" value="更新" onClick="window.location.reload()"><FORM ACTION="set-exposure.cgi" METHOD="GET">
露出(1-5000:5000が最も明るい): <INPUT TYPE="text" NAME="exposure" SIZE="4"><BR>
<INPUT TYPE="submit" VALUE="変更">
</FORM></body>
set-exposure.cgiの中身は以下です。
#!/bin/sh
echo "Content-Type: text/html; charset=utf-8\n"
echo "<html>"
echo "<head><title>設定変更中</title></head>"
echo "<body>"
echo "<p>"
echo "設定変更中です。少しお待ちください。"
EXPOSURE=`echo $QUERY_STRING | awk -F "=" '{print $2}'`
/home/pi/src/rcommand/rcmdcl <Raspberry Pi自身のIPアドレス> 8989 "sudo /home/pi/mjpg-streamer/set-uvc-exposure.sh $EXPOSURE"
echo '<meta http-equiv="refresh" content="5;URL='$HTTP_REFERER'">'
echo "</p>"
echo "</body>"
echo "</html>"
この中で注目していただきたいのは、"/home/pi/src/rcommand/rcmdcl …"の行です。
ここで何をやっているかというと、rcmdclという自作のアプリでソケット(TCP/IP)によりroot権限で起動した他のアプリ(rcmdsvr)と通信し、rcmdsvrに明るさ変更のコマンドを実行させているのです。
こんな回りくどいことをやっているのは、カメラの明るさを変えるコマンドv4l2-ctlの実行にroot権限が必要なためです。apacheはrootで起動されていないため、cgiもroot権限がなく、直接cgiからv4l2-ctlを実行することができません。
そこで、rcmdclから、rcmdsvrに実行してもらうコマンド"sudo /home/pi/mjpg-streamer/set-uvc-exposure.sh $EXPOSURE"を通知し、それを受けたrcmdsvrはそのままsystem()関数でそれを実行します。
ちなみに、rcmdclとrcmdsvrはC言語で作りました。
明るさを変えるコマンドを実行する set-uvc-exposure.sh の中身は以下です。
#!/bin/sh
v4l2-ctl -d /dev/video0 --set-ctrl exposure_auto=1
v4l2-ctl -d /dev/video0 --set-ctrl exposure_absolute=$1
以上が、ハムスターがいつでも見られるように私がやったことです。
外出先からでも見れられるようにしていましたが、結局私しか見ていませんでした。。
これから監視カメラを作ろうと思っている方の参考になれば幸いです。