両手でねこをこねている動画を撮影できるようにがんばってみた(ESP32-WROVER CAMボード / PlatformIO)

両手でねこをこねながら、こねられているねこを撮影するという願望を、ESP32-WROVER CAMボード / PlatformIO にて解決しようと試みたブログです。
2023.07.14

大阪オフィスの山田です。

ねこが好きです。

ねことかいぬとか好きな人、絶対写真とか動画とか撮影しますよね。撫でながらとか。 でも僕たちには手が足りないため、理論上は両手でモフモフしながら撮影はできないんですよね。残念ながら。
こうなっちゃう。

僕はどうしてもねこをこう、伸ばしている動画が撮影したいなと思い、 ESP32-WROVER-CAMボード で何とかしようと試みたブログです。Amazonの以下のリンクで購入しました。  

Freenove ESP32-WROVER CAMボード(Arduino IDE対応)、オンボードカメラワイヤレス、Python Cコード、詳細チュートリアル、サンプルプロジェクト

  • SoC: ESP32-WROVER-E
  • Camera module: OV2640

で、これらを使って何とかする方法を考えました。

開発環境

  • macOS: Ventura 13.2.1
  • VSCode: 1.79.2
  • PlatformIO: v3.3.0

Freenove社がGitHubで色々公開しています。チュートリアルのPDFもこのリポジトリに入ってます。

https://github.com/Freenove/Freenove_ESP32_WROVER_Board/tree/main

PlatformIOでの環境構築

VSCodeの拡張としてPlatformIOをインストールします。 画面ぽちぽちでできるので省略します。

プロジェクトを作る

さて、このSoC用のプロジェクトを作ります。 PlatformIOの +New Project をタップして、プロジェクトを作っていきます。
Nameはプロジェクト名なので好きなのをつけます。
Boardは、 Espressif ESP-WROVER-KIT を選択します。
Locationのチェックを外すと、プロジェクトを作成するディレクトリを指定できます。
Frameworkは Arduino です。それでは Finish

ソースコード

Freenove社のGitHubにて公開されているソースコードを全部srcディレクトリの直下に入れます。

https://github.com/Freenove/Freenove_ESP32_WROVER_Board/tree/main/C/Sketches/Sketch_05.1_CameraWebServer

Sketch_05.1_CameraWebServer.inomain.cpp にリネームします。(元のmain.cppファイルは削除)

ファイル参照がいくつかうまくいかない可能性はありますが この状態でビルドしてもうまく動かないかと思います。 次以降で修正していきます。

いくつかの修正

WiFiに接続する

WiFiに接続するためのIDとパスワードをコードに入れてください。
2.4GHz帯でないと接続できない点に注意してください。

const char *ssid_Router     = "********";  //input your wifi name
const char *password_Router = "********";  //input your wifi passwords

Consoleに正しく文字が表示されない

VSCodeの左下のコンセントマークをぽちすると、SoCからシリアル通信でログなどを確認できるコンソール(Device Monitor)が開きます。
うまく表示されない人は、ボードのRSTと書かれたボタンをぽちしてください。SoCが再起動します。 Device Monitorをみると文字化けしていました。まずこれを直したいと思います。

PlatformIOのデフォルトでは、monitorのボーレートが9600bpsに設定されています。

https://docs.platformio.org/en/latest/projectconf/sections/env/options/monitor/monitor_speed.html

ただ、ソースコード上ではシリアル通信を115200bpsで開始しています。なので設定の方を変更してボーレートを合わせます。

Serial.begin(115200);

platformio.iniに以下の記述を追加して、再ビルド & アップロードしましょう。

monitor_speed = 115200

カメラの初期化で失敗する問題

ビルド & アップロードはできても、そのままだとおそらくカメラの初期化で失敗すると思います。

原因は下記の1行に起因します。

config.fb_location = CAMERA_FB_IN_PSRAM;

PlatformIOでプロジェクトを上記手順で作った場合、初期状態だとPSRAMが使えない設定になっているようです。 platformio.iniに以下の記述を追加します

build_flags = 
    -DBOARD_HAS_PSRAM

アップロードできなくなる問題

今度はビルドできたけどアップロードできなくなりました。すんなりうまくいかないねぇ。なにごとも。

エラーの内容をみると、「プログラムサイズが最大サイズの約1.2MBを超えてるからお前はダメ」と言われているようです。え、SoCには4MBのフラッシュがついてるって書いてるじゃないかー。となるのですが、デフォルトのパーティションテーブルだとプログラムの領域は1.2Mとなります。
なのでこの設定を変えてあげます。

platformio.iniに以下の記述を追加します。

board_build.partitions = huge_app.csv

この設定だとプログラムが3Mまで入れれます。 参考にした神ブログを紹介しておきます。

ソースコード上で警告が出ている

以下の2つがdeprecatedのため、警告が出ます。

  config.pin_sscb_sda = SIOD_GPIO_NUM;
  config.pin_sscb_scl = SIOC_GPIO_NUM;

これを

  config.pin_sccb_sda = SIOD_GPIO_NUM;
  config.pin_sccb_scl = SIOC_GPIO_NUM;

に変えてやります。警告が消えました。やったね。 sccbとsscbについて違いをちゃんと説明しろと言われたらできません。すみません。ググってください。 僕もググりましたがよくわかりませんでした。

動かしてみる

ビルドして、コンセントマークをタップしてみます。
うまく表示されない人は、ボードのRSTと書かれたボタンをぽちしてください。SoCが再起動します。
しばらくするとIPアドレスが表示されます。

そちらにブラウザからアクセスするとWebページが開きます。 画面下部の Start Stream ボタンをタップすると、なんとカメラにて撮影された画像が表示されるではありませんか。 やったね。

デバイスの自作

本当は3Dプリンターを使って作りたかったのですが、お金と置き場所がないことから断念しました。 ダンボールでケース作るかーと思ったんですが、途中でめんどくさくなりました。 なので、安いメガネを買ってきて、それにくっつけます。 ボードを動かすのに電源も必要です。なので、適当に小さいモバイルバッテリーを購入しました。 小さいと思ったんですが、意外とデカかったです。モバイルバッテリーは小さいといえど重たいので、胸ポッケがついている服を着て、そこに入れることでことなきを得ました。 仕上がりはこんな感じです。

ちなみに剥き出しなので火傷とかそういう危険性もあるかもしれないので真似しないでください。真似するなら自己責任でお願いします。 実際SoCがめっちゃ頑張って処理するので、ほんのり鼻のあたりが熱くなります。

実際に撮影してみる

先ほどのWebページを開いて撮影画像が表示されている部分をQuickTimeで画面撮影しておきます。力技です。
それでは作成したデバイスを装着してねこを探します。
いました。

両手でもふります。

なんならちょっと伸ばしてみます。

にゃーっていわれました。いやそう。

これでねこを両手でこねながら撮影できました。

最後に

iPhoneをガムテで額にでもくっつけて撮影したらいいだけの話でした