기술나눔

ESP32는 카메라를 구동합니다: 1. OV2640 모듈을 구동합니다(검증 예정).

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

1. ArduCam 라이브러리 및 ESPAsyncWebServer 라이브러리 설치

2. 참조 코드

  1. #include <Wire.h>
  2. #include <ArduCAM.h>
  3. #include <SPI.h>
  4. #include <WiFi.h>
  5. #include <ESPAsyncWebServer.h>
  6. #define CAM_CS 32 // modify according to your own wiring
  7. #define OV2640_CHIPID_HIGH 0x0A
  8. #define OV2640_CHIPID_LOW 0x0B
  9. ArduCAM myCAM(OV2640, CAM_CS);
  10. // Set your access point's SSID and password
  11. const char* ssid = "..."; //wifi名
  12. const char* password = "....."; // 密码
  13. AsyncWebServer server(80); // Create an instance of the server
  14. // This function sends the live video frames to the client
  15. void serverStream(AsyncWebServerRequest *request){
  16. AsyncWebServerResponse *response = request->beginResponse("multipart/x-mixed-replace;boundary=frame", HTTP_ANY, [](uint8_t *buffer, size_t maxLen, size_t alreadySent) -> size_t {
  17. if(myCAM.get_bit(ARDUCHIP_TRIG , CAP_DONE_MASK)){
  18. size_t len = myCAM.read_fifo_length();
  19. uint8_t * buf = (uint8_t *)malloc(len);
  20. myCAM.CS_LOW();
  21. myCAM.set_fifo_burst();
  22. myCAM.spi_trans(0xFF);
  23. myCAM.transferBytes(myCAM.camera_model,BUF,buf,len);
  24. myCAM.CS_HIGH();
  25. size_t available_len = len - (alreadySent ? 32 : 0);
  26. size_t will_send =(available_len > maxLen) ? maxLen : available_len;
  27. if (!alreadySent){ // First chunk
  28. memcpy_P(buffer, buf, will_send);
  29. } else { // Consequent chunks
  30. buffer = buf + 32;
  31. }
  32. free(buf);
  33. if (!alreadySent) {
  34. return will_send;
  35. } else if (alreadySent + will_send < len) {
  36. return will_send;
  37. } else {
  38. myCAM.clear_fifo_flag();
  39. return 0; // Last chunk sent, signaling end of response by returning 0 bytes left
  40. }
  41. }
  42. return 0; // If there's nothing in the buffer, return 0 bytes left
  43. });
  44. response->addHeader("Connection", "close");
  45. request->send(response);
  46. }
  47. void setup() {
  48. Wire.begin(21, 22); // SDA, SCL
  49. WiFi.begin(ssid, password);
  50. while (WiFi.status() != WL_CONNECTED) {
  51. delay(1000);
  52. }
  53. myCAM.set_format(JPEG);
  54. myCAM.InitCAM();
  55. myCAM.write_reg(ARDUCHIP_TIM, VSYNC_LEVEL_MASK); // VSYNC is active HIGH
  56. myCAM.clear_fifo_flag();
  57. myCAM.write_reg(ARDUCHIP_FRAMES, 0x00);
  58. server.on("/stream", HTTP_GET, serverStream); // Route for live video stream
  59. server.begin();
  60. }
  61. void loop() {
  62. // You can put other code here
  63. }

3. 하드웨어 배선

OV2640 VCC(전원 공급 장치) --&gt; ESP32 3.3V

OV2640 GND(접지) --&gt; ESP32 GND

OV2640 SDA(데이터 라인) --&gt; ESP32 IO21(I2C 데이터 라인 SDA)

OV2640 SCL(클럭 라인) --&gt; ESP32 IO22(I2C 클록 라인 SCL)

OV2640 VSNC(프레임 동기화) --&gt; ESP32 IO25

OV2640 HREF(행 동기화) --&gt; ESP32 IO23

OV2640 PCLK(픽셀 클럭) --&gt; ESP32 IO19

OV2640 XCLK(시스템 클럭) --&gt; ESP32 IO18

OV2640 D0~D7(데이터 라인) --&gt; ESP32 IO5~IO13(8비트 병렬 데이터 라인)

4. 반성

현재 일부 세심한 친구들은 ESP-WROOM-32 개발 보드가 25위안, OV2640 모듈이 23위안, 총 48위안이며 자체 카메라가 있는 ESP-WROOM-32 개발 보드가 23위안.ESP32캠 개발 보드의 가격은 41위안입니다. 즉, "ESP-WROOM-32+ 모듈" 솔루션은 조정이 어려울 뿐만 아니라 비용도 7위안인데, 그냥 ESP32CAM 개발 보드를 구입하는 것이 어떨까요? 나한테 묻지마 나도 방금 알았으니까...