公開日:2021/08/07
title.png

17th Season


#17-4 動体検知カメラ

 よく動物番組なんかで使われている「動体検知カメラ」をRaspberry Pi ZeroWを使って構築してみたいと思います。

カメラモジュール

 カメラと言えば、DUEで奮闘したOV7670カメラモジュールがありました。

  「#14-1 はい、チーズ(OV7670)

  「#14-2 いちたすいちは?に〜(OV7670)

  「#14-3 最後にもう一枚撮りま〜す(OV7670)

 バグだらけのOV7670と格闘の上、TFTシールドにリアルタイムでカメラ画像を表示しました。リアルタイムと言っても、表示は1.26[s/フレーム]と、ずいぶん遅かったですね……。OV7670はバグだらけだったし、DUEとの間で8ビットのパラレルバスが繋がって、中々気軽に使えるシステムではありませんでした(大量の配線)。
 ちょっと、DUE+OV7670を使って「動体検知カメラに応用したい」、とは、思えないのです……。


 最後にご紹介しますが、Raspberry Pi ZeroW用のカメラモジュール(OV5647)が安く売りだされていたので、気が付いたらポチっていました(下図)。

a174_pizcam.jpg

 とても小さいです。長さ方向で6cmほど、幅は広いところで11.5mm、先端の黒いカメラ部分は8.5mm程です。
 多くのRaspberry Pi用カメラモジュールにはカメラ部分の後ろに基板が付いているのですが、恐らく、カメラ部分のサイズを極限まで小さくするためなのでしょう、このモジュールには基板が付いていません。その代わり、リボンケーブルの上にもいくつか部品が載っています。

※Pi Zeroシリーズとその他のPiシリーズでは、カメラコネクタのサイズ(形状)が違いますので、購入する時は対応機種を確認しましょう。

 コイツなら、リボンケーブルでPi ZeroWと接続するだけで良いので、取り回しがだいぶ楽です。

OS(Raspbian)の設定

 Pi ZeroWのカメラコネクタに前節で示した図のような方向で取り付けたら、OS(Raspbian)から「ラズベリーアイコン ⇒ 設定 ⇒ Raspberry Piの設定」を開きます(↓)。

a174_rcfgcam.png

 「カメラ」の設定を「有効」にして「OK」ボタンを押します。再起動をするか?と問い合わせてくるので、これも「OK」として再起動します。
 これにて、OS(Raspbian)からカメラモジュールを使う準備が完了しました。

カメラの使い方

 Raspberry Pi公式にサポートされているカメラですので、使い方は色々と準備されています。

 本ページでは、Linuxのコマンドラインユーティリティを使います。いくつかコマンドがあるみたいですが、まずは以下の2つを知っていれば、基本的な処理を実行できるようになります。

 両ユーティリティコマンドとも、手元の環境(NOOBS)では、デフォルトでインストールされていました。

  実験サンプル:【 】内はshellウインドウでの実行コマンド
  【raspistill | more】
    :
    …… 引数無しで実行すると、指定可能なオプションなどの説明が表示されます。

 指定可能なオプションに関しては、上の方法で表示された説明やRaspberry Pi HPから参照したドキュメントでご確認ください。基本的オプションは、raspistillとraspividで共通になっていて、例えば以下の様なものがあります。

 最低限、出力ファイル名を指定すると、写真を撮影してファイルに保存することが出来ます(↓)。

  【raspistill -o test.jpg】
    …… 撮影した画像をtest.jpgと言うファイル名で保存しました。

 手持ちのカメラモジュール(OV5647)では、デフォルトで2592×1944ドットの静止画で保存されました。4:3の5Mピクセルって事ですね。
 上のコマンドラインを実行してみると、ずいぶんと長いこと待たされます。5秒くらい?理由は、デフォルトで「5,000ms待ってから撮影」するオプション「-t 5000」が設定されているからです。……セルフシャッター的な機能がデフォルトでONになっているってこと??

  【raspistill -t 1 -o test.jpg】
    …… 待ち時間が無くなって、サクッと終了します。

 「-t」オプションには>0の数値をミリ秒単位で指定する必要があるので、最小値は「-t 1」で、1ms待ちです。


 動画撮影用raspividの記録形式はH.264と言うやつみたいです。

  【raspivid -o test.h264】
    …… フルHD(1920×1080)の動画を約5秒記録して終了します。

 「-t」オプションを使って、動画の撮影時間をミリ秒単位で指定可能です。デフォルトでは5秒(=5,000ms)に設定されているので、「-t」オプションを使って撮影時間を指定することで、所望の動画撮影が可能です。

  【raspivid -t 12000 -o test.h264】
    …… 12秒の動画を撮影しました。

 Raspberry Pi HPから参照できるドキュメントページでは、MP4Boxというユーティリティで、H.264 → MPEG4への変換方法が紹介されています。手元の環境では、MP4Boxユーティリティはインストールされていませんでしたので、各自、インストールが必要な様です。
 筆者はWindowsにファイルを転送して、使い慣れたWindowsの動画フォーマット変換ソフトウェアを使いましたので、MP4Boxについては未使用、未インストール状態ですm(1__)m。どうしてもRaspbian内で完結したい方は、Raspberry Pi HPを辿って、ご対応下さい。

