From 069e6ff2e7b90c3dbab067e68baf25f0b837ad0a Mon Sep 17 00:00:00 2001 From: Dominik Rimpf Date: Sat, 24 Aug 2024 11:32:26 +0200 Subject: [PATCH] Add support for M5PoECAM-W (#140) * add support for M5PoECAM-W (U121-B) * update documentation for newly added M5PoECAM-W * update board values for m5poecam-w --- README.md | 67 ++++++++++--------- assets/boards/m5stack_m5poecam-w_back.webp | Bin 0 -> 36380 bytes assets/boards/m5stack_m5poecam-w_front.webp | Bin 0 -> 18656 bytes boards/esp32cam_m5stack_m5poecam_w.json | 68 ++++++++++++++++++++ platformio.ini | 5 +- 5 files changed, 108 insertions(+), 32 deletions(-) create mode 100644 assets/boards/m5stack_m5poecam-w_back.webp create mode 100644 assets/boards/m5stack_m5poecam-w_front.webp create mode 100644 boards/esp32cam_m5stack_m5poecam_w.json diff --git a/README.md b/README.md index dff03fd..c0f624c 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,7 @@ This software supports the following ESP32-CAM (and alike) modules: - M5STACK_V2_PSRAM - M5STACK_PSRAM - M5STACK_WIDE +- M5STACK M5PoECAM-W - M5STACK - Seeed Studio XIAO ESP32S3 SENSE - TTGO T-CAMERA @@ -97,21 +98,22 @@ There are a lot of boards available that are all called ESP32-CAM. However, there are differences in CPU (type/speed/cores), how the camera is connected, presence of PSRAM or not... To select the right board use the table below and use the configuration that is listed below for your board: -| Board | Image | CPU | SRAM | Flash | PSRAM | Camera | | Site | -|--- |--- |--- |--- |--- | --- |--- |--- |--- | -| Espressif ESP32-Wrover CAM | ![img](assets/boards/esp32-wrover-cam.jpg) | ESP32 | 520KB | 4Mb | 4MB | OV2640 | | | -| AI-Thinker ESP32-CAM | ![img](assets/boards/ai-thinker-esp32-cam-ipex.jpg) ![img](assets/boards/ai-thinker-esp32-cam.jpg) | ESP32-S | 520KB | 4Mb | 4MB | OV2640 | | [https://docs.ai-thinker.com/esp32-cam](https://docs.ai-thinker.com/esp32-cam) | -| Espressif ESP-EYE | ![img](assets/boards/espressif-esp-eye.jpg) | ESP32 | 520KB | 4Mb | 4MB | OV2640 | | | -| Espressif ESP-S3-EYE | ![img](assets/boards/espressif-esps3-eye.jpg) | ESP32-S3 | 520KB | 4Mb | 4MB | OV2640 | | [https://www.espressif.com/en/products/devkits/esp-eye/overview](https://www.espressif.com/en/products/devkits/esp-eye/overview) | -| LilyGo camera module | ![img](assets/boards/lilygo-camera-module.jpg) | ESP32 Wrover | 520KB | 4Mb | 4MB | OV2640 / OV5640 | | | -| LilyGo Simcam | ![img](assets/boards/lilygo-simcam.jpg) | | | | | OV2640 | | | -| LilyGo TTGO-T Camera | ![img](assets/boards/lilygo-ttgo-t-camera.jpg) | | | | | OV2640 | | | -| M5Stack ESP32CAM | ![img](assets/boards/m5stack_esp32cam_02.webp) | ESP32 | 520Kb | 4Mb | - | OV2640 | Microphone | [https://docs.m5stack.com/en/unit/esp32cam](https://docs.m5stack.com/en/unit/esp32cam) | -| M5Stack UnitCam | ![img](assets/boards/m5stack_unit_cam_02.webp) ![img](assets/boards/m5stack_unit_cam_03.webp) | ESP32-WROOM-32E | 520KB | 4Mb | - | OV2640 | | [https://docs.m5stack.com/en/unit/unit_cam](https://docs.m5stack.com/en/unit/unit_cam) | -| M5Stack Camera | ![img](assets/boards/m5stack-esp32-camera.jpg) | ESP32 | 520Kb | 4Mb | - | OV2640 | | [https://docs.m5stack.com/en/unit/m5camera](https://docs.m5stack.com/en/unit/m5camera) | -| M5Stack Camera PSRAM | ![img](assets/boards/m5stack-esp32-camera.jpg) | ESP32 | 520Kb | 4Mb | 4Mb | OV2640 | | [https://docs.m5stack.com/en/unit/m5camera](https://docs.m5stack.com/en/unit/m5camera) | -| M5Stack UnitCamS3 | ![img](assets/boards//m5stack_Unitcams3.webp) ![img](assets/boards/m5stack_Unitcams32.webp) | ESP32-S3-WROOM-1-N16R8 | 520Kb | 16Mb | 8Mb | OV2640 | | [https://docs.m5stack.com/en/unit/Unit-CamS3](https://docs.m5stack.com/en/unit/Unit-CamS3) | -| Seeed studio Xiao ESP32S3 Sense | ![img](assets/boards/seeed-studio-xiao-esp32s3-sense.jpg) | ESP32-S3R8 | 520KB | 8Mb | 8MB | OV2640 | Microphone | [https://www.seeedstudio.com/XIAO-ESP32S3-Sense-p-5639.html](https://www.seeedstudio.com/XIAO-ESP32S3-Sense-p-5639.html) | +| Board | Image | CPU | SRAM | Flash | PSRAM | Camera | | Site | +|---------------------------------|--------------------------------------------------------------------------------------------------------|------------------------|--------|-------|-------|-----------------|------------|----------------------------------------------------------------------------------------------------------------------------------| +| Espressif ESP32-Wrover CAM | ![img](assets/boards/esp32-wrover-cam.jpg) | ESP32 | 520KB | 4Mb | 4MB | OV2640 | | | +| AI-Thinker ESP32-CAM | ![img](assets/boards/ai-thinker-esp32-cam-ipex.jpg) ![img](assets/boards/ai-thinker-esp32-cam.jpg) | ESP32-S | 520KB | 4Mb | 4MB | OV2640 | | [https://docs.ai-thinker.com/esp32-cam](https://docs.ai-thinker.com/esp32-cam) | +| Espressif ESP-EYE | ![img](assets/boards/espressif-esp-eye.jpg) | ESP32 | 520KB | 4Mb | 4MB | OV2640 | | | +| Espressif ESP-S3-EYE | ![img](assets/boards/espressif-esps3-eye.jpg) | ESP32-S3 | 520KB | 4Mb | 4MB | OV2640 | | [https://www.espressif.com/en/products/devkits/esp-eye/overview](https://www.espressif.com/en/products/devkits/esp-eye/overview) | +| LilyGo camera module | ![img](assets/boards/lilygo-camera-module.jpg) | ESP32 Wrover | 520KB | 4Mb | 4MB | OV2640 / OV5640 | | | +| LilyGo Simcam | ![img](assets/boards/lilygo-simcam.jpg) | | | | | OV2640 | | | +| LilyGo TTGO-T Camera | ![img](assets/boards/lilygo-ttgo-t-camera.jpg) | | | | | OV2640 | | | +| M5Stack ESP32CAM | ![img](assets/boards/m5stack_esp32cam_02.webp) | ESP32 | 520Kb | 4Mb | - | OV2640 | Microphone | [https://docs.m5stack.com/en/unit/esp32cam](https://docs.m5stack.com/en/unit/esp32cam) | +| M5Stack UnitCam | ![img](assets/boards/m5stack_unit_cam_02.webp) ![img](assets/boards/m5stack_unit_cam_03.webp) | ESP32-WROOM-32E | 520KB | 4Mb | - | OV2640 | | [https://docs.m5stack.com/en/unit/unit_cam](https://docs.m5stack.com/en/unit/unit_cam) | +| M5Stack Camera | ![img](assets/boards/m5stack-esp32-camera.jpg) | ESP32 | 520Kb | 4Mb | - | OV2640 | | [https://docs.m5stack.com/en/unit/m5camera](https://docs.m5stack.com/en/unit/m5camera) | +| M5Stack Camera PSRAM | ![img](assets/boards/m5stack-esp32-camera.jpg) | ESP32 | 520Kb | 4Mb | 4Mb | OV2640 | | [https://docs.m5stack.com/en/unit/m5camera](https://docs.m5stack.com/en/unit/m5camera) | +| M5Stack UnitCamS3 | ![img](assets/boards/m5stack_Unitcams3.webp) ![img](assets/boards/m5stack_Unitcams32.webp) | ESP32-S3-WROOM-1-N16R8 | 520Kb | 16Mb | 8Mb | OV2640 | | [https://docs.m5stack.com/en/unit/Unit-CamS3](https://docs.m5stack.com/en/unit/Unit-CamS3) | +| M5Stack M5PoECAM-W | ![img](assets/boards/m5stack_m5poecam-w_front.webp) ![img](assets/boards/m5stack_m5poecam-w_back.webp) | ESP32-D0WDQ6-V3 | 520 kB | 16MB | 8MB | OV2640 | | [https://docs.m5stack.com/en/unit/poecam-w](https://docs.m5stack.com/en/unit/poecam-w) | +| Seeed studio Xiao ESP32S3 Sense | ![img](assets/boards/seeed-studio-xiao-esp32s3-sense.jpg) | ESP32-S3R8 | 520KB | 8Mb | 8MB | OV2640 | Microphone | [https://www.seeedstudio.com/XIAO-ESP32S3-Sense-p-5639.html](https://www.seeedstudio.com/XIAO-ESP32S3-Sense-p-5639.html) | ## Installing and running PlatformIO @@ -310,22 +312,23 @@ The availability of PSRAM can be seen in the HTML status overview. Not all the boards are equipped with PSRAM: -| Board | PSRAM | -|--- |--- | -| WROVER_KIT | 8Mb | -| ESP_EYE | 8Mb | -| ESP32S3_EYE | 8Mb | -| M5STACK_PSRAM | 8Mb | -| M5STACK_V2_PSRAM | Version B only | -| M5STACK_WIDE | 8Mb | -| M5STACK_ESP32CAM | No | -| M5STACK_UNITCAM | No | -| M5STACK_UNITCAMS3 | 8Mb | -| AI_THINKER | 8Mb | -| TTGO_T_JOURNAL | No | -| ESP32_CAM_BOARD | ? | -| ESP32S2_CAM_BOARD | ? | -| ESP32S3_CAM_LCD | ? | +| Board | PSRAM | +|--------------------|----------------| +| WROVER_KIT | 8Mb | +| ESP_EYE | 8Mb | +| ESP32S3_EYE | 8Mb | +| M5STACK_PSRAM | 8Mb | +| M5STACK_V2_PSRAM | Version B only | +| M5STACK_WIDE | 8Mb | +| M5STACK_ESP32CAM | No | +| M5STACK_UNITCAM | No | +| M5STACK_UNITCAMS3 | 8Mb | +| M5STACK_M5PoECAM-W | 8MB | +| AI_THINKER | 8Mb | +| TTGO_T_JOURNAL | No | +| ESP32_CAM_BOARD | ? | +| ESP32S2_CAM_BOARD | ? | +| ESP32S3_CAM_LCD | ? | Depending on the image resolution, framerate and quality, the PSRAM must be enabled and/or the number of frame buffers increased to keep up with the data generated by the sensor. There are (a lot of?) boards around with faulty PSRAM. If the camera fails to initialize, this might be a reason. See on [Reddit](https://www.reddit.com/r/esp32/comments/z2hyns/i_have_a_faulty_psram_on_my_esp32cam_what_should/). @@ -357,6 +360,8 @@ esp32cam-rtsp depends on PlatformIO, Bootstrap 5 and Micro-RTSP by Kevin Hester. ## Change history +- August 2024 + - Added support for M5Stack M5PoECAM-W - January 2024 - Moved settings to board definitions - Added new boards diff --git a/assets/boards/m5stack_m5poecam-w_back.webp b/assets/boards/m5stack_m5poecam-w_back.webp new file mode 100644 index 0000000000000000000000000000000000000000..bf2088bb44634aaa162bd8e5da5443c3ff2a4181 GIT binary patch literal 36380 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 literal 0 HcmV?d00001 diff --git a/assets/boards/m5stack_m5poecam-w_front.webp b/assets/boards/m5stack_m5poecam-w_front.webp new file mode 100644 index 0000000000000000000000000000000000000000..888b2fc823ea3262925d628136b77c48ed0a77a1 GIT binary patch literal 18656 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 Kr`H)4@V@|!%4wGX literal 0 HcmV?d00001 diff --git a/boards/esp32cam_m5stack_m5poecam_w.json b/boards/esp32cam_m5stack_m5poecam_w.json new file mode 100644 index 0000000..9b2e6ea --- /dev/null +++ b/boards/esp32cam_m5stack_m5poecam_w.json @@ -0,0 +1,68 @@ +{ + "build": { + "arduino":{ + "ldscript": "esp32_out.ld", + "partitions": "default_8MB.csv" + }, + "core": "esp32", + "extra_flags": [ + "'-D ESP32CAM_M5STACK_M5POECAM'", + "'-D BOARD_HAS_PSRAM'", + "'-D USER_LED_GPIO=0'", + "'-D USER_LED_ON_LEVEL=LOW'", + "'-mfix-esp32-psram-cache-issue'", + "'-D CAMERA_CONFIG_PIN_PWDN=GPIO_NUM_NC'", + "'-D CAMERA_CONFIG_PIN_RESET=15'", + "'-D CAMERA_CONFIG_PIN_XCLK=27'", + "'-D CAMERA_CONFIG_PIN_SCCB_SDA=14'", + "'-D CAMERA_CONFIG_PIN_SCCB_SCL=12'", + "'-D CAMERA_CONFIG_PIN_Y9=19'", + "'-D CAMERA_CONFIG_PIN_Y8=36'", + "'-D CAMERA_CONFIG_PIN_Y7=18'", + "'-D CAMERA_CONFIG_PIN_Y6=39'", + "'-D CAMERA_CONFIG_PIN_Y5=5'", + "'-D CAMERA_CONFIG_PIN_Y4=34'", + "'-D CAMERA_CONFIG_PIN_Y3=35'", + "'-D CAMERA_CONFIG_PIN_Y2=32'", + "'-D CAMERA_CONFIG_PIN_VSYNC=22'", + "'-D CAMERA_CONFIG_PIN_HREF=26'", + "'-D CAMERA_CONFIG_PIN_PCLK=21'", + "'-D CAMERA_CONFIG_CLK_FREQ_HZ=20000000'", + "'-D CAMERA_CONFIG_LEDC_TIMER=LEDC_TIMER_0'", + "'-D CAMERA_CONFIG_LEDC_CHANNEL=LEDC_CHANNEL_0'", + "'-D CAMERA_CONFIG_FB_COUNT=2'", + "'-D CAMERA_CONFIG_FB_LOCATION=CAMERA_FB_IN_PSRAM'", + "'-D SCCB_I2C_PORT=I2C_NUM_0'", + "'-D GROVE_SDA=25'", + "'-D GROVE_SCL=33'" + ], + "f_cpu": "240000000L", + "f_flash": "80000000L", + "flash_mode": "dio", + "mcu": "esp32", + "variant": "esp32" + }, + "connectivity": [ + "wifi", + "bluetooth", + "ethernet", + "can" + ], + "debug": { + "openocd_board": "esp-wroom-32.cfg" + }, + "frameworks": [ + "arduino", + "espidf" + ], + "name": "ESP32-CAM M5STACK M5PoECAM-W", + "upload": { + "flash_size": "16MB", + "maximum_ram_size": 327680, + "maximum_size": 16777216, + "require_upload_port": true, + "speed": 460800 + }, + "url": "https://docs.m5stack.com/en/unit/poecam-w", + "vendor": "M5STACK" +} \ No newline at end of file diff --git a/platformio.ini b/platformio.ini index 3f722ef..49d6ea6 100644 --- a/platformio.ini +++ b/platformio.ini @@ -20,10 +20,10 @@ #default_envs = esp32cam_m5stack_camera_psram #default_envs = esp32cam_m5stack_camera #default_envs = esp32cam_m5stack_esp32cam - #default_envs = esp32cam_m5stack_unitcam #default_envs = esp32cam_m5stack_unitcams3 #default_envs = esp32cam_m5stack_wide +#default_envs = esp32cam_m5stack_m5poecam_w #default_envs = esp32cam_seeed_xiao_esp32s3_sense #default_envs = esp32cam_ttgo_t_camera #default_envs = esp32cam_ttgo_t_journal @@ -101,6 +101,9 @@ board = esp32cam_m5stack_unitcams3 [env:esp32cam_m5stack_wide] board = esp32cam_m5stack_wide +[env:esp32cam_m5stack_m5poecam_w] +board = esp32cam_m5stack_m5poecam_w + [env:esp32cam_seeed_xiao_esp32s3_sense] board = esp32cam_seeed_xiao_esp32s3_sense