カメラモジュール(OV7670)とESP32-WROOMを使ってマイクロスコープ(顕微鏡)を作成しました。
やろうとしていた機能(ソフトウェア)は実装できましたが、構造(ハードウェア)的なイメージが固まらないので、現状で一旦完成としました。
ここでは機能と製作の様子を紹介します。(製作期間:2024年3月から6月)
ボタンスイッチとロータリーエンコーダーで操作します。
ボタンを押しながらロータリーエンコーダーでメニューを選択:撮影画面→ズーム→明るさ→コントラスト。
選択した各画面ではロータリーエンコーダーで値を設定。
撮影画面ではボタン長押しで撮影。SDカードにBMP形式で保存されます。画像の解像度は撮影時のカメラの解像度です(QQVGA,QVGA,VGA)。
LCDを240*320のものにしてQVGA,VGAのみ対応でもよかったと思います。
開発中にあった調光機能は廃止しました。照明用LEDが必要ならスイッチかボリュームを通して電源に接続すればよいです。
機能紹介。照明用LEDの調節、撮影+保存(緑LED点灯)、ズーム、明るさ、コントラスト。ピントは手動だが(カメラ装着のレンズをくるくる回す)、観察しながら頻繁にズーム切替えすることもないのでヨシ。画像は実際に撮影したもの。ズームや画質調整したものが保存される。 pic.twitter.com/2pRfIqKJIa
— 『昼夜逆転』工作室 (@jsdiy) April 29, 2024
製作の様子はTwitter(現X)に投稿していました。「返信」が分岐している箇所もあるので、起点となる投稿を紹介します。
ESP32でカメラOV7670を使うテスト。動いた。既存のライブラリを使わせてもらっているが、画像がやけに乱れるとか映らないとか、なかなか動かず苦労。原因はワイヤーの中途半端な断線。ありがち~ pic.twitter.com/dT0Ttdbcvq— 『昼夜逆転』工作室 (@jsdiy) March 31, 2024
カメラの解像度をQQVGA→QVGA→VGAと切り替える実験。等倍→2倍→4倍ズーム! 面白い。LCDは160*128。 pic.twitter.com/W4SY2X6lel— 『昼夜逆転』工作室 (@jsdiy) April 12, 2024
マイコンボード、カメラ、LCD、コントローラをどうやってまとめるか。マイコンボードとカメラはケーブル接続にする。他をどうするか。LCDをカメラの近くに設置するならこれもケーブル。そうするとケーブルまみれ… pic.twitter.com/PPi8NkQOh8— 『昼夜逆転』工作室 (@jsdiy) May 6, 2024
配線が多く、開発当初はブレッドボードとジャンプワイヤーの接触不良に悩まされました。 ユニバーサル基板に載せ替える際はハンダ付けに思いのほか手こずりました。 ケーブルも邪魔だし、カメラ動作テスト用のPCBを起こせばよかったです。
マイコン部分は「ESP32-WROOM-32Eマイコンボード」を使用しています(後述の部品一覧を参照)。 開発ボードESP32-DevKitCと同型のMCUで、ピンの並びも同じです(5Vピンだけ異なる)。 実際に作成した基板では3V3ピンにパスコン(0.1uF)、ENピンにRC遅延回路(1uF,10kR)を実装しています。
カメラのRESETピンは、LCDと同様、ENピンに接続した方がより良いと思います。
「LED点滅」ピンにはLEDを接続します。撮影時に画像保存中であることを通知するインジケータです。
ピンを節約するなら、LEDを電源ピンと「SD-Card/CS」ピンの間で負論理制御すればよいです。開発中はそのようにしていました。
GPIO-0,12,15はブートストラップ関係のピンなので何も接続しない方が無難です。
ノーマリー・オープンのスイッチであれば取り付けても問題ありません。
Espressif社製「ESP32 Camera Driver」
がESP32-DevKitCに対応していなかったのが運の尽き。解析するのは置いといて他のドライバをあたりました。
その結果、「OV7670 (non FIFO) Library for ESP32 Arduino」
が開発環境(PSRAM非搭載のESP32、ArduinoFramework、FIFOなしOV7670)で動いたので、こちらを利用しています。
ソフトウェアでチャタリング対応したプッシュスイッチ、ロータリーエンコーダーの自作ライブラリは上手く動作しています。
部品名 | 部品番号 | 値/型番 | 個数 | 参考価格/備考 |
---|---|---|---|---|
マイコンボード | -- | ESP32-WROOM-32Eマイコンボード | 1 | 800円(秋月) |
グラフィックLCDモジュール | -- | ST7735 128*160 | 1 | -- |
CMOSカメラモジュール | -- | OV7670 FIFOなし | 1 | -- |
SDカードモジュール | -- | MicroSD | 1 | -- |
ロータリーエンコーダー | -- | -- | 1 | インクリメンタル型 |
プッシュスイッチ | -- | -- | 1 | タクトスイッチ等 |
FIFOなしのOV7670をPSRAMなしのESP32で動かしました。中心技術となるカメラドライバは既存のものを使用しました。 製作にあたってはカメラの動かし方を習得したい気持ちもあったので、その点は消化不良です。 ESP32でカメラドライバを作成するにはI2S,DMAの使い方を理解する必要がありそうです。 Espressif社製のドライバをベースに、時間を掛けてやっていこうと思います。