Arduino環境で FREENOVEのカメラ付き ESP32-S3-WROOM CAM を使う

コンピュータ、組み込み

ESP32 S3 WROOM搭載 FREENOVE のCAMを入手しました。
大判ですがCAMとTFカードもついて、多くのIOピンを使用することができます。
Arduino環境で基本的な入出力と、通信、カメラWeb Serverを使ってみます。

紹介するもの

ESP32-S3-WROOM CAM

特徴
接続Type C
UART側 : CP210x
USB側 : ESP32-S3
CPUESP32-S3 Xtensa 32bit LX7 Dual core 240MHz
GPIO36
ADC20 (12bit 0 – 4095)
PWM36 (8bit 0 – 255)
同時に設定できるのは8本まで
UART2 COMシリアルとGPIO43(TX), GPIO44(RX)と共通
I2C1(デフォルトは無いが、任意のピンに設定可能)
SPI2(デフォルト有るが、任意のピンに設定可能)
ボタンBOOT
Reset
そのほかWS2812 (GPIO 48) GPIO出力ピンと共通
技適あり BLE, Wifi
OV2670 CAM
TFカードスロット

FREENOVE ESP32-S3チュートリアルダウンロードリンク クリックすると問答無用でダウンロードが始まります。
内容物:データシート、ピン配置表、Python、Cのサンプルソースなど

OV2640広角カメラモジュールを使ってみた

ピン配置

作成中

外観

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

使ってみて

以前紹介したESP32-S3-DevkitC-1 にカメラとTFカードスロットを搭載したモデルです。
基本的に使い方は同じです。
基板の幅が広いのでブレッドボードは連結して使用しています。

後日梱包状態の写真もアップしますが、梱包状態も良いです。
チュートリアルの内容やサンプルプログラムもとても充実しています。

その他のESP-CAM

準備

ライブラリ

ボードライブラリ

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 > ESP32S3 Dev Module
※ x.x.x 動作確認は2.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

スケッチの書き込み

スケッチの書き込みは、書き込みモードで起動します。
BOOTボタンを押下しながらResetボタンの押下または電源を投入します。
Arduino IDEから書き込みボタンを押下することで書き込みができます。

トラブル

W2812が勝手に光る

現象

通電状態で、GPIO48ピンに触れるとW2812が発光することがある。
色や明るさはまちまち。

通電状態でブレッドボードに挿抜したり、RSTボタン押下時などにGPIO48ピンに触れることで発光する。

原因

触れたことによりノイズなどがW2812の命令(信号)に相当して発光しているものと推測。

対応

一度電源を切って、再度電源を投入すると消える。
GPIO48ピンに触れるとまた発光するので、オープン状態のGPIO48とGNDを導通させる。

基本スケッチ

ボタンLED

説明

タクトボタンとLEDの組み合わせの動作をします。

タクトボタンはPULLDOWN設定します。(押下したらHIGH)
タクトボタンを読み取り、押下されるとLEDが点灯します。
ボタンが離されるとLEDは消灯します。

配線

GPIO1(LED出力用) -> 保護抵抗(約200Ω) -> LED -> GND
3.3V -> タクトスイッチ -> GPIO2(INPUT)

保護抵抗は目安です。使用されるLEDの適値を求めてください。

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

【マイコン基板】
FREENOVE ESP32-S3-WROOM で利用できます。

【スケッチの説明】
プルダウンしたピンの状態がHighならLEDを点灯、LowならLEDを消灯させます。

【ライブラリ】
esp32 > ESP32S3 Dev Module

【準備】
GPIO1(LED) -> 保護抵抗(約200Ω) -> LED Anode, LED Cathode -> GND
3.3V -> タクトスイッチ -> GPIO2(INPUT)

【バージョン情報】
2022/12/14 : 新規
**********************************************************************/

#define LED 1      //LED
#define BUTTON 2    //タクトスイッチ

void setup()
{
  pinMode(LED, OUTPUT);               //ピン出力設定
  pinMode(BUTTON, INPUT_PULLDOWN);    //プルダウンで入力
}

void loop()
{
  int iStat = digitalRead(BUTTON);
  digitalWrite(LED, iStat);           //ボタンの状態をLEDに出力
}
結果

ボタンを押下するとLEDが点灯し、離すことでLEDが消灯しました。

PWM

説明

PWMを使ってLEDをゆっくり点灯、ゆっくり消灯します。

ESP32-S3-WROOMの同時に使用できるPWMの数は8です。
9個以上設定してもコンパイルエラーにはなりませんが、9番目以降に設定されたピンからは信号はでないようです。

配線

GPIO1(PWM) – 保護抵抗(約200Ω) – LED – GND
ワイヤとLEDで動作させる場合の抵抗値は使用するLEDにより適切な抵抗値を求めてください。

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

【マイコン基板】
FREENOVE ESP32-S3-WROOMで利用できます。

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

【ライブラリ】
esp32 > ESP32S3 Dev Module

