公式カメラモジュールで省電力「あんまり監視しないカメラ」を作ってみた!

Amazonのアソシエイトとして、ラズパイダ(raspida.com)は適格販売により収入を得ています。詳しくは当サイトのプライバシーポリシーをご覧ください。
この記事は最終更新日から1年経過しています。適切な内容ではない可能性があります。

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

インターフェイスオプションでカメラを有効にしてください。

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です。

info.phpを表示

もしも動かない、エラーが出た、真っ白、などありましたらこの記事下部にある「.phpが動かない時の解決方法」もご覧ください。

■技適認可されたPi 5と安価になったPi 4

ファイルの作成

実際に稼働させるスクリプトは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

最後に

最後までお読みいただきましてありがとうございます。お疲れ様でした!

いかがでしたか? ちょっと駆け足で説明が足りない部分があるかも知れません。要点だけ押さえています。また読み直して、より分かりやすいように修正します。

ネットに散らばっている情報、は古いものや環境が異なるものばかりです。そのため、コピペでは上手く動かないこともあります。

このブログもそうですけど、一旦はコピペで実行させて、どこが違うか見付けないと解決できません。

今回の環境は、

  1. Raspbian Stretch Lite
  2. Apache2
  3. PHP7.0
  4. Raspberry Pi Zero W/WH

こういう環境なのでOSが違ったり、バージョンが違う場合は、読み替えてください。

記事執筆時点での情報でまとめています。バージョンによりコマンドが変わっていることもありますので気を付けください。

2018-10-07追記:/var/www/html/以下がhtmlとphpの置き場です。

Raspberry Pi 5は2024/01/11に国内技適の認証済み! (認証番号:020-230329)

この記事を書いた人

学べる楽しむ便利になる。小さいくせにヤケにパワフル!
様々な場所で利用されているRaspberry Pi を知って「あっ、これもラズパイだっ!」
だから、ラズパイダ! プロフィール

Pi 5関連商品も続々と登場中

5V5Aの電源アダプターは、公式製品が気軽に買えるまで選択肢があまりありませんね。

Raspberry Pi 3B / 3B+ / 3A+
Raspberry Pi 4/ Pi 400
この記事の主な流れ