M5Cameraでタイムラプス(NAS利用)

コンセプト編

ベランダで植物を育てることになり、唐突ながら、タイムラプス撮影をしたいと思い立ちました。

タイムラプスとは、一定時間ごとに定点撮影した静止画を繋げて作成したコマ送り動画です。

ある自然ドキュメンタリーで植物が育つ様子を年通しで撮影したものに触発され、四季折々の風景までは望めないし、高精細なものも無理だとしても、似たようなことをコストパフォーマンス良く手早くできないかと。

タイムラプスが可能なスマホ・デジカメなどを犠牲にする(ベランダに据え置く)、あるいは、タイムラプス専用機を使うのが手っ取り早いのですが、コスト面、そして、何か手を動かしたかったので、どうしたらできるか調べ考えて、途中まで実装しました。

以下ではコンセプトから書き始めていますが、結局、実装に必要なものは以下の通りです。

  1. NAS
  2. ベランダのコンセント
  3. M5Camera
  4. 電源アダプタ(スマホ用を転用)
  5. カメラケース(手作りで適当に)

PCを常時起動しておけば代替できますが現実にはNASは必須。他方、電源については、バッテリーは何日も持ちませんし、ソーラーパネルを使いこなすという凄い方もいますがそうでもしない限り、コンセント頼みになります。室内からは延長コードでエアコンの配管の穴を利用するなど手間がかかりそうです。

本命のラズパイ

本命はやはりラズパイ。色々な方が実装されていますが、↓からあげさんのラズパイ活用はどれを見てもわくわくするところ、特にこの定点観測カメラ、プログラムは用意していただいており、クロージャも真似したくなる仕様です。

ラズパイ定点観測カメラの動画とタイムスタックフォト - karaage. [からあげ]

しかし、手元にディスプレイもなく、ssh接続のみでラズパイセットアップできるか自信がない、簡易防水も自らの力量を踏まえるとどこかで躓くのではと思うと踏み切れませんでした。

ラズパイもzero wならば小さめのカメラも入るケースがあり、それをベースに何とか防水できないかと思索したものの、ざっと調べる限り供給が限られているようでした。 ピンヘッダを実装したzero whならばあるのですが、目当てのケースと干渉するようです。ピンヘッダを外せば良いかのかもしれませんが簡単とは思えず。。

NAS+α

ラズパイの場合、撮影、画像保存、動画作成まで、基本的に、全てベランダのラズパイ(常時起動)で行うことになります。

この点、自宅ではやや年季のはいったNAS(Arm系QNAP)が常時起動しているため、ラズパイが担う役割をできるだけNASに担ってもらう、具体的には、ベランダにカメラを置き、常時起動しているNASからそれを操作して撮影、画像保存以降はNAS側で行う仕組みならばどうかと思いました。

ステーションモード化したM5CameraF(魚眼レンズ)にPCからnodeでアクセスして、画像保存と動画作成するこちらの実装例を参考にし、PCをNASに入れ替えれば(ざっくりと)できそうです。

M5Cameraで超安価なタイムラプスカメラを作ってみた

実装編(道半ば)

カメラ側

M5Cameraの入手と試用(AP)

魚眼レンズのFはなかったため、ノーマルM5Cameraをスイッチサイエンスから購入。アームの色は指定できず、赤や橙もあるようですが灰色でした。値段の手頃さ(税込2,035円)、コンパクトさ(48 mm x 24 mm(アームおよびアーム固定穴含まず))、軽さ(5g)が際立つ。

f:id:vivitelaeti:20200720113049j:plain

M5Camera - スイッチサイエンス

上記からリンクされた公式ドキュメントは、図面など画像が表示されないようでしたが、こちらから画像も含めて閲覧可能です。

M5Camera - Makerfactory Documentation

デフォルトではM5Cameraがアクセスポイント(AP)になり、アクセスしてブラウザから静止画・動画を撮影できるので、まずはそれを試してみました。 同梱の取扱説明書にある通りですが、手順は以下の通りです。こうして手軽に動作を試せるのは嬉しい。

  1. 電源アダプタ(スマホ用を転用)と付属コードでM5Cameraを電源に繋ぐ
  2. 端末(PC、タブレットスマホ)から"M5CAM_なんとか"のWi-Fiに接続する
  3. 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を利用していました。

なお、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"にアクセスできれば、画像取得は格段に簡単ではないかとも思い試しました。しかし、こちらは失敗に終わりました。

IFTTT Agent ユーザーガイド | QNAP

cronによる定期実行

シェルスクリプト(又はPythonスクリプト)をcronに登録して定期実行。手順は、主に下記記事を参考にさせていただきました。ただし、エディタは、viではなくopkgでインストールしたnanoを使いました。

QNAPでcronをあつかう - Qiita

IPアドレス問題とmDNS

M5CameraのIPアドレスルーターで固定しない限り、メンテナンスのために電源を抜いてまた挿す都度、IPアドレスが変わり、スクリプトも変更の手間がかかります。これを回避するためのM5Camera側のmDNSの設定については、前述の下記記事の通りです。

タイムラプスカメラとして利用しないまでも、同じネットワーク内の端末からm5camera.localなどでアクセスできるのは便利なのですが、mDNSは端末により非対応です。Android、そして、今回利用したQNAPも。QNAPはavahiを入れてmDNSへの対応を試みたのですが解決できていません。

M5Cameraで超安価なタイムラプスカメラを作ってみた

タイムラプス動画作成その他

定期撮影までできたため、タイムラプス動画作成も自動化したい。QNAPでffmpegは実行できるのですが、その先が進まず、道半ばです。何より、最近の悪天候、強風により、育てつつあった植物が倒れて枯れてしまうという悲しい出来事にあい、プロジェクト凍結中…園芸スキルにも課題ありです。

定期的な画像取得までは成功したので、これにめげずに動画も作成し、また、M5CameraはGroveコネクタがあり温湿度計などを接続することもできるので、そちらで取得したデータをMQTTでQNAPに送信するなどまた徐々に進めて行きます。

プラレールに乗せて(番外編)

タイムラプスとは関係ないのですが、M5Cameraをプラレールに乗せて撮影も試してみました。形状とレンズ位置・ケーブル位置がプラレールとは折合わずバランスがとりにくかったですが一応、スチルもビデオも撮影できました。

f:id:vivitelaeti:20200614075359j:plain


  1. 本来はM5Cameraの設定で対応できるはずなのですが、うまくいかず事後的に画像回転することにしました。

  2. 一時ファイルを作ってからconvertで回転させつつコピーするのではなく、mogrifyで回転して上書きできるはずなのですが、うまくいかず、あえて一時ファイルを作成してconvertしています。