본문 바로가기
Firmware Programming

[Firmware Programming] ESP32-CAM 보드 usb로 upload 하기

by TYB 2024. 2. 8.
반응형

필자는 아두이노 우노를 통해 업로드를 시도하였으나, 실패했다.

 

이틀 동안 해결방법을 찾아보았으나, 역시 실패하였다.

 

그래서 USB to gpio핀을 통해 direct로 연결해서 upload를 하였더니, 정상적으로 동작하였다.

 

 

 

 

 

HW 결선을 먼저 해준다.

이런 선이고 usb는 컴퓨터에 gpio 핀은 라즈베리파이의 gpio핀에 꽂아주면됨.

USB 케이블 흰색선(RXD)-> ESP32-CAM V0T

USB 케이블 초록색선(TXD)-> ESP32-CAM V0R 

USB 케이블 흑색선(GND)-> ESP32-CAM  GND

USB 케이블 빨강색선(GND)-> ESP32-CAM  5V

 


추가로 업로드 할 때는 항상 ESP32-CAM의 GPIO0와 ESP32-CAM의 GND를 연결해주어야 하고

업로드가 끝나면 GPIO0-GND 선을 빼주고  보드 하단의 RST 버튼을 눌러 코드를 동작시키면 된다!


 

 

윈도우 장치관리자의 포트를 봐보면

 

드라이버 설치 전에는  이렇게 뜬다.

 

 

마우스 오른쪽 클릭으로 디바이스 제거

 

PL2303_Prolific_DriverInstaller_v1_12_0.zip
4.27MB

 

 

 

 

 

 

재부팅하면 뜨죠?

 

 

뜨면 아두이노로 들어간다.

 

좌측 상단 2번째 board manager를 켜면 esp32가 있고 그걸 install해주면 됩니당.

 

보드 설정해주시고~

 

아래쪽에 core debug level~ upload speed 까지 모두 맞게 설정해주시고!!

 

아래 코드를 써주세영

 

이 두가지 값만 본인 환경에 맞게 세팅해주시고

const char* ssid = "aiot5";
const char* password = "aiot51234";

#include "esp_camera.h"
#include <WiFi.h>

//
// WARNING!!! PSRAM IC required for UXGA resolution and high JPEG quality
//            Ensure ESP32 Wrover Module or other board with PSRAM is selected
//            Partial images will be transmitted if image exceeds buffer size
//
//            You must select partition scheme from the board menu that has at least 3MB APP space.
//            Face Recognition is DISABLED for ESP32 and ESP32-S2, because it takes up from 15 
//            seconds to process single frame. Face Detection is ENABLED if PSRAM is enabled as well

// ===================
// Select camera model
// ===================
//#define CAMERA_MODEL_WROVER_KIT // Has PSRAM
//#define CAMERA_MODEL_ESP_EYE // Has PSRAM
//#define CAMERA_MODEL_ESP32S3_EYE // Has PSRAM
//#define CAMERA_MODEL_M5STACK_PSRAM // Has PSRAM
//#define CAMERA_MODEL_M5STACK_V2_PSRAM // M5Camera version B Has PSRAM
//#define CAMERA_MODEL_M5STACK_WIDE // Has PSRAM
//#define CAMERA_MODEL_M5STACK_ESP32CAM // No PSRAM
//#define CAMERA_MODEL_M5STACK_UNITCAM // No PSRAM
#define CAMERA_MODEL_AI_THINKER // Has PSRAM
//#define CAMERA_MODEL_TTGO_T_JOURNAL // No PSRAM
//#define CAMERA_MODEL_XIAO_ESP32S3 // Has PSRAM
// ** Espressif Internal Boards **
//#define CAMERA_MODEL_ESP32_CAM_BOARD
//#define CAMERA_MODEL_ESP32S2_CAM_BOARD
//#define CAMERA_MODEL_ESP32S3_CAM_LCD
//#define CAMERA_MODEL_DFRobot_FireBeetle2_ESP32S3 // Has PSRAM
//#define CAMERA_MODEL_DFRobot_Romeo_ESP32S3 // Has PSRAM
#include "camera_pins.h"

// ===========================
// Enter your WiFi credentials
// ===========================
const char* ssid = "aiot5";
const char* password = "aiot51234";

void startCameraServer();
void setupLedFlash(int pin);

