ESP32CAM не может инициализировать камеру с ошибкой 0xffffff

esp32 memory platformio esp32-cam

Имеется простой скетч PlatformIO (формат Arduino), который имеет следующий файл main.cpp:

#include <Arduino.h>
#include "esp_camera.h"
#include "camera_pins.h"

#define CAMERA_MODEL_AI_THINKER

#define LED_BUILTIN 33 // Определить LED_BUILTIN для ESP32

void setup()
{
    pinMode(LED_BUILTIN, OUTPUT);
    Serial.begin(115200);
    delay(500);

    Serial.println("Camera initialising...");

    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; // Заменено `sscb` на `sccb`
        config.pin_sccb_scl = SIOC_GPIO_NUM; // Заменено `sscb` на `sccb`
        config.pin_pwdn = PWDN_GPIO_NUM;
        config.pin_reset = RESET_GPIO_NUM;
        config.xclk_freq_hz = 20000000; // Можно установить значение 10000000 для более медленной частоты обновления, но это может привести к стабильному (более медленному) выполнению
        config.pixel_format = PIXFORMAT_JPEG;
    }

    // Инициализируем камеру
    if (psramFound())
    {
        Serial.println("PSRAM FOUND! Setting framesize to QVGA");
        config.frame_size = FRAMESIZE_QVGA; // разрешение 320x240
        config.jpeg_quality = 10;
        config.fb_count = 2;
    }
    else
    {
        Serial.println("PSRAM NOT FOUND! Setting framsize to CIF");
        config.frame_size = FRAMESIZE_CIF;
        config.jpeg_quality = 20; // не 12 (0-63; чем ниже, тем выше качество)
        config.fb_count = 1;
    }

    esp_err_t err = esp_camera_init(&config);

    /* PSRAM NOT FOUND! Setting framsize to CIF
    E (650) cam_hal: cam_dma_config(301): frame buffer malloc failed
    E (650) cam_hal: cam_config(385): cam_dma_config failed
    E (651) camera: Camera config failed with error 0xffffffff
    Camera init failed with error 0xffffffff */

    if (err != ESP_OK)
    {
        Serial.printf("Camera init failed with error 0x%x\n", err);
        return;
    }

    Serial.println("Camera initialized successfully!");
}

void loop()
{

    if (Serial.available())
    {
        String rcvdTxt = Serial.readString();

        Serial.print("I heard: ");
        Serial.println(rcvdTxt);

        digitalWrite(LED_BUILTIN, HIGH);
        // Serial.println("PING");
        delay(1000);
        digitalWrite(LED_BUILTIN, LOW);
        // Serial.println("PONG");
    }
}

Теперь контакты камеры установлены в соответствии с этой статьей (довольно подробная статья, рекомендую ознакомиться).

Но проблема возникает при загрузке кода и его запуске. Фрагмент кода esp_camera_init(&config) выдаёт следующую ошибку:

E (650) cam_hal: cam_dma_config(301): frame buffer malloc failed
E (650) cam_hal: cam_config(385): cam_dma_config failed
E (651) camera: Camera config failed with error 0xffffffff
Camera init failed with error 0xffffffff

Кроме того, psramFound() возвращает false, что означает, что PSRAM не обнаружен.

, 👍0


1 ответ


Лучший ответ:

1

Сообщение об ошибке:

E (650) cam_hal: cam_dma_config(301): frame buffer malloc failed
E (650) cam_hal: cam_config(385): cam_dma_config failed
E (651) camera: Camera config failed with error 0xffffffff
Camera init failed with error 0xffffffff

Это означает, что библиотека «esp_camera.h» не может выделить достаточно памяти в ESP32CAM для обработки изображений.

Разработано: Когда модуль камеры ESP32CAM захватывает изображение, он сохраняет данные в буфере, заранее выделенном программой. Это можно сравнить с выделением фрагмента памяти и его резервированием только для поступающих данных изображения (см. «ESP32CAM DMA»).

PSRAM (псевдостатическую оперативную память) можно рассматривать как оперативную память ESP32CAM, в которой будет выделена память для входящих данных изображения. Теперь эти 0xffffff и ошибка выделения памяти буфера кадра означают, что недостаточно места для выделения указанного буфера.

Проблема: ESP32CAM имеет PSRAM (обычно), к которому он не может получить доступ для выделения буфера (обычно места для хранения входящих данных изображения достаточно, но ESP32CAM не может получить к нему доступ).

Причина: Некая известная ошибка в кодовой базе, из-за которой PSRAM «не распознаётся» ESP32CAM, поэтому psramFound() возвращает false.

Решение: -D PREFER_PSRAM -mfix-esp32-psram-cache-issue во флагах сборки скетча.

Я не знаю, как это сделать в Arduino IDE, но в PlatformIO, в файле platformio.ini, добавьте следующее:

build_flags = -D PREFER_PSRAM -mfix-esp32-psram-cache-issue
,

Используете ли вы USB-последовательный преобразователь FTDI?, @liaifat85

Нет, но это не должно иметь значения, верно?, @Broteen Das

Я использую CAM-модуль ESP32. Мне всегда приходится подключать его через USB-конвертер, чтобы подключить CAM-модуль к ноутбуку., @liaifat85