Raspberry Piと公式カメラモジュールで静止画の撮影は「raspistill」、そして動画撮影は「raspivid」、ストリーミングは「MJPG-streamer」というのが定番です。
そんな折り、友人から簡易の監視カメラを作れないか? と相談を受けました。
2018-10-07追記:一部/varを/etcと間違えて表記していたので修正しました。
省電力の監視カメラの相談
商売しているのですけど、普段は無人のカウンターに来客があるとピンポンとセンサーで音がなります。しかし、中で作業しているとスグに出られない場合などがあり、慌てて出てみると郵便だったり・・・、要件によってはもう一度何かを取りに戻ったり・・・。これが誰か分かれば慌てないから、というものでした。
だから、あまりたいそうなシステムなんて要らないし、そもそも防犯用でもない。
あっ、これならRaspberry Piで簡単に作れるなーと思ったわけです。
しかし、問題はずっとカメラで撮影するのは意味がありません。余計な電力を使ってしまうのも勿体ない。そもそも記録取るわけでも無いし、1日のうちに何回観るのかも高が知れています。
それ以上にADSL回線のためネットが遅いため、カメラごときにアクセスを奪われるのも避けたい。
ならば、省電力のRaspberry Piを活かそうとネットで調べたら、どうやら静止画をある程度のタイミングで撮影して表示させるのが消費電力も小さいことが分かりました。
それも確認するにはブラウザがあればOKなので、スマホでもイケます!
題してコマ送りの「あんまり監視しないカメラ」プロジェクトです。
今回の環境
必要なモノと仕組み、運用方法は以下です。
今回の環境と主な材料(ときどき監視するカメラ)
- Raspberry Pi Zero W/WH
- 公式カメラモジュールv1.3(旧)
※カメラモジュールv1.3はより安価な旧型(500万画素)
- OSは2018-06-27-raspbian-stretch-lite
- Apache WEBサーバー
- PHP
参考にさせていただいたサイト:ラズベリーパイで作る省電力ライブカメラ(前編)~ ラズベリーパイ研究室 ありがとうございます。
運用方法
カウンター上部へRaspberry Pi Zero W/WHにカメラモジュールを組み込んだケースを設定し、電源のケーブルだけを這わせ、通信はWi-Fiで接続します。
静止画をある一定の連続撮影とし、リアルタイムは要らない。参考のサイトを参考にして記録せずにメモリーにバッファで表示することで省電力化する。
閲覧はスマホまたは据え置きのパソコンのブラウザで確認させる。
必要なインストールとセットアップ
Raspberry Pi Zero WにRaspbian Stretch Liteをインストール後、基本設定を済ませます。
この記事内では分かりやすいようにRaspberry Piのホスト名を「stillmovie」として進めます。
カメラモジュールのテスト
先ずはテストから。カメラがきちんと動作するのか確かめましょう。
カメラモジュールの有効化
sudo raspi-config
インターフェイスオプションでカメラを有効にしてください。
カメラモジュールのバージョン確認
vcgencmd version
Jun 7 2018 15:37:30
Copyright (c) 2012 Broadcom
version 4800f08a139d6ca1c5ecbee345ea6682e2160881 (clean) (release)
カメラが検出されるかどうか確認
vcgencmd get_camera
supported=1 detected=1
detectedは検出という意味なので、1ならOKです。
もしも検出されずにエラーが出るようであれば、フレキシブルケーブルをもう一度確認して取り付けてください。また、v1.3の場合、カメラレンズ部分が外れていることがあります。確認してください。
それでもダメなら・・・フラットケーブルの断線かも知れません。
WEBサーバーの準備
Apacheのインストール
今回はApache2で進めます。
sudo apt-get install apache2
インストールできたか確認します。
apache2 -v
Server version: Apache/2.4.25 (Raspbian) Server built: 2018-06-02T08:01:13
こんな感じでバージョンが表示されればOKです。
どうやらnginxは軽量でよく勧められています。お好みで。
またはnginxのインストール
sudo apt-get install nginx
nginxの起動
sudo /etc/init.d/nginx start
今回はApache2で進めます。
セキュリティ関係の修正2つ
外に公開しなければ必要無いかも知れません。簡単なので載せておきます。
index.htmの削除
サンプルで表示されるページはindex.htmなのでそれを削除か移動しておきます。
sudo mv /var/www/html/index.htm /var/www/
シグネチャの削除
まぁ、サーバーのシグネチャが表示されるというのを表示されないようにするだけです。
sudo nano /etc/apache2/conf-available/security.conf
ファイルの 36行目と37行目を以下に変更します。Onをコメントアウトして、Offのコメントアウトを外します。以下のようにすればOKです。
ServerSignature Off
#ServerSignature On
Apacheの開始、停止、再起動コマンド
開始
sudo /etc/init.d/apache2 start
再起動
sudo /etc/init.d/apache2 restart
停止
sudo /etc/init.d/apache2 stop
sudoersにApache ユーザーを登録
Raspberry Pi でApache から sudo コマンドを実行できるよう、sudoers に Apache ユーザーを登録しておく必要があります。
これはちょっと説明が難しいので端折ります・・・。以下のコマンドで実行しておきましょう。
sudo visudo
pi ALL=(ALL) NOPASSWD: ALL
www-data ALL=(ALL) NOPASSWD: ALL
しかし、私の環境では、pi ALL=(ALL) NOPASSWD: ALLが無かった・・・。rootしかない。
仕方ないので、上の2行を最終行に追加しました。
PHPのインストール(v7)
記事執筆時点でPHPはv7を入れました。その時の最新なり読み替えてください。
sudo apt-get install php7.0-fpm
この後、phpが動かないということになったため以下の手順で対応します。しかし、同じ環境なら問題ありませんけど、何が悪いのか分からないと困るので、一旦、作成したhtmlやphpで確認すると良いでしょう。
phpのテスト
先にphpのテストをした方がいいでしょう。以下を保存して、info.phpなどで保存します。
保存場所は、/var/www/html/です。
sudo nano /var/www/html/info.php
<html>
<head>
<title>PHP info</title>
</head>
<body>
<?php
phpinfo();
?>
</body>
</html>
これを表示してみます。表示されればOKです。
もしも動かない、エラーが出た、真っ白、などありましたらこの記事下部にある「.phpが動かない時の解決方法」もご覧ください。
ファイルの作成
実際に稼働させるスクリプトは2つです。表示部分のHTMLと写真を撮るPHPです。
写真撮影のPHP
sudo nano /var/www/html/pic.php
<?php
ob_start();
system("sudo raspistill -o - -t 10 -n -w 800 -h 600 -e jpg -drc med -ss 100000 -br 50 -rot 180");
$data = ob_get_contents();
ob_end_clean();
echo "data:image/jpeg;base64," . base64_encode($data);
raspistillのオプションはお好きなように変えてください。
表示部分のHTML
sudo nano /var/www/html/index.html
<html>
<head>
<title>rpi-Camera</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script>
setInterval(function(){
$.ajax({
type: "get",
url: "pic.php"
})
.done(function(result){
$(".image").children("img").attr("src", result);
console.log("ファイルの取得に成功しました");
})
.fail(function(result) {
//取得失敗時に実行する処理
console.log("何らかの理由で失敗しました");
})
}, 1100);
</script>
</head>
<body>
<div class="image">
<img src="" alt="あんまり監視しないカメラ">
</div>
</body>
</html>
head終わりまでに記載してある1100は1100ミリ秒です。だから1.1秒になります。この間隔で繰り返し撮影しています。
数値は色々と試してみてください。
動作確認は、http://(ローカルのIPアドレス)/index.html
.phpが動かない時の解決方法
「phpがダウンロードされる」「phpのソースがそのまま表示される」そういった時は、どうやらモジュールが足りないようです。
解決方法は足りないモジュールをインストールするでした。
以下コマンドでどう表示されるか。
a2query -m php7.0
以下のように出たら・・・
No module matches php7.0
どうやらlibapache2-mod-phpが足りないのでインストールします。
sudo apt install libapache2-mod-php
これで無事にphpも動きました!
拡張子phpのURLにアクセスする訳ではありませんが、htmlで作る中身に.phpを実行させて、その値を取得する際、実行しないでそのままテキストとして読み込んでしまうため、画像が無いという404エラーになってしまいます。
このphpの問題だけで5時間くらい迷いましたよ!! 参考サイトの記述があったのはそこだけでした。他のサイトではまた違います。環境によるからでしょう。よく分かりませんわ・・・。
自動起動の設定
Apacheを再起動後も自動起動させるには以下のコマンドでOK
sudo update-rc.d apache2 defaults
最後に
最後までお読みいただきましてありがとうございます。お疲れ様でした!
いかがでしたか? ちょっと駆け足で説明が足りない部分があるかも知れません。要点だけ押さえています。また読み直して、より分かりやすいように修正します。
ネットに散らばっている情報、は古いものや環境が異なるものばかりです。そのため、コピペでは上手く動かないこともあります。
このブログもそうですけど、一旦はコピペで実行させて、どこが違うか見付けないと解決できません。
今回の環境は、
- Raspbian Stretch Lite
- Apache2
- PHP7.0
- Raspberry Pi Zero W/WH
こういう環境なのでOSが違ったり、バージョンが違う場合は、読み替えてください。
記事執筆時点での情報でまとめています。バージョンによりコマンドが変わっていることもありますので気を付けください。
2018-10-07追記:/var/www/html/以下がhtmlとphpの置き場です。