※raspistillには、プレビュー画面を見ながら撮影可能な「-p」オプションがあるのですが、VNCを使ったリモート接続の場合には、プレビュー画面が表示されない仕様みたいです。

動体検知カメラの設計

 まずは目標仕様をまとめておきます。

  目標仕様:

PIRセンサの復習

 PIRセンサは、一度「#3-10 超音波センサとPIRセンサ」の記事で試しに使ったことがありました。ここで復習しておきます(下図)。

ar3a_pir.jpg

motioncam.cshの仕様

 Cシェルのスクリプトを使い、時間の計測にはsleepコマンドを使います。sleepコマンドは、1秒単位でOSにCPUタイムを返却するコマンドで、「ぴったりN秒」計測するコマンドではありません。従って、「-tstl 1」と設定して実行しても、正確に1秒毎に撮影してはくれません(少しづつずれて行きます)。
 もし、タイムラプス撮影の様な、正確に一定時間毎の撮影がお望みであれば、raspistillコマンドその物、に、インターバル撮影機能が搭載されているので、そういった機能を使ってください。


 以下に完成したスクリプトをリンクしておきます。

  完成スクリプト:motioncam.csh

 Pi ZeroWに転送後、【chmod ugo+x motioncam.csh】などとして、実行属性を付与してお使いください。【motioncam.csh -h】とすると、簡単な使用方法が表示されます。

それでは実験しましょう

 では、実機で動作確認してみましょう。カメラモジュールを装着したPi ZeroWとPIRセンサを以下表の様に接続します。

