03.M5Cameraのスケッチ


03.M5Cameraのスケッチ

Arduino IDEにあるスケッチ例のCameraWebServerを動作させます。

ボードの設定

  1. Arduino IDE > ツール > ボード > ボードマネージャにてESP32で検索しても、ありませんでした。
  2. Arduino IDE > ファイル > 環境設定にて
  3. 追加のボードマネージャーのURLに https://dl.espressif.com/dl/package_esp32_index.json を追加(横のボタンを押すと、改行して入力できます) > OK
  4. Arduino IDE > ツール > ボード > ボードマネージャにてESP32で検索
  5. esp32 by Espressif Systemsをインストール(Ver1.0.6でした)
  6. Arduino IDE > ツール > ボード > ESP32 Arduino > ESP32 Wrover Moduleでスケッチを表示
  7. Arduino IDE > ツールは以下に設定
    • ボード:"ESP32 Wrover Module"
    • Upload Speed:"921600" (最高速)
    • Flash Frequency:"80MHz" (高速)
    • Flash Mode:"QIO" (Quad(4倍速)の方がDual(2倍速)より速い)
    • Partition Scheme:"Huge APP(3MB No OTA/1MB SPIFFS)"
      カメラ動作はかなり重いので、OTA(Over-The-Air, ネットでファームウェアを更新できる機能)を無効にします。No OTAで3MBが一番大きく、アプリ領域のFlash容量に余裕を持たせます。
    • Core Debug Level:"なし" (シリアルモニタのメッセージを最小限にします。)
    • シリアルポート:"(確認したポート)"

スケッチのインストール

  1. Arduino IDE > ファイル > スケッチ例 > ESP32 > Camera > CameraWebServerを読込みます。CameraWebServer.inoの他に、camera_pins.h, camera_index.h, app_httpd.cppも使用しています。
  2. スケッチは以下の変更が必要です。
    • #define CAMERA_MODEL_WROVER_KIT を削除します。
    • // #define CAMERA_MODEL_M5STACK_V2_PSRAM のコメントを外します。このカメラを使用しています。
    • const char* ssid = "*********"; に自分のwifiのSSIDを記入します。
    • const char* password = "*********"; に自分のwifiのパスワードを記入します。
  3. 変更後、M5Cameraにスケッチを書込みます。
  4. シリアルモニタに「Camera Ready! Use 'http://192.168.68.63' to connect」と表示されると、PCから http://192.168.68.63 を開きます。
設定を変更すると項目が増えることがあります。

製品名とスケッチの定義名

  • ESP32 PSRAM Timer Camera F と
    ESP32 PSRAM Timer Camera X は、
    CAMERA_MODEL_M5STACK_PSRAM
  • M5Camera と M5CameraXは、
    CAMERA_MODEL_M5STACK_V2_PSRAM
    CAMERA_MODEL_M5STACK_WIDE も同じ
  • 使用しない
    CAMERA_MODEL_WROVER_KIT
    CAMERA_MODEL_ESP_EYE
    CAMERA_MODEL_M5STACK_ESP32CAM
    CAMERA_MODEL_AI_THINKER
    CAMERA_MODEL_TTGO_T_JOURNAL

OV2640の設定項目

PC画面で以下が設定できます。[ ]は初期値、{ }は範囲です。
  • Resolution [CIF(400x296)] 選択できるサイズは、{UXGA(1600x1200=1.9M), SXGA(1280x1024=1.3M), XGA(1024x768=0.8M), SVGA(800x600=0.5M), VGA(640x480=0.3M), CIF(400x296=0.1M), QVGA(320x240=77k), HQVGA(240x176=42k), QQVGA(160x120=19k)}
  • Quality:[10] {10~63} 10の方が高画質
  • Brightness:[0] {-2~+2} 明るさ
  • Contrast:[0] コントラスト {-2~+2} +2の方が白っぽくない
  • Saturation:[0] 彩度 {-2~+2} +2の方が鮮やか
  • Special Effect:[No Effect] 特殊効果{無効, 反転, 白黒, 赤, 緑, 青, 茶}
  • AWB:[on] 自動ホワイトバランス
  • AWB Gain:[on] offだと色がおかしい
  • WB Mode:[Auto] ホワイトバランス {自動, 晴れ, 曇り, オフィース, 家}
  • AEC SENSOR:[on] 自動露出
  • AEC DSP:[off]
  • AE Level:[0] {-2~+2} 露出レベル
  • Exposure: [] 露出 {0~1200}
  • AGC [on]:自動ゲイン制御
  • Gain Ceiling:[2x] {2x~128x}
  • BPC:[off]
  • WPC:[on]
  • Raw GMA:[on]
  • Lens Correction:[on] レンズ補正
  • H-Mirror:[off] 左右反転
  • V-Flip:[off] 180°回転
  • DCW(Downsize EN):[on]
  • Color Bar:[off] カラーバー表示
  • Face Detection:[off] 顔検出 onにできません
  • Face Recognition:[off] 顔認識 onにできません
  • Get stillボタン:静止画を表示
  • Start Streamボタン:ストリーム画像を表示
  • Enroll Faceボタン:顔の登録 使用できません

