0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ESP32-S3 WROOM CAMでデジカメを作る

Last updated at Posted at 2024-09-25

上記の記事ではWROVERでテストしましたが仕事が遅かったのでS3でテストしました。LCDも解像度がよいST7789を使用しました。

ESP32S3_WROOM_SD.drawio.png

ESP32-S3_WROOM CAM3部作になります。

  1. ESP32-S3 WROOM CAMでデジカメを作る
    GPIO0ボタン押下で静止画撮影、SDカードに保存。EdgeImpulseでのトレーニングデータ収集の為。
  2. SDカード画像をブラウザで確認
    SDカードの取り外しが面倒なため
  3. 画像識別ST7789でバウンディングボックス
    EdgeImpulseでの学習モデルを元に画像識別

1.ESP32-S3 WROOM CAMでデジカメを作る

GPIO0ボタンを押すとカメラで撮影し、その画像をSDカードにJPEG形式で保存します。また、TFTディスプレイにも画像を表示します。

TFT_eSPI.h関連

User_Setup_Select.hの修正、下記追加する。

#include <User_Setups/Setup303_ESP32_ST7789A.h> 

User_Setupsフォルダ内に新設

c++ (Setup303_ESP32_ST7789A.h)

#define USER_SETUP_ID 303

#define ST7789_DRIVER 

#define TFT_WIDTH  240
#define TFT_HEIGHT 280

//FOR ESP32-S3 WROOM
#define TFT_MOSI 14  //=SDA
#define TFT_SCLK 47
#define TFT_CS   42// Chip select control pin
#define TFT_DC   21// Data Command control pin
#define TFT_RST  41// Reset pin (could connect to RST pin)

#define LOAD_GLCD
#define LOAD_FONT2
#define LOAD_FONT4
#define LOAD_FONT6
#define LOAD_FONT7
#define LOAD_FONT8
#define LOAD_GFXFF
#define SMOOTH_FONT

#define SPI_FREQUENCY 40000000
#define SPI_READ_FREQUENCY 20000000
#define SPI_TOUCH_FREQUENCY 2500000

ソースコードピックアップ

#include

#include <Arduino.h>
#include <TFT_eSPI.h>  // TFTディスプレイ制御用ライブラリ
#include <SPI.h>       // SPI通信のライブラリ
#include "esp_camera.h" // ESP32カメラ機能を操作するライブラリ
#include "FS.h"         // ファイルシステム管理用ライブラリ
#include "SD_MMC.h"     // SDカード操作用ライブラリ (SDMMC)

setup()

// セットアップ関数
void setup() {
    Serial.begin(115200); 

    pinMode(BUTTON_PIN, INPUT_PULLUP);  // GPIO0をプルアップで入力設定

    // カメラの設定
    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;  
    config.pixel_format = PIXFORMAT_RGB565; 
    config.frame_size = FRAMESIZE_240X240;  
    config.grab_mode = CAMERA_GRAB_WHEN_EMPTY; 
    config.fb_location = CAMERA_FB_IN_PSRAM; 
    config.jpeg_quality = 12;  // JPEG圧縮品質を設定
    config.fb_count = 2;  // フレームバッファの数

    // カメラを初期化
    esp_err_t err = esp_camera_init(&config);
    if (err != ESP_OK) {  // 初期化に失敗した場合
        Serial.printf("Camera init failed with error 0x%x\n", err);
        return;
    }
    Serial.println("Camera ready");  // カメラの初期化成功を通知
    camera_sign = true;  // カメラの初期化成功を示すフラグを設定

    // カメラセンサーの設定を取得
    sensor_t * s = esp_camera_sensor_get();
    if (s != NULL) {
        s->set_hmirror(s, 1); // 水平反転を有効にする、でないとLCDに鏡の様に左右反転する為
 
    }

    tft.init();  // TFTディスプレイを初期化
    tft.setRotation(1);  // ディスプレイの回転を設定
    tft.fillScreen(TFT_WHITE);  // 画面全体を白で塗りつぶす

    // SDカードの初期化
    initSDCard();
}

main()

void loop() {
    if (sd_sign && camera_sign) {  // SDカードとカメラが初期化されている場合
        camera_fb_t *fb = esp_camera_fb_get();  // カメラのフレームバッファを取得
        if (!fb) {  // フレーム取得に失敗した場合
            Serial.println("Failed to get camera frame buffer");
            return;
        }
        
        if (button_is_pressed()) {  // ボタンが押された場合
            Serial.println("Button is pressed");
            char filename[32];  // ファイル名用のバッファ
            sprintf(filename, "/s3_image%d.jpg", imageCount);  // ファイル名を生成
            Serial.printf("Saving picture to: %s\n", filename);
            writeJpegToSD(filename, fb);  // JPEG形式で画像をSDカードに保存
            Serial.println("Picture saved.");
            imageCount++;  // ファイル番号を更新
        }

        uint8_t* buf = fb->buf;  // フレームバッファのデータ
        uint32_t len = fb->len;  // フレームバッファのデータ長

        Serial.println("Displaying image on TFT...");  
        tft.startWrite();  // TFTディスプレイへの書き込みを開始
        tft.setAddrWindow(0, 0, camera_width, camera_height);  // 表示領域を設定
        tft.pushColors(buf, len);  // 画像データをディスプレイに表示
        tft.endWrite();  // 書き込みを終了
        Serial.println("Image displayed on TFT.");
        
        esp_camera_fb_return(fb);  // フレームバッファを解放
        delay(10);  // 少し待機
    }
}

結果

CameraZOOM-20240918153545858 (1).jpg
CameraZOOM-20240918153604809 (1).jpg

20240918_153614.gif

続編はこちら↓になります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?