공모전에 카메라를 쓸 일이 있어서 아두이노에 호환되는 ESP32 모듈을 연결했다.
백업용
ESP32 카메라 같은 경우에는 아두이노랑 호환이 되기 때문에 ESP32에서 아두이노 보드에 연결하고 그 보드를 컴퓨터에 연결해줘도 되고, ESP32 모듈을 산 경우에는 마이크로핀을 연결해서 구동시켜도 된다.
나도 그러려고 얘를 산 건데 어쩐지 데이터 전송용 5핀 선이랑 연결하면 작동이 안되어서 그냥 아두이노 우노랑 연결해서 사용했다.
아두이노 우노- ESP32 Camera 연결 배선
UNO GND - ESP GND
UNO 5V - ESP 5V
UNO 0(RX) - UOR
UNO 1(TX) - UOT
UNO GND - UNO RESET
ESP GND - ESP IO0
점퍼선을 이렇게 연결해주고 아두이노 우노 보드로 포트 연결을 해주면 된다.
툴-보드-보드매니저에 들어가서 ESP 검색
버전을 선택한 후 ESP32 by Espressif Systems 설치
/
이걸 설치하면 예제에 ESP가 뜬다.
예제- ESP32 - Camera- CameraWebServer
이렇게 선택하면 해당 예제가 뜬다.
여기에서
#define CAMERA_MODEL_WROVER_KIT 부분은 각주 처리
#define CAMERA_MODEL_AI_THINKER 부분은 각주 제거
를 해준 다음 노트북이 연결되어있는 와이파이의 이름과 비밀번호를 입력해주면 된다.
#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
//
// Select camera model
//#define CAMERA_MODEL_WROVER_KIT // Has PSRAM
//#define CAMERA_MODEL_ESP_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_AI_THINKER // Has PSRAM
//#define CAMERA_MODEL_TTGO_T_JOURNAL // No PSRAM
#include "camera_pins.h"
const char* ssid = "*********";
const char* password = "*********";
void startCameraServer();
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_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_JPEG;
// if PSRAM IC present, init with UXGA resolution and higher JPEG quality
// for larger pre-allocated frame buffer.
if(psramFound()){
config.frame_size = FRAMESIZE_UXGA;
config.jpeg_quality = 10;
config.fb_count = 2;
} else {
config.frame_size = FRAMESIZE_SVGA;
config.jpeg_quality = 12;
config.fb_count = 1;
}
#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
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
WiFi.begin(ssid, password);
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() {
// put your main code here, to run repeatedly:
delay(10000);
}
코드는 이런 식으로 뜬다. (예제를 열면 카메라 주소값이랑 파티션이 할당된 헤더파일이 같이 들어있음)
-환경설정 및 보드, 포트 설정
/
다음은 파일-환경설정에 들어가서 추가적인 보드매니저를 넣어준다.
https://dl.espressif.com/dl/package_esp32_index.json, http://arduino.esp8266.com/stable/package_esp8266com_index.json
추가적인 보드매니저 URL에 다음 두가지의 링크를 넣어준다.
//
보드: ESP32 Dev Module
업로드 속도: 115200
CPU Frequency: 240MHz
Flash Frequency: 40MHz
Flash Mode: QIO
Flash Size:4MB
Partition Schme: Huge APP
Core Debug level: None
로 선택해준 후 업로드를 해준다
업로드가 정상적으로 이루어진다면 몇분 정도 기다리면 다운로딩을 한다.
여기에서 좀 더 기다리면 업로드랑 다운로드가 완료가 되고
Leaving...
Hard resetting via RTS pin...
이라는 말이 뜬다.
이때 시리얼 모니터를 열어준다.
시리얼 모니터의 주파수는 115200으로 동일하게 설정
ESP32 모듈에서 IO0과 GND가 연결되어 있던 점퍼선 중 GND에 꽂혀있던 걸 뺀다. 그리고 ESP32 보드에 있는 작은 RESET 버튼을 눌러준다.
gnd랑 연결된 점퍼선을 빼고 reset버튼을 눌러야 다음 동작이 실행된다.
리셋 버튼을 눌러준 다음 시리얼 모니터를 확인하면 이런 문구가 뜬다. 여기서 또 잠깐 기다려주면
와이파이가 연결되고 카메라가 준비되었다는 말과 함께 웹서버의 주소창이 뜬다.
이 주소를 복사해서 열어보면 카메라 스트리밍을 위한 서버가 뜬다.
여기서 Start Stream을 눌러주면 카메라가 작동하는 것을 확인할 수 있다
화면을 출력하면서 주소값이 시리얼모니터로 뜸
오류들
오류 1.
메모리 할당 문제
메모리가 부족해서 업로딩이 안 된다고 함..
업로드하는데 시간이 너무 오래 걸린다며 Timed out이 뜸
(오류창이 뜨는 것을 캡처해두지 않음)
Failed uploading: uploading error: exit status 2
이런 식으로 에러가 뜬다.
파티션을 Huge App으로 선택하고 코드 상에서
Serial.print 대신 Serial.print(F())로도 수정을 해봤는데 해당 오류가 뜨는 컴퓨터에서는 결국 업로드를 하지 못했다.
메모리상으로 여유있는 노트북으로 연결하니 업로드됨
/
메모리 문제가 없는 노트북으로 바꿨는데 아두이노 2.0.x 버전으로 최신 버전에서 ESP32 2.0.10 버전을 다운받고 업로드를 하니 업로드가 되지 않음. 레거시 버전이 좀 더 편하기도 하고 래거시로 깔려있는 다른 노트북으로 업로딩하니 문제가 없이 작동해서 다운그레이드해봄
아두이노 소프트웨어 버전 중에 legacy(1.8.x)로 다운그레이드해서 업로드하니 해결이 되었다.
/
DNS 설정도 해보고 PING도 보내보고 방화벽에 와이파이 확인에 다 해봤는데 그런 문제는 아니었고..
ide 1.8.19를 다운받고 esp32 보드는 2.0.10으로 해뒀더니 작동이 안 한 듯 싶다. 아마 esp 버전이 아두이노 소프트웨어의 버전보다 더 낮아야 하는 듯
ide 1.8.19로 두고 esp32 버전은 1.0.6으로 낮춘 뒤 실행하니 카메라 사이트까지 잘 열렸다.
/
이 외에도 시리얼 모니터 열어서 초기 세팅값까지 뜨고 주소가 뜨는데 이상하게 너무 오래걸린다면 와이파이 주소랑 비밀번호를 잘못 설정했을 가능성이 크다.
공모전에 사용할 때도 원하는 대로 잘 동작하기를 바라며...
잘 읽었습니다. 좋은 정보 감사드립니다.