ESP-IDFを使ってみる

ESP32-CAM


カメラモジュール付きのESP32を入手しました。
OV2640のカメラが付属しています。
左の製品はDIY MORE製品、右の製品は無印製品です。


MCUは温度耐性が高いESP32-Sです。
データシートを見れば分かりますが、ESP32-WROOM-32の温度耐性が-40℃から+85℃に対し、
ESP32-Sは-40℃から+125℃となっています。

ちなみにESP32-SのMPUはESP-WROOM-32と同じDualCoreのMPUで、なんでSなのか良く分かりません。
chip model is 1, chip with 2 CPU cores, WiFi/BT/BLE, silicon revision 1, 2MB external flash
package is ESP32D0WDQ6

右の製品はマーキングがEspressifです。
EspressifはESP32-Sをリリースしていないはずなので、怪しさ満載のCPUです。
RSTボタンが付いています。
レギュレータ(AMS1117)の右側のチップは64MBitのPSRAM(IPS6404L-SQ)です。


USB-TTL変換チップは搭載されていないので、書き込みにはUSB-TTL変換ケーブルが必要になります。
そこで、esp-idfに付属するexamples/get-started/blinkを使って簡単な動作確認をしてみます。
menuconfigでGPIO4を指定します。




USB-TTL変換ケーブルをESP32-CANに接続したら、さらにGPIO0をGNDに落として、RSTボタンを押すと書き込みモードになり ます。
書き込みが成功すると以下の様に再び書き込みモードになるので、GPIO0をオープンにしてRSTボタンを押すとファームが起動します。
カメラ前面のフラッシュライトが点滅します。
メチャクチャ眩しいです。




色々調べらた、こち らで 公開されてい るファームが使えることが分かりました。
このファームはこちらのESP32 Camera Driverと、こちらのDeep Learningライブラリを利用しています。
幾つかのサンプルが付属しています。
$ ls examples/
cat_face_detection  color_detection  human_face_detection    motion_detection
code_recognition    esp32-s3-eye     human_face_recognition

試しに、human_face_detectionをビルドしてみました。
ファームの書き込みは以下の手順です。
$ git clone --recursive https://github.com/espressif/esp-who.git
$ cd esp-who/examples/human_face_detection/web
$ idf.py menuconfig

このファームウェアはESP-EYE、ESP32-S2-Kaluga-1、ESP-S3-EYE用のファームですが、menuconfigで何 か所か変更することで、
ESP32-CAMでも使うことができます。
最初にWifiの設定を確認します。






デフォルトはAPモードとなっています。これがAPモードの時のSSIDになります。


WiFi STA SSIDとWiFi STA Passwordを指定して、WiFi AP SSIDを消すと、STAモードに変更することができます。


次にカメラのタイプを変更します。


デフォルトはESP-EYE DevKitになっています。


AI-Thinkerのカメラに変更します。


ファームをビルドすると、ESP32はWebServerとして動きます。DHCPから払い出されたアドレスで接続することができます。


Start Streamで動画を表示し、Get Stillで静止画像を表示します。
QVGA(320x240)で10fps程度のスピードが出ますが、画質は全く期待できません。
また、画像がなぜか以下の様にミラー(左右反転)します。
CPUパワーをかなり使うみたいで、ESP32モジュールは結構熱くなります。


これがQVGAでテレビ画面をキャプチャーした時の画像です。


カメラは固定焦点なので、ある程度被写体との距離が無いとピントが合いません。
これは卓上カレンダーをキャプチャーしていますが、全く判読できません。




次に、code_recognitionのサンプルをビルドしてみました。
このサンプルはカメラで撮影したQRコードを認識することができます。
ファームの書き込みは以下の手順です。
$ git clone --recursive https://github.com/espressif/esp-who.git
$ cd esp-who/examples/code_recognition
$ idf.py menuconfig

menuconfigでカメラのタイプを変更します。






ビルドして適当なQRコードを撮影します。
QRコードを認識すると以下のロギングを表示します。




WEB経由で動画も静止画像も見れるようになりましたが、意外と使い道が有りません...
ネットワーク経由で何かコマンドを送ると、その時だけ静止画像を撮って、サーバーにFTPなどでポストしてくれるソフトを探しま したが
適当なのがなさそうだったので作りました。
FTP転送版はこ ちら、MQTT転送版をこちら、 HTTP転送版をこ ちら、SMTP転送版をこちら、 SMB転送版をこち ら、WebSocket版をこちらで 公 開しています。
いずれも、こ ちらのカメラ ドライバーを利用しています。

また、撮った写真をビルトインのHTTPサーバーで見れるようにしています。
撮った写真はSPIFFSにJPEG形式で保存します。
このJPEGファイル(/spiffs/picture.jpg)を単純に以下の関数で出力しても表示できません。
httpd_resp_sendstr_chunk(req, "<img src=\"/spiffs/picture.jpg\" width=\"128\" height=\"128\">");

JPEGファイルを一旦BASE64の文字列(BASE64_ENCODE_STRING)に変換し、変換後の文字列を出力する必要が有ります。
httpd_resp_sendstr_chunk(req, "<img src=\"data:image/jpeg;base64,");
httpd_resp_sendstr_chunk(req, (char *)BASE64_ENCODE_STRING);
httpd_resp_sendstr_chunk(req, "\" width=\"128\" height=\"128\">");");

JPEGからBASE64への変換は、ESP-IDFにビルトインされているMbed TLS libraryを使って簡単に変換することができます。



ESP32-CAM用のアダプターボードを入手しました。
写真の様にWCH(Jiangsu Qin Heng)のCH340C互換チップ、2つのボタン、マイクロUSBのコネクターが実装されています。


マウントするとこの様になります。



IO0ボタンを押すとIO0がGNDに落ちますが、RSTを押してもリセットは掛かりません。
こ ちらにアダプターボードの回路図が公開されています。
そもそも、ESP32-CAMのピンヘッダーにはRSTのピンが出ていないので不思議でしたが、こちらに その謎の答えが公開されていました。
ESP32-CAMにはジャンパー抵抗の位置により、GNDピンをRSTピンに変更できるものがあるようです。
手元のESP32-CAMを調べましたが、私が持っているESP32-CAMは、この切り替え機能がないモデルの様です。
このモデルでは、リセットはESP32-CAMの裏側の小さなボタンを押す必要が有ります。
IO0ボタンを押した状態で、リセットを行うとファーム書き込みモードになります。



FREENOVEブランドのESP32を入手しました。
写真の様にマイクロUSBのポートが付いています。
裏面にWCH(Jiangsu Qin Heng)のCH340C互換チップがマウントされているので、普通にUSB経由で書き込みができます。
カメラモジュールはESP32-CAMと同じOV2640が付属しますが、カメラに繋がっているGPIOが違うので、GPIOの割り当てを変える 必要が有 ります。
カメラモジュールのGPIOとArduinoサンプルコードがこ ちらに公開されていますが、ボードの回路図が見当たりません。
MCUはPSRAM付きのESP32-WROVERです。


ESP32-CAMと比べると少し大きいです。
ファーム書き込み時にGPIO0を切り替える必要が無いので楽ちんです。





UICPALブランドのESP32S3を入手しました。
表にも裏にもブランド名や型番は有りませんが、こちらがメーカーのホー ムページです。
写真の様にタイプCのポートが2組付いています。
裏面に340xd28(CH340Xの互換チップ)がマウントされているので、普通にUSB経由で書き込みができます。
カメラモジュールはESP32-CAMと同じOV2640が付属しますが、カメラに繋がっているGPIOが違うので、GPIOの割り当てを変える 必要が有 ります。
いろいろ探しましたが、こ ちらの回路図からカメラピンのアサインを割り出しました。
MCUはESP32-S3チップ直付けで、16MBのSPI-FLASH、8MBのPSRAM、MIC(MSM261S4030H)がマウントさ れています。
340xd28に関する資料が全くないので、なんだかとっても怪しい製品ですが、ちゃんと動きます。




FREENOVE製品よりも少しだけ小さいです。
ファーム書き込み時にGPIO0を切り替える必要が無いので楽ちんです。




こ ちらのアプリを使うとスマホだけでESP-CAMを使った写真撮影と、撮った写真の確認を行うことができます。
ESP32にはこ ちらのファームを書き込みます。
FTPサーバーが必要ですが、私は格安のレンタルサーバーを使っています。
このWEBページも、そのレンタルサーバーに置いてあります。
レンタルサーバーの月額利用料金は、スタバのコーヒーよりも安いです。
自宅にサーバーを立てて、外出先からアクセスしようとすると、ファイヤーウォールとかIPアドレスとかの設定が面倒ですが、
レンタルサーバーなので、何も考えずに外出先からもアクセスすること ができます。

ESP32-CAMのシャッター設定を「リモートファイルの削除」で構成します。
この構成は、FTPサーバー上のファイルを定期的に監視し、ファイルが無くなるとシャッターが落ちて、すぐにまたファイルを作成します。
アプリにFTPサーバーを登録すると、FTPサーバー上のファイルの一覧を表示します。
Androidアプリで、新たなファイルを作成するのは少し面倒ですが、ファイルの削除はファイル名を長押しして、削除を選ぶだけです。
これでESP32-CAMのシャッターが落ち、FTPサーバーに写真がアップされます。
大阪に設置されているESP32の写真を東京から撮って、直ぐに見ることができます。


続く...