IoTカメラを作る

IOTとして遠隔操作、監視装置を作るとしたら、カメラは必須ではないかなというところから
ESP32でカメラを作ろうと思い立ちました。
それと、玄関などに配置した見守りカメラ、これはインターネット経由でどこからでも
スマホで、画像で確認できるものがありますが、これって、画像がいったんネットに
でてからそれをスマホで読み込む形なので、時間遅れがあります。これを置き換える
ためのものにも使いたいと思っています。こんな動機から作ることにしました。
現時点では 完成していませんが、スタート時点での思い、その後の経過など
参考になればと思って記録します。

また じたばたしている様子をPDFにまとめてあります。
思考錯誤 をクリックするとダウンロードできます。

2023年6月8日のファームでは 設定画面を用意しました。その際、HREF1~4のボタンも追加。
このボタンを他のカメラへの移行ボタンにする予定です。

2023年6月7日のファームでは メディアカードインターフェースを追加、DHT20のデータ取得をおこないました。

2023年5月17日のファームでの動作は下記のようになります。
http://192.168.0.13/をブラウザでひらけば撮影を開始して始まります。
html , javascript いずれもバッサリと削除し、シンプルにしましたので、変更が楽(?)かと
思います。

試作基板はこんな感じです。一部ジャンパあります。

CPUの選択

ESP32の中のどのCPUを選ぶかというと
1.PSRAM内蔵であること
2.I/Oピンが豊富(遠隔制御用に)
3.できるだけ安いこと(回路構成がシンプル)
でした。これに相当するのが ESP32-S3-WROOM-1-N16R8 でした。
秋月電子さんで530円でした(2023/05/17時点)。

カメラの選択

カメラもお安いもの、入手性のいいものということで、OV2640になりました。
日昇さんで購入できます(2023/05/17時点)

回路図

回路図を設計する際に戸惑ったのは カメラ信号のピン配置です。
スケッチの例によると、ピン配置が割と自由に決められていること、どうやら勝手に決めることが
できるようです。最初の試作は だめだったときに後で変更できるように、大きめのビアを配置しての
配線としました。結果は そのまま使えて、RESET信号だけは追加することになりました。
回路図はこちらからダウンロードできます(PDF)
ファームの書き込みもS3の付属のUSBからおこなえます。ただし、USBで書き込みに失敗すると
USBから書き込めなくなるようで、TXD0,RXD0も外部にだして、いざというときはこちらから
書込みます(IO0をGNDに落として)。

ファームウェア

ファームウェアは スケッチ例>ESP32>Camera>CameraWebServer を使いました。
カメラ種類、ピン配置はOV2640固定なので、不要なものは削除です。
それから、サーバーとして出力する、html,CSS,Javascript は zipで圧縮されたものを
出力する形になっていたので、これでは応用が利きません。なので、一旦そのまま
使用し、ブラウザでソースを取得、これを修正していうことで進めます。
この際、ブラウザへの出力URLを html,javascriptに分けておこないました。
CSSも分けたかったのですが、CSSとして認識してくれなかったので、htmlの中に
埋め込むことにしました。
まだ、修正中ですが、その内、ファームを公開します。
今のところ、ファームソースの内容は
1.atcameraio.ino
2.ap_httpd.cpp
3.index.html, index.js(ap_httpd.cpp内部に組み込まれる)
です。
index.html,index.js ファイルをap_httpd.cppに組み込むためのツールですが、下記の物を
用意してます。
ファイルを選択し、変換ボタンをおし、クリップボードにコピーボタンで、ap_httpd.cppに
入れる情報が得られます。いずれ、ap_httpd.cppも atcamera.inoに合体させるつもりで、そうすれば
一つのファイルさえ用意すればいいことになり、ファイルシステムなどを用意する手間を省けます。
と思いましたが、Apacheライセンスの関係から、 ap_httpd.cpp は別にしておいた方がいいかと
思い直しました(チャンチャン)。
ファームのダウンロードはこちらから(2023年6月7日)

ファームのダウンロードはこちらから(2023年5月17日)

Arduinoの設定

S3を使う事、カメラを使う事から一部ArduinoIDEの設定が必要になります。
ボードマネージャで、ESP32S3がなかったら下記の画面の赤枠にhttps://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
といれてください。

このあたりは少々不案内ですが、さらに ツールのボードマネージャで、ESP32を検索し、
下記の項目をインストールする必要があります(バージョンは2.0以降かな?)

それと、ArduinoIDEを開いたら ボードの選択、ポートの選択、PSRAMの選択をしましょうね。
inoファイルを開いても、この辺の情報は 自動的には設定されませんので(下記の画面のように)

デバッグ

デバッグ作業に必要なものは TXD0から出力されるメッセージです。
通常のESPは TXD0,RXD0ポート経由でファームの書き込みをするので、デバッグ時もこのポートを
使ってデバッグ情報をえます。
が、今回は USBポート経由でファームの書き込みをするので、ArduinoIDE付属のモニターが使えません。
ということで、デバッグモニターをWindowsアプリで作成しました。

VisualStudio2008でのプロジェクト一式(ソース)のダウンロードはこちらから
たぶん、VisualStudio2019でも使えるかもしれませんが。
変更せずとも debugフォルダのRSMonitor.exe を実行することで動作します。

I/Oポート

さて、カメラの信号以外のI/Oポートを利用しようと思うのですが、とりあえず、LEDCとして使える
ところを探してみました。
回路図の残りのI/Oポートに LEDC出力をさせ、動作するかを確認、えっ、全部できる。
IO1,2,13,14,21,38,39,40,41,42,45,48 全部 出ちゃいました。ただしPSRAMの35,36,37は対象外です。

アナログ入力について

アナログ入力については IO1-10,IO11-20までが使えるとのことでしたが、この基板で余っていた
IO1,2,およびIO13をテストしてみましたが、変換できませんでした。
ESP32については アナログがいまいちであることはすでに確認してましたが、これはあきらめるしか
なさそうですね。
外部にアナログ変換ICを用意したいと思います。

カメラ用ピン番号の変更

試作1枚目の基板で、わりと任意のピンをカメラ用に割り当てて動作してましたので、もうひとひねりして基板上、配線をすっきりさせるようなピン番号を割り当ててみたらどうなるのかってのをやってみました。

結果は、??? 動作することにはするのですが、時々リセットがはいります。
こりゃ、つかっちゃいかんということですね(チャンチャン)。

最初のファーム書込みのコツ

基板実装したあとに最初にUSB経由でファームを書き込もうとすると失敗するときがあります。
そんなときは下記の方法で書き込める場合があります(万能薬ではないと思いますが)

IO1を使ったらあかんな

温湿度センサーDHT20を入荷したので、実装したところ、起動しなくなりました。
あ、あったな、こんなこと ESP32Eのときも。でIO1を空きピンにしたら動作。
IO1を空きピンにして、IO40をDTH20のSDAに接続しなおしました。
で、ファームも追加して画像画面に、数値を表示させるようにしました。
表示させるのも、ファームだけを改造すればいいのではなく、HTML,JS,JSONファイルといろいろと
準備をしないといけません。こうちっと、簡単に表示できるといいのですが。
手順は
  1.ファームに DFRobot_DHT20 を追加
  2.取得ルーチンを書き、
  3.この値をJSONファイルで吐き出すようにルーチンを追加
  4.HTMLファイルに表示させる、テキスト(位置を含め)を追加
  5.JSファイルに JSONファイルを定期的に読み出すルーチンを追加
  6.取得したら表示する。
といったものになります。