スケッチ

2ケ所のxxxxxには自分のwifiのssidとそのpasswordを記入します。

#include <esp_camera.h>
#include <WiFi.h>
#define CAMERA_MODEL_M5STACK_V2_PSRAM // 修正 M5Camera version B Has PSRAM
#include "camera_pins.h"
const char* ssid = "xxxxx";  // 修正 自分のSSID
const char* password = "xxxxx";  // 修正 自分のwifiのパスワード

void startCameraServer();

void setup() {
  Serial.begin(115200);  // シリアル通信のデータ転送レート(bps)を指定
  Serial.setDebugOutput(true);  // デバッグ出力を有効
  Serial.println();  // 改行
  camera_config_t config;
  config.ledc_channel = LEDC_CHANNEL_0;
  config.ledc_timer = LEDC_TIMER_0;
  config.pin_d0 = Y2_GPIO_NUM;
  config.pin_d1 = Y3_GPIO_NUM;
  config.pin_d2 = Y4_GPIO_NUM;
  config.pin_d3 = Y5_GPIO_NUM;
  config.pin_d4 = Y6_GPIO_NUM;
  config.pin_d5 = Y7_GPIO_NUM;
  config.pin_d6 = Y8_GPIO_NUM;
  config.pin_d7 = Y9_GPIO_NUM;
  config.pin_xclk = XCLK_GPIO_NUM;
  config.pin_pclk = PCLK_GPIO_NUM;
  config.pin_vsync = VSYNC_GPIO_NUM;
  config.pin_href = HREF_GPIO_NUM;
  config.pin_sscb_sda = SIOD_GPIO_NUM;
  config.pin_sscb_scl = SIOC_GPIO_NUM;
  config.pin_pwdn = PWDN_GPIO_NUM;
  config.pin_reset = RESET_GPIO_NUM;
  config.xclk_freq_hz = 20000000;  // 20MHz
  config.pixel_format = PIXFORMAT_JPEG;
  // PSRAM ICが存在する場合は、事前に割り当てられたフレームバッファを大きくするために、UXGA解像度とより高いJPEG品質で初期化します
  if(psramFound()){  // trueならPSRAMが実装されています
    config.frame_size = FRAMESIZE_UXGA;  // 1600x1200
    config.jpeg_quality = 10;            // (0-63)小さいほど高品質
    config.fb_count = 2;                 // 複数の場合i2sは連続モードで実行, JPEGで使用
  } else {
    config.frame_size = FRAMESIZE_SVGA;  // 800x600
    config.jpeg_quality = 12;            // (0-63)画質
    config.fb_count = 1;                 // 
  }
#if defined(CAMERA_MODEL_ESP_EYE)
  pinMode(13, INPUT_PULLUP);  // このカメラは使用しない
  pinMode(14, INPUT_PULLUP);  // このカメラは使用しない
#endif
  esp_err_t err = esp_camera_init(&config);  // カメラ初期化
  if (err != ESP_OK) {                       // エラーの場合
    Serial.printf("エラー カメラ初期化 0x%x", err);  // エラー内容を表示
    return;
  }
  sensor_t * s = esp_camera_sensor_get();
  // 初期センサーは垂直方向に反転し、色は少し飽和しています
  if (s->id.PID == OV3660_PID) {
    s->set_vflip(s, 1);       // 裏返します
    s->set_brightness(s, 1);  // 明るさを少し上げます
    s->set_saturation(s, -2); // 飽和度を下げます
  }
  // 初期フレームレートを上げるには、フレームサイズをドロップダウンします
  s->set_framesize(s, FRAMESIZE_QVGA);  // 320x240
#if defined(CAMERA_MODEL_M5STACK_WIDE) || defined(CAMERA_MODEL_M5STACK_ESP32CAM)
  s->set_vflip(s, 1);   // 裏返します
  s->set_hmirror(s, 1);
#endif
  WiFi.begin(ssid, password);        // wifiに接続
  while (WiFi.status() != WL_CONNECTED) {  // wifiに接続されてなければ
    delay(500);                      // 0.5秒待つ
    Serial.print(".");               // シリアルモニタに表示
  }
  Serial.println("");                // シリアルモニタに表示
  Serial.println("WiFi connected");  // シリアルモニタに表示
  startCameraServer();               // 関数へ
  Serial.print("Camera Ready! Use 'http://");  // シリアルモニタに表示
  Serial.print(WiFi.localIP());      // 割り当てられているIPアドレスを表示
  Serial.println("' to connect");    // シリアルモニタに表示
}

void loop() {
  delay(10000);                      // 10秒待つ
}