ESP32-WROVER-DEV v1.6 CAM基板を使ってみた

コンピュータ、組み込み

WROVER カメラ付きモジュールを入手しました。
基本機能はじめ、技適付きでBluetooth、Wifiなど機能豊富です。

紹介するもの

ESP32-WROVER-DEV v1.6

特徴

ESP32-WROVER搭載基板で、カメラ(OV-2640)付きです。
技適取得済みですので、Wifi, BLEによる無線通信ができます。

接続Micro A
CPUWROVER (240MHz)
フラッシュMemory4MB
PSRAM8MB
GPIO30 (6本flash接続のため利用不可)(4本読み取り専用)
PWM17 (8bit 255まで)
DAC2 (8bit 255まで) 3.3V
ADC16 (12bit 3.3V = 4095)
UART1 (COM)
I2C1
SPI2
ボタンRESET
BOOT
LED1 青 (GPIO2)
Wifi802.11 b/g/n 2.4GHz~2.5GHz
BluetoothBluetooth v4.2
Wifi, Bluetooth
OVA-2640 カメラ

OV2640カメラモジュールの広角レンズを使ってみました。

ピン配置

表記がよくわからないので、当サイトで紹介するサンプルのピン配置表を作成しました。
参考までに公開ピン配置表も掲載します。

外観

400穴ブレッドボードでは、左右どちらか1列使用することができます。

400穴のブレッドボードなら、2枚を連結させることでピン穴を確保することができます。

使ってみて

カメラと技適付きの組み合わせは少ないので、防犯や定点カメラなど使い方は様々。
IO,通信機能も豊富にあるので様々な用途で期待できます。

消費電力が大きいのと基板が大判なので小回りを利かせた開発は難しいです。

ESP32-WROVER-DEVの2/3くらいのサイズでカメラが動くESP32-WROOM32を使用した記事は

ESP32-S3、TFカードリーダ搭載基板

お手軽ESP32-WROOM32-CAM

準備

ライブラリ

ボードライブラリ

注意
ボードライブラリのバージョン 2.0.4, 2.0.5 でコンパイルすると動作しません。
当方は2.0.3を使用しています。

Arduino IDEのボードマネージャからESP32用のライブラリのインストールとボードの選択をします。

ボードマネージャのURLhttps://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
検索ESP
ボードライブラリesp32 by Espressif Systems バージョン x.x.x※
選択するボードesp32 > ESP32 Wrover Module
※ x.x.x 動作確認はVer2.0.3で行っています。

モジュールライブラリ

機能/モジュールライブラリ名検索確認時のバージョン
SSD1306Adafruit SSD1306 by AdafruitSSD13062.5.1
ST7735Adafruit ST7735 and ST7789
Library by Adafruit
ST77351.9.3
関連
SSD1306
ST7735
Adafruit GFX Library by AdafruitGFX1.11.3
WS2812Adafruit NeoPixel by AdafruitNEOPIXEL1.10.5

スケッチの書き込み

特別な手順はなく書き込みができます。
ArduinoIDEからCOMポートを選択して書き込みを行う。

供給力の低い電源や、USBハブ(電源無し)を使用すると書き込みができなかったり、起動しないなどの症状がみられます。

書き込みに失敗する場合
時々失敗することがあります。
GPIO0とGNDをショートさせます。
その状態でリセットボタン、または電源の再投入をすることでダウンロードモードとなり、確実にスケッチの書き込みができるようになります。

基本スケッチ

LEDチカ

説明

基板上のLEDを点滅させます。
ESP32-WROVER-DEVのビルトインLEDのGPIO番号はGPIO2です。

スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
ESP32-WROVER-DEVで利用できます。

【スケッチの説明】
GPIO ピンを指定して1秒周期(500ms 点灯、500ms 消灯)の点滅を行います。

【ライブラリ】
esp32 > ESP32 Wrover Module

【準備】
指定ピン - 保護抵抗(約200Ω) - LED Anode, LED Cathode - GND
抵抗値は使用するLEDにより適切な抵抗値を求めてください。

【バージョン情報】
2022/10/24 : 新規
**********************************************************************/
// ESP32-WROVER-DEVのdigitalWriteで設定できるピン
// 15, 2, 0, 4, 5, 18, 19, 21, 3, 1, 22, 23, 13, 12, 14, 27, 26, 25, 33, 32       //digitalWrite LED( GPIO2 (青))
#define LED 2       //基板実装LED

void setup()
{
  pinMode(LED, OUTPUT);  //ピン出力設定
}

void loop()
{
  digitalWrite(LED, HIGH);
  delay(500);

  digitalWrite(LED, LOW);
  delay(500);
}
結果

LEDが点滅しました。
緑は電源LEDで常時点灯です。青がサンプルのGPIO2の実装LEDで点滅します。

PWM-DAC

説明

PWMとDACを使ってLEDのフェード点灯(ゆっくり点灯)とフェード消灯(ゆっくり消灯)を行います。

スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
ESP系 DAC 出力が搭載されている基板で使用できます。
ピン出力については使用されるマイコン基板のピンアサイン表などを確認してください。

ESP32-WROVER-DEV で利用できます。

【スケッチの説明】
DA 出力と、PWM出力でのフェード点灯(ゆっくり点灯)とフェード消灯(ゆっくり消灯)を行います。

【ライブラリ】
esp32 > ESP32 Wrover Module

【準備】
指定ピン - 保護抵抗(約200Ω) - LED Anode, LED Cathode - GND
抵抗値は使用するLEDにより適切な抵抗値を求めてください。

PWM と DAC の2系統準備します。

【バージョン情報】
2022/10/26 : 新規
**********************************************************************/
// ESP32-WROVER-DEVのanalogWriteで設定できるピン (0 - 255)
// 15, 2, 0, 4, 5, 18, 19, 21, 3, 1, 22, 23, 13, 12, 14, 27, 26 //PWM (8bit 0 - 255)
//dacWriteで設定できるピン (0 - 255)
// 25,26  //DAC

#define DAC 25        //DA 出力は 25th pin
#define PWM 27        //PWM 出力は 27th pin

void setup()
{
  pinMode(DAC , OUTPUT);
  pinMode(PWM , OUTPUT);
}

void loop()
{
  for(int i = 0; i < 256; i ++)
  {
    analogWrite(PWM, i);
    dacWrite(DAC, i);
    delay(2);
  }

  for(int i = 0; i < 256; i ++)
  {
    analogWrite(PWM, 255 - i);
    dacWrite(DAC, 255 - i);
    delay(2);
  }
}

結果

同じ抵抗と同色のLEDで出力の違いを確認しました。
PWM制御(analogWrite)ではゆっくり点灯、ゆっくり消灯がきれいに見えています。
DAC制御(dacWrite)ではLEDの発光電圧になるまでは消灯していますが、点灯後はゆっくり点灯とゆっくり消灯が確認できます。

オシロスコープで確認します。
PWMではDuty比(LOW時間とHIGH時間の比)の変化が確認できますが、0Vと約3Vの矩形波形が確認できます。
DACでは実際の電圧が0Vから約3Vまでの電圧変化が確認できます。

ADC

説明

ESP32-WROVER-DEVにはアナログ出力があります。
出力したアナログ信号をADCで読み取ります。

配線

GP26 と GP27を直接配線します。

スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
ESP系 DAC 出力が搭載されている基板で使用できます。
ピン出力については使用されるマイコン基板のピンアサイン表などを確認してください。

ESP32-WROVER-DEV で利用できます。

【スケッチの説明】
DA 出力で出力した電圧をADで読み取り、UARTに出力します。

【ライブラリ】
 esp32 > ESP32 Wrover Module

【準備】
指定ピン(DAC) - 指定ピン(ADC)

【バージョン情報】
2022/10/24 : 新規
**********************************************************************/
//ESP32-WROVER-DEV
// 15, 2, 0, 4, 13, 12, 14, 27, 26, 25, 33, 32, 35, 34, 39, 36  //analogRead(12bit 0 - 4095)
//dacWriteで設定できるピン (8bit 0 - 255)
// 25,26  //DAC

#define DAC 25
#define ADC 14

void setup()
{
  Serial.begin(115200);

  pinMode(DAC, OUTPUT);
  pinMode(ADC, INPUT);
}

void loop()
{
  int iADC = 0;
  //アナログ出力を、アナログ入力で読み取ります。
  //結果はCOM出力します。
  for(int i = 0; i < 256; i ++)
  {
    dacWrite(DAC, i);
    iADC = analogRead(ADC);
    Serial.printf("(DAC, ADC) = %d, %d\r\n", i, iADC);
    delay(2);
  }

  for(int i = 0; i < 256; i ++)
  {
    dacWrite(DAC, 255 - i);
    iADC = analogRead(ADC);
    Serial.printf("(DAC, ADC) = %d, %d\r\n", 255 - i, iADC);
    delay(2);
  }
}
結果

DACは8bit(0~255)で設定して最大で3.3V出力します。
ADCは12bit(0~4095)の最大3.3Vを読み出しています。

結果を波形にしました。
横軸はデータ数(index)です。
縦軸左は設定したDA値、縦軸右が読み取ったAD値。
設定は直線的な三角波に見えますが、読み取ったAD値は湾曲しています。

これまでESPのDACで読み取った値は、値が高くなると感度が変化して湾曲する傾向にあります。

