#author("2021-12-18T11:30:01+00:00","","")
#author("2021-12-18T11:31:56+00:00","","")
&ref(ESP32-CAM.jpg);

* ESP32-CAMにI2Cデバイスを接続する [#pe8fd960]

* 何が問題か? [#o75579ae]
ESP32-CAMはカメラを繋ぐためにESP32-WROOMのGPIOをほぼ使い尽くしていて、空きピンはGPIO-16の1本のみしかない。~
GPIO-0はFirmwareの書き込みモードにするときに使うので使用できない。~

* もう一つの問題 [#j99039b2]
多くのESP32-CAMは技適が取れていません。(日本の電波法規制)~
よって、WiFiの電波を吹くと電波法違反になります。~

対策としては2つ。~
1)技適の取れているESP32-WROOM32モジュールに張り替える~
2)実験用として6か月の期限付きで申請して使う(やりかたは割愛)~
私は第一級アマチュア無線技士の資格があるので2で対応可能です。~


* I2Cを使うには [#d899d0d9]
%%U0TXDとU0RXDを流用した。%%~
%%このピンはシリアルコンソールとしてデバッグに使用する以外に、Firmwareを書き込むためのピンにも使われている。%%~
%%Firmware書き込み時以外は自由に使えるので、シリアルコンソールをあきらめれば2本解放できる。%%~
%%ESP32はI2Cピンを任意のピンに再アサインできるので、シリアルポートにI2Cを割り当てた。%%~
SDカードのI/Fをあきらめて、GPIO-14(SCLに)とGPIO-15(SDA)に転用した。

* OLED SSD1306を繋ぐ [#jbc8771f]

OLEDのライブラリはこちらを使用した。~
https://github.com/ThingPulse/esp8266-oled-ssd1306

このライブラリは使い勝手が良いが、スクロール機能を持っていないのが唯一の難点。~
OLEDの焼き付き防止については、一定時間表示したら消すのと、ノーマル&リバースを切り替える方法がある。寿命的には前者が良いが、とりあえずノーマル&リバース切り替えで使ってみよう。~

SDカードを使用しない場合はUARTをデバッグ用に生かしたまま接続可能なので、SDカード用IOをI2Cに転用する。~
※元々SDカードのSPIに使用するピン

** OLEDの接続先 [#l51b1078]
|OLED|ESP32|
|VCC|VCC(3.3V)|
|GND|GND|
|SCL|GPIO-15(CLK)|
|SDA|GPIO-14(CMD)|

** ライブラリの初期化方法 [#c809b704]
 #include <Wire.h>
 #include <SSD1306Wire.h>
 SSD1306Wire  display(0x3c, 15, 14, GEOMETRY_128_64);
 Wire.begin();

* 静止画撮影時にフラッシュLEDを光らせる [#q6a7a1e6]
app_httpd.cppを編集して、LEDを点灯させるコマンドを追加する。~
適当な時間点灯させてから、撮影し、その後消灯させる。~
適当な時間点灯させるのは、カメラのAEを安定させるため。~

これで、静止画撮影時にLEDが光る。

** メインのスケッチにピンの初期化を追加する [#p17620cf]
フラッシュ用LEDは、GPIO-4につながっている。~

 void setup() {
  :
   pinMode(4, OUTPUT);
 }

** app_httpd.cppの編集 [#n74f51ca]
このLEDには電流制限抵抗が無いので長時間光らせるのは怖い。~
よって、必要最小限の点灯時間とする。~
ここでは実験の結果250msにしている。

captureハンドラー関数の頭にLED点灯を追加する。
点灯させてから撮影までの待ち時間(ここでは250ms)も追加する。

 static esp_err_t capture_handler(httpd_req_t *req){
     // LED ON
     digitalWrite(4, HIGH);
     delay(250);

他、複数あるreturnの直前行にLED消灯を追加

 digitalWrite(4, LOW);    // LED OFF
 return ESP_FAIL;

 digitalWrite(4, LOW);    // LED OFF
 return res;

どんな結果であっても、LEDを消灯させてから抜けるように。

* 環境センサーBME280を接続して、OLEDに表示させる [#r9cc40b4]
I2Cが使用できるようになったので、BME280(気圧・温度・湿度)を接続して、~
定期的に測定した結果をOLEDに表示させるようにした。~
最終的にはカメラ撮影時のWebサーバから参照したい。

** Arduinoスケッチ [#n29da65c]
こちらのサンプルコードがそのまま使用できた。~
http://trac.switch-science.com/wiki/BME280

メインループ内でOLED表示を白黒反転を繰り返し表示させているので、ここで~
測定して結果を整形してIPアドレスと共にOEDに表示させるだけ。~
測定結果の数値はdouble型の変数に格納されているので、Stringでキャストして~
OLEDに送った。

スケッチにFLASHメモリーを67%使用。

* Tips [#n4164b0f]
- ESP32のI/Oは3.3V
- I2C等のペリフェラルはほとんどのGPIOピンに再割り付けできる~
- ESP32-CAMに書き込むには、GPIO-0ピンをGNDにつないでリセットが必要
- VCCピンはデフォルトで3.3Vが出ている(5VからLDO経由)

*ESP-32CAM PIN Assign [#b3f8f530]
&ref(ESP-32CAM.png);
&ref(ESP32-CAM.png);

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS