#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);