【準備】
GPIO1 - 保護抵抗(約200Ω) - LED - GND
ワイヤとLEDで動作させる場合の抵抗値は使用するLEDにより適切な抵抗値を求めてください。

【バージョン情報】
2022/12/16 : 新規
**********************************************************************/

#define PWM 1        //PWM 出力はpin

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

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

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

LEDがゆっくり点灯し、ゆっくり消灯しました。

ADC

準備中

UART

説明

UART0(COM)から読み取ったデータをUART1に送信します。
UART1から読み取ったデータをUART0(COM)に送信します。

配線

ESP32-S3-WROOMには、USB側のコネクタと、UART側のコネクタがあります。

UART側のコネクタでは、USBケーブルを使いUART通信を行うことができます。
USB側では、USBケーブルを使ってUART通信を行うことができません。
GPIO43(TX), GPIO44(RX)からのUART信号をUSB-シリアル変換モジュールを使い通信を行います。

UART側の通信について記載します。

UART0の信号はUSBケーブルにより通信を行う。
UART1はソフトウエアUARTによりGPIO4(TX), GPIO(5)で入出力するのでもう1個のFT232RLと通信する。

ESP32-S3-WROOM CAM配線FT232RL
GPIO4(UART1 TX)RX
GPIO5(UART1 RX)TX
スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
FREENOVE ESP32-S3-WROOM CAM

【スケッチの説明】
 UART0から読み取った情報を UART1へ出力します。
 UART1から読み取った情報を UART0へ出力します。
 
 ESP32-S3-WROOM にはUART1の記載がありますが、
 UART1側はソフトウエアuartで通信します。

【ライブラリ】
esp32 > ESP32S3 Dev Module

【準備】
ESP32-S3-WROOMでは、USBコネクタに USBとUARTの2つのポートが用意されています。
UART側では、USBをUART0で使用することができます。
USB側では、USBコネクタからUART0の通信ができないので、GPIO43(TX), GPIO44(RX)での通信を行います。

 ESP32-S3-WROOM <-> FT232RL(UART1側)
 GPIO4(TX) <-> RX
 GPIO5(RX) <-> TX

【バージョン情報】
2022/12/18 : 新規
**********************************************************************/

#define PIN_TX 4
#define PIN_RX 5

void setup()
{
  Serial.begin(115200);                                   //GPIO 43(TX), 44(RX)に入出力されます
  Serial1.begin(115200, SERIAL_8N1, PIN_RX, PIN_TX);      //Serial1 オブジェクトは ピン指定で使用します
}

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

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

結果はTeratermを2つ起動して確認します。
1つはUART0用で、もう一つはソフトウエアUARTのUART1用。

TeratermのCOM選択ではUARTコネクタ接続したESP32-S3-WROOMを選択します。
もう片方はFT232RLのCOMポート番号を選択します。

結果は掲載しませんが、片側のTeratermから入力した文字が反対のTeratermの画面に表示されます。

I2C(SSD1306)

説明

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

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

配線
ESP32-S3-WROOM CAM配線SSD1306(0.96inch)
3.3VVCC
GNDGND
GPIO2(SCL)SCL
GPIO1(SDA)SDA
スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
ESP32-S3-WROOM CAMで利用できます。

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

【ライブラリ】
esp32 > ESP32S3 Dev Module
Adafruit SSD1306 by Adafruit
Adafruit GFX Library by Adafruit

【準備】
マイコン基板 <-> SSD1306
3V3         <-> VCC
GND         <-> GND
GPIO1(SDA)  <-> SDA
GPIO2(SCL)  <-> SCL
ESP32-S3-WROOM CAMの I2Cでは、 Wire.setPins()により任意の位置にI2CのSDA, SCLを設定することができます。

【バージョン情報】
2022/12/16 : 新規
**********************************************************************/

#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を使用する。

#define PIN_SDA 1
#define PIN_SCL 2                                   
void setup()
{
  Wire.setPins(PIN_SDA, PIN_SCL);

  if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    for(;;);
  }

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

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

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

void loop()
{
}
結果

SSD1306のサンプルスケッチが動作しました。

SPI(ST7735)

説明

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

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

配線
ESP32-S3-WROOM CAM配線ST7735(1.8inch)
3.3VVCC
3.3VLED
GNDGND
GPIO10(SPI CS)CS
GPIO8RESET
GPIO3AO(DC)
GPIO11(SPI MOSI)SDA
GPIO12(SPI SCK)SCK
スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
FreeNove ESP32-S3-WROOM で利用できます。

【スケッチの説明】
ST7735 LCDの表示制御します。
ESP32-S3-WROOM ではSPIを2系統使用できます。
SPIの1系統目はデフォルトピンを使用します。
ピン変更はbegin()関数で任意のピンを設定します。

2系統のSPIを使用する方法と、S/W SPIを使用する方法を記載します。

【ライブラリ】
esp32 > ESP32S3 Dev Module
Adafruit ST7735 and ST7789 Library
Adafruit GFX Library