void setup() {
  Serial.begin(115200);
  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_sccb_sda = SIOD_GPIO_NUM;
  config.pin_sccb_scl = SIOC_GPIO_NUM;
  config.pin_pwdn = PWDN_GPIO_NUM;
  config.pin_reset = RESET_GPIO_NUM;
  config.xclk_freq_hz = 20000000;
  config.frame_size = FRAMESIZE_UXGA;
  config.pixel_format = PIXFORMAT_JPEG; // for streaming
  //config.pixel_format = PIXFORMAT_RGB565; // for face detection/recognition
  config.grab_mode = CAMERA_GRAB_WHEN_EMPTY;
  config.fb_location = CAMERA_FB_IN_PSRAM;
  config.jpeg_quality = 12;
  config.fb_count = 1;
  
  // if PSRAM IC present, init with UXGA resolution and higher JPEG quality
  //                      for larger pre-allocated frame buffer.
  if(config.pixel_format == PIXFORMAT_JPEG){
    if(psramFound()){
      config.jpeg_quality = 10;
      config.fb_count = 2;
      config.grab_mode = CAMERA_GRAB_LATEST;
    } else {
      // Limit the frame size when PSRAM is not available
      config.frame_size = FRAMESIZE_SVGA;
      config.fb_location = CAMERA_FB_IN_DRAM;
    }
  } else {
    // Best option for face detection/recognition
    config.frame_size = FRAMESIZE_240X240;
#if CONFIG_IDF_TARGET_ESP32S3
    config.fb_count = 2;
#endif
  }

#if defined(CAMERA_MODEL_ESP_EYE)
  pinMode(13, INPUT_PULLUP);
  pinMode(14, INPUT_PULLUP);
#endif

  // camera init
  esp_err_t err = esp_camera_init(&config);
  if (err != ESP_OK) {
    Serial.printf("Camera init failed with error 0x%x", err);
    return;
  }

  sensor_t * s = esp_camera_sensor_get();
  // initial sensors are flipped vertically and colors are a bit saturated
  if (s->id.PID == OV3660_PID) {
    s->set_vflip(s, 1); // flip it back
    s->set_brightness(s, 1); // up the brightness just a bit
    s->set_saturation(s, -2); // lower the saturation
  }
  // drop down frame size for higher initial frame rate
  if(config.pixel_format == PIXFORMAT_JPEG){
    s->set_framesize(s, FRAMESIZE_QVGA);
  }

#if defined(CAMERA_MODEL_M5STACK_WIDE) || defined(CAMERA_MODEL_M5STACK_ESP32CAM)
  s->set_vflip(s, 1);
  s->set_hmirror(s, 1);
#endif

#if defined(CAMERA_MODEL_ESP32S3_EYE)
  s->set_vflip(s, 1);
#endif

// Setup LED FLash if LED pin is defined in camera_pins.h
#if defined(LED_GPIO_NUM)
  setupLedFlash(LED_GPIO_NUM);
#endif

  WiFi.begin(ssid, password);
  WiFi.setSleep(false);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");

  startCameraServer();

  Serial.print("Camera Ready! Use 'http://");
  Serial.print(WiFi.localIP());
  Serial.println("' to connect");
}

void loop() {
  // Do nothing. Everything is done in another task by the web server
  delay(10000);
}

 

컴파일 & 업로드 하시고~

 

시리얼 모니터를 켜주시고 baudrate 115200

 

 

아까 위에 써놨던 이 말 기억하시죠?

 

추가로 업로드 할 때는 항상 ESP32-CAM의 GPIO0와 ESP32-CAM의 GND를 연결해주어야 하고

업로드가 끝나면 GPIO0-GND 선을 빼주고  보드 하단의 RST 버튼을 눌러 코드를 동작시키면 된다!

 

선을 빼주시고 RST 버튼 누르시면 시리얼 모니터에 저렇게 나올겁니다.

 

저기 마지막에 나오는 ip주소 치면 홈페이지에 들어가지고

 

그 안에서 stream을 start stop 하거나 해당 화면 캡처 등의 다양한 기능을 지원해 줍니다...!

 

 

 

 

다음 글에선 ESP32-CAM으로 UDP 실시간 이미지 전송 및 저장 혹은 스트리밍을 구현해보겠슴다..!

 

 

[Firmware Programming] ESP32-CAM 보드 UDP camera frame 패킷 순서 제어 및 실시간 전송

ESP32-CAM 연결 및 업로드, udp 통신방식은 각자 이해가 된 상태라고 가정하고 진행합니다. 참고자료가 있으면 찾아가면서 하려고 했으나, UDP를 통한 실시간 영상 전송 관련 알고리즘이나 코드를 거

program-developers-story.tistory.com

 

 

반응형