よく動物番組なんかで使われている「動体検知カメラ」を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)が安く売りだされていたので、気が付いたらポチっていました(下図)。
とても小さいです。長さ方向で6cmほど、幅は広いところで11.5mm、先端の黒いカメラ部分は8.5mm程です。
多くのRaspberry Pi用カメラモジュールにはカメラ部分の後ろに基板が付いているのですが、恐らく、カメラ部分のサイズを極限まで小さくするためなのでしょう、このモジュールには基板が付いていません。その代わり、リボンケーブルの上にもいくつか部品が載っています。
※Pi Zeroシリーズとその他のPiシリーズでは、カメラコネクタのサイズ(形状)が違いますので、購入する時は対応機種を確認しましょう。
コイツなら、リボンケーブルでPi ZeroWと接続するだけで良いので、取り回しがだいぶ楽です。
Pi ZeroWのカメラコネクタに前節で示した図のような方向で取り付けたら、OS(Raspbian)から「ラズベリーアイコン ⇒ 設定 ⇒ Raspberry Piの設定」を開きます(↓)。
「カメラ」の設定を「有効」にして「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)センサは、一度「#3-10 超音波センサと焦電型赤外線(PIR)センサ」の記事で試しに使ったことがありました。ここで復習しておきます(下図)。
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です。モジュールによっては異なる場合があるので、各自確認してください。
以下図に、実験中の様子を示します。
上図では、カメラと焦電型赤外線(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とは呼び難い。