Pi ZeroW+カメラモジュール 接続 PIRセンサ
5V VCC
GND GND
GPIO(phys#11) OUT

※PIRセンサに接続するのは、5Vです。手持ちのPIRセンサでは、出力OUTは3.3VなのでPi ZeroWへ直結OKです。モジュールによっては異なる場合があるので、各自確認してください。


 以下図に、実験中の様子を示します。

a174_expr.jpg

 上図では、カメラとPIRセンサがバラバラに置いてあるだけですが、完成させる場合には、ちゃんと同じ方向を向けて設置してください(1^^;)っ。
 Pi ZeroWを動体検知カメラ専用にするつもりはなく、「設計した通りに動くよね?」を確認するための実験なので、上図のような状態で動作確認しています。


  実験サンプル:【 】内はshellウインドウからの実行コマンド
  【motioncam.csh -dbg】
  0000
  11
  0
  111
  0
  1
  000000
  1
  000000^C  …… 調整と確認が完了したら、「CTRL−C」で停止。

 デバッグモード(-dbg)で起動しました。PIRセンサの前に手のひらなどをかざして動かすと、動体検知されて"1"が表示されます。動体検知していない状態では、"0"が表示されます。表示頻度は約1秒間隔です。
 動く物がないにもかかわらず"1"が表示される様なら、PIRセンサの検知レベルが高すぎるのかもしれません。シルクSxの可変抵抗で調整して見てください。逆に、手のひらをかざしているのに検知されない場合も同様です。
 一度検知したら、Tpir時間の間は"1"が表示され続けます。シルクTxの可変抵抗器で、時間を調整してください。

※PIRセンサの仕様によると、「Tpir=2.5〜250秒程度」となっていたのですが、上の実験結果ではTpirが一番短くなる設定で使っていて、1秒程度の短い出力時間があり得るみたいです。"1"が1個しか表示されなかった箇所は、1秒程度のアサート時間ですから……。可変抵抗を使って、所望の時間になる様に調整してください。


  【motioncam.csh -tstl 5 test_%y%m%d_%H%M%S】
  INF: pir_out=0 Thu Jul 22 10:45:28 2021
  DET: test_210722_104646.jpg Thu Jul 22 10:46:46 2021
  INF: pir_out=0 Thu Jul 22 10:46:52 2021
  DET: test_210722_104749.jpg Thu Jul 22 10:47:49 2021
  DET: test_210722_104755.jpg Thu Jul 22 10:47:55 2021
  INF: pir_out=0 Thu Jul 22 10:48:01 2021
  ^C

 本番の静止画撮影モードで起動しました。PIRセンサの前に手のひらなどをかざして動かすと、動体検知されて静止画を撮影してくれるはずです。上の「-dbg」オプションで調整したPIRセンサ出力OUT=1となる時間と、「-tstl」オプションで指定する時間で、動作を制御して見てください。


  【motioncam.csh -tvid 5 test_%y%m%d_%H%M%S】
  INF: pir_out=0 Thu Jul 22 10:48:39 2021
  DET: test_210722_104853.h264 Thu Jul 22 10:48:53 2021
  INF: pir_out=0 Thu Jul 22 10:48:58 2021
  DET: test_210722_104945.h264 Thu Jul 22 10:49:46 2021
  INF: pir_out=0 Thu Jul 22 10:49:51 2021
  ^C

 動物番組の動体検知カメラだと、動画撮影するタイプのものもありますよね?今度は、動画撮影モードで起動しました。静止画の代わりに、動画(.h264)ファイルが作成されるはずです。


 撮影した静止画は、「ラズベリーアイコン ⇒ グラフィックス ⇒ イメージビューワ」で表示することが出来ます。
 動画(.h264)は同じく、「ラズベリーアイコン ⇒ サウンドとビデオ ⇒ VLCメディアプレイヤー」で再生することが出来ました。ただ、手元の環境はVNC接続なため、コマ落ちしまくりのストップモーション表示でした。……およそ、動画再生ソフトウェアとしては使い物にならない。

今回のお買い物

 今回のお買い物は、以下の通りです。

 amazonで購入しました。扱いは「中古」品♻となっていましたが、出品者は「amazonアウトレット」でした。「新古品」ってやつでしょうか?小さな厚紙の箱の中に、カメラ本体が帯電防止ビニル袋に入り、A5サイズ程の説明書(英語、両面)と共にパッケージされて届きました。
 「小さな傷有り」とのことでしたが、何ら問題なし。この価格なら納得の一品です。


 さすが、公式にサポートされているカメラモジュール、簡単に使えてしまいました。簡単すぎて、やることがほとんど無いというのは、電子工作(DIY)を楽しみたいという本HPの趣旨にはそぐわない(※)のですが、今回の動体検知カメラの様に、応用が広がるという点では大歓迎です。

※「PCの周辺機器を買って来て繋いでみた」のと、変わらないもの、ね……。DIYとは呼び難い。


btn_arduino.png

btn_prev.png btn_next.png

home