知的好奇心 for IoT

IoT関連の知的好奇心を探求するブログです

カメラとmicroSDカードスロット付きのESP32でタイムラプス動画用の写真を撮ろう!

最近2,000円代でカメラとmicroSDカードスロット付きのマイコンが出てきたので、何か良い使い道がないかと考えていました。

 

2023年5月25日発売のSeeed Studio XIAO ESP32S3 Sense

スイッチサイエンスで¥2,728円

 

2024年2月5日発売のM5Stack UNIT CAMS3

スイッチサイエンスで¥2,398円

 

microSDカードスロットが付いていないタイプは以前から出ていたので、microSDカードに写真を保存する活用方法を探して、結局たどり着いたのがタイムラプス動画用の写真を撮影することでした。

 

実際にM5Stack UNIT CAMS3で撮った写真をタイムラプス動画にしてみましたので、見てみてください。

撮影間隔2秒、30フレーム/秒

 

カメラモジュールのOV2640は解像度が1600 x 1200と高くないため、風景とかには向いてないかもしれません。

植物の生育やゆっくり動く動物などの観察用なのかも知れません。

 

プログラム製作

ステップ1 ー 写真をmicroSDカードに保存する

写真をmicroSDカードに保存するプログラムの参考にしたのが、XIAO ESP32S3 SenseのメーカーWikiの次の記事です。

この記事は非常に盛り沢山な内容になっていますが、「Taking photos with the camera」というパートが、シンプルに写真をmicroSDカードに保存するコードと説明になっています。

ただ、このままでは幾つかの不便な点がありました。

  • 写真のファイル名が電源投入時からのカウントアップとなっているため、電源を入れる前に以前の写真をmicroSDカードから移動させる必要がある。
  • 時間の取得をしていないため、ファイルのタイムスタンプが1980年になってしまう。

そのため、WiFiに接続してNTPで時間を取得するようにして、ファイル名にエポック秒を使ってファイル名が重複しないように変更しました。

 

そして、実際に外で撮影を行なってみたのですが、スムーズに撮影するには次のような問題があることがわかりました。

  • 撮影時にアングルがわからないため、何回も撮影してはmicroSDカードの写真をPCで確認しなければならず、非常に面倒!
  • 本体の設置向きを撮影時に変更できないため、設置の柔軟性が下がる。
  • 撮影間隔が変更できないため、撮影間隔を変えて試してみることができない。

 

ステップ2 ー 撮影前にアングル確認や設定変更ができるようにする

実際の撮影をしてみて感じた問題を解決するために、これもXIAO ESP32S3 SenseのメーカーWikiに載っている次の記事の「Project II: Video Streaming」を参考に、ステップ1で作ったプログラムとストリーミングプログラムを融合させてみました。

 

Video Streamingプログラムで顔認識をさせているところ。

 

「Project II: Video Streaming」のプログラムは顔認識までできるとんでもない代物で、非常にコード量が多くてそのままでは撮影プログラムとの融合がし難かったため、まず、必要な機能だけに絞る作業を行うことにしました。

その作業で障害となったのがフロントエンドの部分で、機能盛りだくさんの作りでコード量が多いためかhtmlがgzipで圧縮されたバイナリー形式でソースコードに書かれていたんです。

そのままではhtmlを修正できないので、一旦ブラウザで画面を表示してその画面のソースコードを保存することでhtmlの修正を行いました。

 

プログラム修正後の画面。(スマホ)


修正のポイント

  1. mDNS(マルチキャストDNS)の使用
    元々のプログラムはIPアドレスでアクセスする必要があったのですが、IPアドレスだと繋ぐアクセスポイントによって変わってしまうため、使い勝手が良くありません。
    mDNSを使うと、同じネットワークに接続している機器であればxxxxx.localという形式でアクセスすることができます。
    mDNSはESPmDNS.hをインクルードすれば、MDNS.begin("hostname");を実行するだけでhostname.localでアクセスできるようになります。

  2. WiFiの送信出力を抑える
    前の記事にも書きましたが、XIAO ESP32S3はWiFiの送信出力をデフォルト(最大)から下げないとWiFiに繋がらない個体が存在します。
    このプログラムではWiFi.setTxPower(WIFI_POWER_15dBm);を実行して、一般的な機器と同等の出力値にしています。

  3. M5Stack UNIT CAMS3対応
    ほぼ同じハードウェア構成のUNIT CAMS3でも使えるように、UNIT CAMS3のユーザーデモプログラムからカメラPIN定義を調べ、M5StackのドキュメントサイトからmicroSDカードスロットのPIN定義を調べて、PIN情報定義ファイルに加えました。

  4. ストリーミング制御
    ブラウザでタイムラプス操作画面を表示すると、1秒毎に写真が表示されます。
    上下反転スイッチは、次の写真表示で反映されます。
    撮影間隔を変えると、写真表示も変更した撮影間隔毎で表示されます。
    撮影開始ボタンを押すと、写真はmicroSDカードに保存されるようになり、画面の写真は更新されなくなります。これは、HTTPで写真をブラウザに送る時間が、最小撮影間隔の1秒を超えることがあり、microSDカードへの保存に間に合わなくなることがあるためです。

 

プログラム

今回のプログラムは4ファイルもあって、なかなかの行数になるためGitHubに登録しました。

次の4ファイルが格納されているので、Timelapseフォルダを作ってその中に全て保存してください。

  • Timelapse.ino   --- メインプログラム
  • app_httpd.cpp  --- サーバープログラム(バックエンド)
  • index_html.h.   --- HTMLコンテンツ(フロントエンド)
  • camera_pins.h  --- PIN定義ファイル

 

M5Stack UNIT CAMS3用の設定

M5Stack UNIT CAMS3はArduino IDEのボードメニューに載っていないので、代わりに「ESP32S3 Dev Module」を選びます。

そして次のように設定します。

  • USB CDC On Boot: "Enabled"
  • PSRAM: "OPI PSRAM"