UART

説明

UARTは1系統だけで、書き込みに行うUART0です。
単純にオウム返しを行います。

スケッチ
void setup()
{
  Serial.begin(115200);                       //SerialオブジェクトはUART0 (COM)
}

void loop()
{
  if(Serial.available() != 0)                 //UART0にデータがあれば、読み取った内容をUART0に送信
  {
      Serial.write(Serial.read());
  }
}
結果

結果はTeratermを起動して確認します。
Teratermから送信した文字は、エコーバックにより表示されます。
文字が2つずつ表示されるのはTeratermのエコーバック機能により、入力した文字と帰ってきた文字が表示されるためです。

画像は別の評価基板からの流用ですが同様の結果が得られます。

I2C

説明

I2Cを使ってSSD1306(OLED 0.96inch)モニタのサンプルを動作させます。

配線
ESP32-S2-Pico配線SSD1306(0.96inch)
3.3VVCC
GNDGND
GP21(SCL)SCL
GP22(SDA)SDA
スケッチ

SSD1306をI2Cで表示を挿せるサンプルです。
文字列の表示を行います。

そのほか描画サンプルは
Adafruitサンプルスケッチを参考にしてください。
ファイル(F) > スケッチ例 > Adafruit SSD1306 > ssd1306_128x64_i2c

/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
デフォルトでI2Cが設定されている基板で利用できます。
ESP32-WROVER-DEV で利用できます。

【スケッチの説明】
SSD1306 OLEDの制御をします。

【ライブラリ】
esp32 > ESP32 Wrover Module

【準備】
マイコン基板   <-> SSD1306
3V3           <-> VCC
GND           <-> GND
GPIO22(SDA)   <-> SDA
GPIO21(SCL)   <-> SCL

【バージョン情報】
2022/10/26 : 新規
**********************************************************************/

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128                //解像度 128 x 64 で使用します。
#define SCREEN_HEIGHT 64                //SCREEN_HEIGHTは 32 に設定することができます。

#define OLED_RESET     -1               //使用しないので -1を設定する。
#define SCREEN_ADDRESS 0x3C             //I2Cアドレスは 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
                                        //表示制御にはAdafruit製 SSD1306を使用する。
                                        //初期化時には I2C0を使用する (Wire)
                                        
void setup() 
{
  if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    for(;;);
  }

  display.clearDisplay();               //何か表示されている場合に備えて表示クリア

  display.setTextSize(2);               //フォントサイズは2(番目に小さい)
  display.setTextColor(SSD1306_WHITE);  //色指定はできないが必要
  display.setCursor(20, 10);            //テキストの表示開始位置
  display.print(F("TAMANEGI"));         //表示文字列
  display.setCursor(40, 30);
  display.print(F("ESP32"));
  display.setCursor(5, 50);
  display.print(F("WROVER-DEV"));

  display.display();                    //バッファ転送(表示)
}

void loop() {
}
結果

SSD1306に表示ができました。

SPI(ST7735)

説明

SPIを使ってST7735(LCD 1.8inch)モニタのサンプルを動作させます。

配線

VSPIを使用する場合の配線

CH340G配線ST7735(1.8inch)
3.3VVCC
3.3VLED
GNDGND
GP27Reset
GP26AO(DC)
GP18(VSPI SCK)SCK
GP23(VSPI MOSI)SDA
GP5(VSPI CS0)CS

HSPIを使用する場合の配線

CH340G配線ST7735(1.8inch)
3.3VVCC
3.3VLED
GNDGND
GP27Reset
GP26AO(DC)
GP14(HSPI SCK)SCK
GP13(HSPI MOSI)SDA
GP15(HSPI CS0)CS
スケッチ

ST7735をSPIで表示を挿せるサンプルです。
文字列の表示を行います。

そのほか描画サンプルは
Adafruitサンプルスケッチを参考にしてください。
ファイル(F) > スケッチ例 > Adafruit ST7735 and ST7789 Library > graphicstest

ESP32-WROVER-DEVではVSPIとHSPIの2系統が使用できます。
どちらのピンア配置もサンプルに掲載されているので用途に応じてコメントを解除してください。

下記サンプルではVSPIで動作します。

/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
ESP32-WROVER-DEV (CAM) 基板で動作します。

【スケッチの説明】
ST7735 LCDの表示制御します。
ESP32-WROVER-DEVにはH/W SPIが2系統あります。(VSPI, HSPI)
H/W SPI(VSPI, HSPI)を使用するための方法についてサンプル記載します。

【ライブラリ】
esp32 > ESP32 Wrover Module

【準備】
VSPIを使用する場合
マイコン基板 <-> ST7735
3V3           <-> VCC
GND           <-> GND
GPIO5(CS)     <-> CS
GPIO27(Reset) <-> Reset
GPIO26(DC)    <-> AO
GPIO13(MOSI)  <-> SDA
GPIO14(SCK)   <-> SCK

VSPIを使用する場合
マイコン基板 <-> ST7735
3V3           <-> VCC
GND           <-> GND
GPIO15(CS)    <-> CS
GPIO27(Reset) <-> Reset
GPIO26(DC)    <-> AO
GPIO14(MOSI)  <-> SDA
GPIO13(SCK)   <-> SCK

【バージョン情報】
2022/10/26 : 新規
**********************************************************************/

//※サンプルはHSPIを使用する配線で記述しています。
//VSPIを使用する場合は、 VSPIの箇所のコメントの解除とHSPIの箇所をコメントアウトします。

#include <Adafruit_GFX.h> 
#include <Adafruit_ST7735.h>
#include <SPI.h>


//ピン番号設定
//VSPIを使用する場合
#define TFT_CS       5  // CS
#define TFT_RST      27  // Reset 
#define TFT_DC       26  // DC
#define TFT_SCK      18  // Clock
#define TFT_MOSI     23  // MOSI

// //HSPIを使用する場合
// #define TFT_CS          15  // CS
// #define TFT_RST         27  // Reset 
// #define TFT_DC          26  // DC
// #define TFT_SCK         14  // Clock
// #define TFT_MOSI        13  // MOSI

//H/W SPI(VSPI)はこちら
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);

//H/W SPI(HSPI)はこちら。コンストラクタでHSPIオブジェクトを設定する
// SPIClass hspi(HSPI);
// Adafruit_ST7735 tft = Adafruit_ST7735(&hspi, TFT_CS, TFT_DC, TFT_RST);

//S/W SPIはこちら。遅いが任意のピンを使用できる。
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCK, TFT_RST);

void setup(void) 
{

  tft.initR(INITR_BLACKTAB);                //Init ST7735S初期化
  
  tft.fillScreen(ST77XX_BLACK);               //背景の塗りつぶし

  //テキスト表示
  tft.setRotation(3);                         //画面回転
  tft.setTextSize(3);                         //サイズ

  tft.setCursor(0, 20);                      //カーソル位置                      
  tft.setTextColor(ST77XX_RED);              //赤
  tft.printf("TAMANEGI\n");

  tft.setTextColor(ST77XX_GREEN);            //緑
  tft.printf("TAMANEGI\n");

  tft.setTextColor(ST77XX_BLUE);             //青
  tft.printf("TAMANEGI\n");

  tft.setTextColor(ST77XX_YELLOW);           //黄
  tft.printf("TAMANEGI\n");
}

void loop()
{
}
結果

ST7735のサンプルスケッチが動作しました。
※画像はVSPIの配線時です。

特別なスケッチ

CameraWebServer

説明

CameraWebServerを作ります。
スケッチはArduinoのサンプルを使用します。

スケッチ書き込み後のカメラの動作はWebブラウザを使用します。

本記事はこちらを参照させてもらいました。

配線

配線不要です。

スケッチ

手順
①Arduino IDEから
ファイル > スケッチ例 > ESP32 > Camera > CameraWebServer からサンプルを開きます。

②サンプルスケッチをなんか箇所か修正します。
②-1. Select camera modelに定義してあるマクロのコメントの設定と解除をします。
 コメント解除 16行目 : #define CAMERA_MODEL_WROVER_KIT //<省略>
 コメント化 24行目 : //#define CAMERA_MODEL_AI_THINKER // <省略>

②-2. WifiのSSIDとパスワードを記述します。
 36行目 : const char* ssid = “**********”; の**部にSSIDを記述
 37行目 : const char* password = “**********”; の **部にパスワードを記述

③Partition Scheme を変更します。
ツール > Partition Scheme > Huge APP (3MB No OTA/1MB SPIFFS) を選択します。

その後スケッチのコンパイル、書き込みを実施します。

ボードライブラリのバージョン 2.0.4, 2.0.5 でコンパイルすると動作しません。
当方は2.0.3を使用しています。

結果

結果は ESP32-CAMで紹介した内容とほとんど同じになるため画像は転用します。

ESP32-WROVER-DEVを起動するとシリアルモニタに接続の様子と取得したIPアドレスが表示されます。

… はWifiと接続中のようですが、電波が弱かったりすると接続できません。
表示されたIPアドレスをブラウザのURLに入力すると、カメラのWebサーバー画面が表示されます。

Get Still ボタンをおすことで撮影します。
画面左側の設定で画質やサイズを変更できます。
Start Streamボタンを押すことで動画配信ができます。

コメント

タイトルとURLをコピーしました