こんばんは。
今回は ESP32-DevKitC とイメージセンサ OV2640 モジュールと小型有機EL(OLED)ディスプレイ SSD1331 モジュールを接続して、自作デジカメっぽいことをやってみます。
前回の記事に引き続き、第2弾として、超難解な esp32-cameraライブラリを読み解いていきますが、前回よりももっと深堀りして読み解いていきたいと思います。
ですが、あまりにも情報量が多いため、今回はモジュール同士の接続方法とサンプルスケッチの動作チェックだけにしておきます。
esp32-camera ライブラリの解体は次回以降で紹介する予定です。
何はともあれ、以下の動画をご覧ください。
どうですか?
画像表示のフレームレートもなかなか速いと思いません?
もう、ほとんどデジカメですよね。
モジュール同士をつなげただけで、アマチュアの私でもここまでできてしまうんです。
ただ単にデバイスの接続とサンプルスケッチの動作チェックですが、これにはいろんなノウハウがあります。
これができるようになるまで、esp32-camera ライブラリをかなり解体して解読していかないと上手く動作しないシロモノでした。
ESP32 にOV2640からの画素データがどのように保存されていて、それを OLED ディスプレイにどのように転送したら画面が表示されるかというところが良く分かっていないと、とてもできないと思います。(といっても私はまだ半分も理解していませんが・・・)
なにしろ、Arduino core for the ESP32 のサンプルスケッチには CameraWebServer がありますが、それがあまりにも難解なため、それを単純化してサクッと使おうとというわけにはいきません。
前回の記事のように、M5Stack製の M5Camera を使えば結線せずに簡単に済ませられますが、イメージセンサ OV2640 からどのようなプロトコルで通信しているのか全く分からず、ブラックボックスと化してしまいます。
ということで、今回は、esp32-cameraライブラリを読み解く第2弾として、それぞれのデバイスをブレッドボードで接続して、動作チェックするところまでやってみたいと思います。
SCCB や DMA通信については、次回以降で紹介する予定です。
- 使う物
- ESP32-DevKitC と OV2640モジュール と SSD1331モジュールを接続する
- Arduino core for the ESP32 のインストール
- Arduino core for the ESP32 のボード設定
- SSD1331 用自作ライブラリのインストール
- まずはesp32-cameraライブラリを使って、OV2640のカメラ映像をOLED SSD1331ディスプレイに表示させる簡単なサンプルスケッチで動作チェック
- カメラ設定
- set_framesize
- set_contrast
- set_brightness
- set_saturation
- set_special_effect
- set_wb_mode
- set_quality
- set_agc_gain
- set_gainceiling
- set_gain_ctrl
- set_exposure_ctrl
- set_aec2
- set_ae_level
- set_aec_value
- set_colorbar
- set_hmirror
- set_vflip
- set_raw_gma
- set_whitebal
- set_awb_gain
- set_lenc
- set_dcw
- set_bpc
- set_wpc
- コンパイル書き込み実行
- (追記:2019/08/15)初回起動時にリセットが数回繰り返される問題について
- 編集後記
使う物
ESP32-DevKitC
今回は、GPIOピンが多数ある、Espressif Systems 純正の ESP32-DevKitC を使って実験しました。
本当はスイッチサイエンスさんの ESPr Developer 32 を使いたかったのですが、GPIO #32, #33 が使えなかったので、あきらめました。
OV2640 CMOSカメラモジュール B0011
Omni Vision社製の最大 1600 x 1200 pixel CMOS カメラ(カラーイメージセンサ)OV2640 を搭載したArducam製カメラモジュール B0011 を使いました。
秋月電子通商さんで販売しています。
http://akizukidenshi.com/catalog/g/gM-13197/
※ここで気を付けて欲しいことがあります。
秋月電子通商さんのこのページには、電源2.5V~3.0V とあります。
とすると、3.3V電源では使えないことになると思います。
確かに、Omni Vision の OV2640データシートには VDDA が 2.5~3.0V とあるので、大丈夫か?・・・と思ってしまいます。
VDDA の絶対定格が 4.5Vとなっているので、大丈夫だと思うんですが、Max 3,0V が気になります。
でも、実はArducam社の以下のページをみると、
https://www.arducam.com/docs/camera-breakout-board/2mp-ov2640/hardware-guide/
VCC : 3.3V に接続と掲載されていました。
そりゃそうですよね。
Arducam が作ったモジュールですから、Arduino の3.3Vに直結できないのはおかしいですね。
そんな訳無いだろうなと思いました。
詳しい回路図がネット上に全く見当たらず、正確なことは言えませんが、恐らく DC-DCコンバーターチップらしきもの??が基板に見えるので、それがマウントされていると思われます。
今のところ、3.3V電源に接続して使用し続けていますが、特に問題無く使用できています。
また、これにはフレームバッファ用のメモリはありません。
画面を大きくディスプレイに表示させたい場合には、フレームバッファメモリ付きのものか PSRAM などが別途必要だと思います。
M5Stack社の M5Camera では PSRAM付きの ESP32 WROVER が使われている理由が解る気がしますね。
今回は QQVGA ( 160 x 120 pixel )程度の画像をテストする程度ですから、B0011で充分です。
これを使い倒したら、次回はフレームバッファ付きのOV2640モジュールを使ってみたいと思っています。
小型有機EL ( OLED )ディスプレイ SSD1331 モジュール ( SPI 用)
96 x 64 RGB pixel のSOLOMON SYSTECH社製OLED(有機EL)ディスプレイドライバー SSD1331 を搭載したモジュールです。
これは SPI インターフェース用のものです。
Amazon で購入しました。
(※当時購入した販売店は無くなっていました。今の所以下の販売店で売っているみたいです。)
これは個人的にとっても使い易い小型フルカラーOLEDモジュールだと思います。
今回の様な「とりあえず」的なイメージセンサの動作チェックには最適だと思います。
このモジュールについて、過去にレビューした記事がありますので、以下を合わせてご参照ください。
フルカラー OLED SSD1331 を ESP32 ( ESP-WROOM-32 )で動かしてみた
有機EL ( OLED ) SSD1331 ライブラリを作成しました ( ESP32 用 )
ブレッドボード
ブレッドボードのおススメは何と言ってもサンハヤト製のニューブレッドボード SAD-101 だと思います。
通常より列が多めなので、とっても重宝しています。
ブレッドボード・ジャンパーワイヤ(メス-オス)
OV2640 カメラモジュールと接続できれば何でも良いと思うのですが、私は今回は以下の多芯フラットワイヤーを使って、QIコネクタ(2550/デュポンコネクタ)を使って、長さ10cm程度のジャンパーワイヤーを自作しました。
フラットワイヤーは以前Amazonで購入した販売店が無くなっていて紹介できないのですが、以下のものとたぶん同じものだと思います。
それと、QIコネクタは以下のようなものです。
また、Amazon で既にコネクタが圧着して付けられている既製品も売っていましたね。
私はこれを使ったことが無いのですが、手作り圧着が苦手な方には重宝するかも。
これは長さ 20cm なので、私が自作したものより 10cm 長いです。
もし、上手く動作しなかったら、長さを半分にして、ご自分で端子を圧着した方が良いと思います。
以前、こちらの記事で QIコネクタ圧着について紹介したことがありましたが、圧着工具についてネット情報では、エンジニア製 PA-09 がおススメという情報が多いです。
私の場合は HOZAN の P-706 と両方持っており、P-706 は精度が劣りますが、個人的には P-706 の方が圧着し易く、使いやすいです。
良質で太く短いUSBケーブル
ESP32 開発ボードでは、パソコンのUSBポートと接続するケーブルが必要ですが、ESP32 には突発的に大電流(最大600mA前後)が流れます。
更に、カメラセンサーの OV2640 や OLED ディスプレイの SSD1331 を使うと、思わぬ大電流が流れて、CPUの動作電圧を下回る電圧降下が起きる可能性があります。
粗悪なUSBケーブルを使ってしまうと、突発的な電圧降下で ESP32 や OV2640 の起動が不安定になる可能性があります。
ですから、電圧降下の少ない良質な太く短いUSBケーブルが必要です。
そして、USBハブは使わないようにしてください。
私はAnkerの以下のUSBケーブルを長い間使っています。
パソコン等
以下、Windowsパソコンで説明します。
パソコンはできるだけ高速CPU、大容量メモリのものを使用してください。
では、次は各モジュールの接続方法を説明します。
コメント
mgo-tec 様
早速試そうと思いましたが、手元に OV2640 CMOSカメラモジュールが無く、秋月電子通商さんに注文し、現在入荷を待っているところです。
M5Camera が使用できないのは残念ですが、今後のご検討を期待しております。
juchangさん
ご無沙汰しております。
いつも記事をご覧いただき、そして試していただき、ありがとうございます。
この記事はM5Cameraを自在に使えるようにする目的でもあります。
その前に、それぞれの配線と通信プロトコルを理解するためにも、OV2640モジュールは別途配線して確認する必要がありました。
esp32-cameraライブラリが理解できるようになると、M5Cameraでディープラーニングができるかも知れません。
今後ご期待いただければと思います。
いつも本当にありがとうございます。
m(_ _)m
ESP32 CAMでデジカメみたいなものが作れないかと考えて本ブログにたどり着きました。
自分なりに試行錯誤してみたのですが、どうあがいてもフレームレートが出ません。以下のように記載しているのですが、
fb = esp_camera_fb_get();
if (!fb) {
Serial.println(“Camera capture failed”);
}
シリアルモニタには、一秒に数回、”Camera capture failed”と表示されます。画像フォーマットはRGB565です。
フレームレートを出すにあたってカメラのデータ取得の点で何か工夫はありますでしょうか。
匿名さん
ブログをご覧いただき、ありがとうございます。
この記事のプログラミングは1年以上前なので、今の環境でちゃんと動くかは不明です。
まず、お聞きしたいのは、フレームレートはどのくらい出ているのでしょうか?
esp32-cameraライブラリの場合は、この後のM5Cameraとの記事を読み進めていくと分かって来るのですが、最高で25fpsまでしか出ません。
loop関数の処理が速いと、25fpsを上回ってしまい、OV2640から画像データを取得できない時が多々出てくるのかも知れません。
LCD画面が正常に表示されていれば、シリアルモニタの表示は気にしなくて良いかも知れません。
最初の方で紹介した動画くらいの速度が出ていれば問題無いかと思います。
また、OV2640とESP32の配線はできるだけ短い方がエラーが少ないです。
また、シリアルモニタを表示させるだけで遅くなりますので、シリアルモニタを起動しない方が速くなるかも知れません。
おはようございます。
有益な情報の公開、ありがとうございます。
GPIO#12が使えない理由は、フラッシュチップ(VDD_SDIO)に電力を供給する内部レギュレータの出力電圧を選択するためのブートストラップピンとして使用されているからだと思います。
こちらにGPOIO12に関する注意点が記載されています。
https://github.com/espressif/esp-idf/blob/master/examples/storage/sd_card/sdmmc/README.md
nopnop2002さん
おひさしぶりですね。
再びコメントいただき、ありがとうございまーす!
GPIO #12 の謎はそういうことだったんですね。
MMCは使ったこと無いので、そのドキュメントは全く知りませんでした。
教えて頂き、ありがとうございます。
トラブルシューティング記事の項目も修正しておこうと思います。
重ねてありがとうございました~。
m(_ _)m