【準備】
VSPIを使用する場合
マイコン基板 <-> ST7735
3V3            <-> VCC
GND            <-> GND
GPIO10(CS)     <-> CS
GPIO8(Reset)   <-> Reset
GPIO3(DC)      <-> AO
GPIO11(MOSI)   <-> SDA
GPIO12(SCK)    <-> SCK

【バージョン情報】
2022/12/16 : 新規
**********************************************************************/

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

#define TFT_CS    10
#define TFT_RST   8
#define TFT_DC    3
#define TFT_MOSI  11
#define TFT_SCK   12

//1系統目を使用する場合はこのまま、2系統目を使用する場合はコメントアウトする。
#define SPI0


#ifdef SPI0
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);

#else
//2系統目を使用する場合
SPIClass hspi(HSPI);
Adafruit_ST7735 tft = Adafruit_ST7735(&hspi, TFT_CS, TFT_DC, TFT_RST);
#endif

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

void setup(void) 
{

#ifdef SPI0
  //1系統目を使う場合(ピン変更を行う場合コメントを外す)
 // SPI.begin(TFT_SCK, -1, TFT_MOSI, TFT_CS);       //FSPIピンを変更して使用する場合、この行のコメントを解除

#else
//  2系統目を使用する場合はコメント解除
  hspi.begin(TFT_SCK, -1, TFT_MOSI, TFT_CS);       //FSPIピンを変更して使用する場合、この行のコメントを解除
#endif

  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のサンプルスケッチが動作しました。

特別な機能のスケッチ

Neopixel(WS2812)

説明

1秒ごとに、LEDの色を変化させます。
赤->緑->黄->青->紫->水->白

配線

基板実装WS2812を使用するので配線不要。

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

【マイコン基板】
FREENOVE ESP32-S3-WROOMで利用できます。

【スケッチの説明】
基板実装WS2812を点灯させます。
1秒間隔で、赤->緑->黄->青->紫->水->白 の順で点灯させます。

【ライブラリ】
esp32 > ESP32S3 Dev Module
Adafruit NeoPixel by Adafruit 1.10.6

【準備】
配線不要

【バージョン情報】
2022/12/18 : 新規
**********************************************************************/

#include <Adafruit_NeoPixel.h>

#define DIN_PIN 48            // NeoPixel の出力ピン番号
#define LED_COUNT 1           // LEDの連結数
#define WAIT_MS 1000          // 次の点灯までのウエイト
#define BRIGHTNESS 128        // 輝度
Adafruit_NeoPixel pixels(LED_COUNT, DIN_PIN, NEO_GRB + NEO_KHZ800);

void setup()
{
  pixels.begin();             //NeoPixel制御開始
}

void loop()
{
  pixels.clear();
  
  //pixels.Color(Red, Green, Blue)で、パレット情報を作成する。
  //赤点灯
  pixels.setPixelColor(0, pixels.Color(BRIGHTNESS, 0, 0));
  pixels.show();
  delay(WAIT_MS);

  //緑点灯
  pixels.setPixelColor(0, pixels.Color(0, BRIGHTNESS, 0));
  pixels.show();
  delay(WAIT_MS);

  //赤 + 緑 で 黄点灯
  pixels.setPixelColor(0, pixels.Color(BRIGHTNESS, BRIGHTNESS, 0));
  pixels.show();
  delay(WAIT_MS);

  //青点灯
  pixels.setPixelColor(0, pixels.Color(0, 0, BRIGHTNESS));
  pixels.show();
  delay(WAIT_MS);

  //赤 + 青 で 紫点灯
  pixels.setPixelColor(0, pixels.Color(BRIGHTNESS, 0, BRIGHTNESS));
  pixels.show();
  delay(WAIT_MS);

  //緑 + 青 で 水点灯
  pixels.setPixelColor(0, pixels.Color(0, BRIGHTNESS, BRIGHTNESS));
  pixels.show();
  delay(WAIT_MS);

  //赤 + 緑 + 青 で 白点灯
  pixels.setPixelColor(0, pixels.Color(BRIGHTNESS, BRIGHTNESS, BRIGHTNESS));
  pixels.show();
  delay(WAIT_MS);
}
結果

Nexpixelが1秒毎に色の変化をしました。

CameraWebServer

説明

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

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

配線

配線不要です。

スケッチ

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

②サンプルスケッチをなんか箇所か修正します。
②-1. Select camera modelに定義してあるマクロのコメントの設定と解除をします。
 コメント化 18行目 : //#define CAMERA_MODEL_ESP32S3_EYE // Has PSRAM
②-2. WifiのSSIDとパスワードを記述します。
 36行目 : const char* ssid = “**********”; の**部にSSIDを記述
 37行目 : const char* password = “**********”; の **部にパスワードを記述

その後スケッチのコンパイル、書き込みを実施します。
当方は2.0.3を使用しています。

結果

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

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

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

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

コメント

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