ESP32-CAM.jpg

ESP32-CAMにI2Cデバイスを接続する

何が問題か?

ESP32-CAMはESP32-WROOMのGPIOをほぼ使い尽くしていて、空きピンはGPIO-16の1本のみしかない。
GPIO-0はFirmwareの書き込みモードにするときに使うので使用できない。

I2Cを使うには

U0TXDとU0RXDを流用した。
このピンはシリアルコンソールとしてデバッグに使用する以外に、Firmwareを書き込むためのピンにも使われている。
Firmware書き込み時以外は自由に使えるので、シリアルコンソールをあきらめれば2本解放できる。
ESP32はI2Cピンを任意のピンに再アサインできるので、シリアルポートにI2Cを割り当てた。

OLED SSD1306を繋ぐ

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

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

OLEDの接続先

OLEDESP32
VCCVCC(3.3V)
GNDGND
SCLGPIO-1(U0TXD)
SDAGPIO-3(U0RXD)

ライブラリの初期化方法

#include <Wire.h>
#include <SSD1306Wire.h>
SSD1306Wire  display(0x3c, 3, 1, GEOMETRY_128_64);
Wire.begin();

OLED SSD1306を繋ぐ(2)

SDカードを使用しない場合はUARTをデバッグ用に生かしたまま接続可能。
SDカード用IOを転用する。

OLEDの接続先

OLEDESP32
VCCVCC(3.3V)
GNDGND
SCLGPIO-15(CLK)
SDAGPIO-14(CMD)

ライブラリの初期化方法

#include <Wire.h>
#include <SSD1306Wire.h>
SSD1306Wire  display(0x3c, 15, 14, GEOMETRY_128_64);
Wire.begin();

静止画撮影時にフラッシュLEDを光らせる

app_httpd.cppを編集して、LEDを点灯させるコマンドを追加する。
適当な時間点灯させてから、撮影し、その後消灯させる。
適当な時間点灯させるのは、カメラのAEを安定させるため。

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

メインのスケッチにピンの初期化を追加する

フラッシュ用LEDは、GPIO-4につながっている。

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

app_httpd.cppの編集

この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を消灯させてから抜けるように。


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS