M5Cameraでタイムラプス(NAS利用)
コンセプト編
ベランダで植物を育てることになり、唐突ながら、タイムラプス撮影をしたいと思い立ちました。
タイムラプスとは、一定時間ごとに定点撮影した静止画を繋げて作成したコマ送り動画です。
ある自然ドキュメンタリーで植物が育つ様子を年通しで撮影したものに触発され、四季折々の風景までは望めないし、高精細なものも無理だとしても、似たようなことをコストパフォーマンス良く手早くできないかと。
タイムラプスが可能なスマホ・デジカメなどを犠牲にする(ベランダに据え置く)、あるいは、タイムラプス専用機を使うのが手っ取り早いのですが、コスト面、そして、何か手を動かしたかったので、どうしたらできるか調べ考えて、途中まで実装しました。
以下ではコンセプトから書き始めていますが、結局、実装に必要なものは以下の通りです。
PCを常時起動しておけば代替できますが現実にはNASは必須。他方、電源については、バッテリーは何日も持ちませんし、ソーラーパネルを使いこなすという凄い方もいますがそうでもしない限り、コンセント頼みになります。室内からは延長コードでエアコンの配管の穴を利用するなど手間がかかりそうです。
本命のラズパイ
本命はやはりラズパイ。色々な方が実装されていますが、↓からあげさんのラズパイ活用はどれを見てもわくわくするところ、特にこの定点観測カメラ、プログラムは用意していただいており、クロージャも真似したくなる仕様です。
ラズパイ定点観測カメラの動画とタイムスタックフォト - karaage. [からあげ]
しかし、手元にディスプレイもなく、ssh接続のみでラズパイセットアップできるか自信がない、簡易防水も自らの力量を踏まえるとどこかで躓くのではと思うと踏み切れませんでした。
ラズパイもzero wならば小さめのカメラも入るケースがあり、それをベースに何とか防水できないかと思索したものの、ざっと調べる限り供給が限られているようでした。 ピンヘッダを実装したzero whならばあるのですが、目当てのケースと干渉するようです。ピンヘッダを外せば良いかのかもしれませんが簡単とは思えず。。
NAS+α
ラズパイの場合、撮影、画像保存、動画作成まで、基本的に、全てベランダのラズパイ(常時起動)で行うことになります。
この点、自宅ではやや年季のはいったNAS(Arm系QNAP)が常時起動しているため、ラズパイが担う役割をできるだけNASに担ってもらう、具体的には、ベランダにカメラを置き、常時起動しているNASからそれを操作して撮影、画像保存以降はNAS側で行う仕組みならばどうかと思いました。
ステーションモード化したM5CameraF(魚眼レンズ)にPCからnodeでアクセスして、画像保存と動画作成するこちらの実装例を参考にし、PCをNASに入れ替えれば(ざっくりと)できそうです。
実装編(道半ば)
カメラ側
M5Cameraの入手と試用(AP)
魚眼レンズのFはなかったため、ノーマルM5Cameraをスイッチサイエンスから購入。アームの色は指定できず、赤や橙もあるようですが灰色でした。値段の手頃さ(税込2,035円)、コンパクトさ(48 mm x 24 mm(アームおよびアーム固定穴含まず))、軽さ(5g)が際立つ。
上記からリンクされた公式ドキュメントは、図面など画像が表示されないようでしたが、こちらから画像も含めて閲覧可能です。
M5Camera - Makerfactory Documentation
デフォルトではM5Cameraがアクセスポイント(AP)になり、アクセスしてブラウザから静止画・動画を撮影できるので、まずはそれを試してみました。 同梱の取扱説明書にある通りですが、手順は以下の通りです。こうして手軽に動作を試せるのは嬉しい。
- 電源アダプタ(スマホ用を転用)と付属コードでM5Cameraを電源に繋ぐ
- 端末(PC、タブレット、スマホ)から"M5CAM_なんとか"のWi-Fiに接続する
- 192.168.4.1(取扱説明書に異なるIPアドレスの記載があればそちら)に接続
CameraWebServerのプログラム(STA化)
デフォルトではM5Cameraそれ自体がアクセスポイント(AP)になるところを、NASから接続しているルーターを介してアクセスできるよう、M5Cameraの方からルーターに繋ぐステーションモード(STA)に変更しました。ESP32は初めてで勝手がわからなかったのですが、下記の手順に従いArduino IDEからプログラムを書き込みました。なお、これをすると、デフォルトのプログラムは上書きされてしまいます。出荷時に戻すことができるかは確認未了です。
M5Camera をレビューしてみた。分解したり、Arduino IDE でスマホに映したりする実験 | ページ 3 / 3 | mgo-tec電子工作
上記ではArduino IDEでESP32用のCameraWebServerサンプルプログラムを一部変更するのですが、このサンプルはGitHubにて公開されているものと同等のようです。
いまだにこのサンプル仕組みは理解できていませんが、いずれにせよ(と逃げて良いのでしょうか)、STA化ルーターを介した接続までは比較的スムーズに行きました。
カメラケース
ここに載せられるほどの完成品ではありませんが、お菓子の空き箱で高さを稼ぎ、穴を開けてビニールタイでM5Cameraをくくりつけるなど手作り感満載のものです。もう少し工夫して、見栄えの良い小型の簡易防水仕様にできると良いのですが。
NAS側
シェルスクリプト
QNAPはLinuxベースのNASであり、画像取得だけであればシェルスクリプトの利用がシンプルです。
シェルスクリプトは以下の通りですが、M5Cameraにアクセスするためにcurlを利用している他、縦位置に設置したため画像回転が必要となり1、convertも使っています2。
#! /bin/sh base_dir="(作業ディレクトリのフルパス)" tmp_file="${base_dir}tmp.jpg" #一時ファイル img_file="${base_dir}`date +"%Y%m%d_%H%M%S"`.jpg" #撮影時刻をファイル名にする img_url="http://(m5cameraのIPアドレス)/capture" #スチルの撮影は/captureにアクセスすることにより可能 curl -o $tmp_file $img_url convert -rotate -90 $tmp_file $img_file #90度回転(縦位置に設置する場合)
なお、convertを利用するためには、パッケージマネージャからImage Magickをインストールすることになります。このパッケージマネージャ以前はipkgという名で組み込まれていたように思いますが廃止されてしまい、opkgになりましたので、そちらのインストールを先に済ませておく必要があります。opkgも含めて、QNAP固有の問題でだいぶ苦労しました。
ARM 系 QNAP に git/php7.4 などをパッケージでコマンドインストールする [Entware で Opkg 編] - Qiita
Python3(別の方法・成功)
なお、当初は、シェルスクリプトでなくPython3を利用していました。
M5cameraを入手。
— vivitelaeti (@vivitelaeti) 2020年6月14日
Arduino IDEのesp32スケッチ例を修正して書き込むことでstationモード化した後、NASでPython3のurllib.requestを使ったスクリプトを実行し"http://(ipアドレス)/capture"から 静止画取得までできた。これを定期実行できれば簡易タイムラプスカメラにできる。 #m5camera
Pythonを使わずとも、curlでhttp://(ip address)/captureを叩いた上で、必要な画像処理があればconvert/mogrifyを使えば良いことに今更気が付きました。一連の処理をシェルスクリプトにしてcronに登録したところ、定期的に撮影できている模様。#m5camera
— vivitelaeti (@vivitelaeti) 2020年6月18日
なお、Python3は、opkgからインストールしたものでないと正常に動かないようです。AppCenterからインストールしたものを下記に記載された方法(. /etc/profile.d/python3.bash)で一時的には起動できるのですが、再起動などするとやはり動かない。やはりQNAP固有の問題で苦労しました。
コミュニティのおかげで解決のヒントが分かるので、それを手掛かりに歩みを進められるのはありがたいことです。いつか、ターミナルでQNAPを使う場合の躓きポイントを別エントリでまとめたい。
install python 3 - QNAP NAS Community Forum
IFTTT(別の方法・失敗)
QNAPのIFTTTを利用して、時間になったらDownload from URLで"(m5cameraのIPアドレス)/capture"にアクセスできれば、画像取得は格段に簡単ではないかとも思い試しました。しかし、こちらは失敗に終わりました。
cronによる定期実行
シェルスクリプト(又はPythonスクリプト)をcronに登録して定期実行。手順は、主に下記記事を参考にさせていただきました。ただし、エディタは、viではなくopkgでインストールしたnanoを使いました。
IPアドレス問題とmDNS
M5CameraのIPアドレスをルーターで固定しない限り、メンテナンスのために電源を抜いてまた挿す都度、IPアドレスが変わり、スクリプトも変更の手間がかかります。これを回避するためのM5Camera側のmDNSの設定については、前述の下記記事の通りです。
タイムラプスカメラとして利用しないまでも、同じネットワーク内の端末からm5camera.localなどでアクセスできるのは便利なのですが、mDNSは端末により非対応です。Android、そして、今回利用したQNAPも。QNAPはavahiを入れてmDNSへの対応を試みたのですが解決できていません。
タイムラプス動画作成その他
定期撮影までできたため、タイムラプス動画作成も自動化したい。QNAPでffmpegは実行できるのですが、その先が進まず、道半ばです。何より、最近の悪天候、強風により、育てつつあった植物が倒れて枯れてしまうという悲しい出来事にあい、プロジェクト凍結中…園芸スキルにも課題ありです。
定期的な画像取得までは成功したので、これにめげずに動画も作成し、また、M5CameraはGroveコネクタがあり温湿度計などを接続することもできるので、そちらで取得したデータをMQTTでQNAPに送信するなどまた徐々に進めて行きます。
プラレールに乗せて(番外編)
タイムラプスとは関係ないのですが、M5Cameraをプラレールに乗せて撮影も試してみました。形状とレンズ位置・ケーブル位置がプラレールとは折合わずバランスがとりにくかったですが一応、スチルもビデオも撮影できました。