03.M5Cameraのスケッチ
03.M5Cameraのスケッチ
Arduino IDEにあるスケッチ例のCameraWebServerを動作させます。
ボードの設定
- Arduino IDE > ツール > ボード > ボードマネージャにてESP32で検索しても、ありませんでした。
- Arduino IDE > ファイル > 環境設定にて
- 追加のボードマネージャーのURLに https://dl.espressif.com/dl/package_esp32_index.json を追加(横のボタンを押すと、改行して入力できます) > OK
- Arduino IDE > ツール > ボード > ボードマネージャにてESP32で検索
- esp32 by Espressif Systemsをインストール(Ver1.0.6でした)
- Arduino IDE > ツール > ボード > ESP32 Arduino > ESP32 Wrover Moduleでスケッチを表示
- 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:"なし" (シリアルモニタのメッセージを最小限にします。)
- シリアルポート:"(確認したポート)"
スケッチのインストール
- Arduino IDE > ファイル > スケッチ例 > ESP32 > Camera > CameraWebServerを読込みます。CameraWebServer.inoの他に、camera_pins.h, camera_index.h, app_httpd.cppも使用しています。
- スケッチは以下の変更が必要です。
- #define CAMERA_MODEL_WROVER_KIT を削除します。
- // #define CAMERA_MODEL_M5STACK_V2_PSRAM のコメントを外します。このカメラを使用しています。
- const char* ssid = "*********"; に自分のwifiのSSIDを記入します。
- const char* password = "*********"; に自分のwifiのパスワードを記入します。
- 変更後、M5Cameraにスケッチを書込みます。
- シリアルモニタに「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秒待つ
}