ESP32CAM не может инициализировать камеру с ошибкой 0xffffff
Имеется простой скетч 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 не обнаружен.
@Broteen Das, 👍0
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
- esp32, platformio A fatal error occurred: Packet content transfer stopped (received 8 bytes) *** [upload] Error 2
- Как очистить кучу памяти в esp32
- ESP32 не может спать дольше 35 минут.
- Невозможно установить библиотеку esp_camera
- Можно ли использовать WiFi и Bluetooth/BLE в одном проекте ESP32?
- Таблица разделов ESP32 и место записи
- Поддерживает ли ESP32 WIFIDirect?
- Запуск изображения с помощью esp32-cam и GPIO13
Используете ли вы USB-последовательный преобразователь FTDI?, @liaifat85
Нет, но это не должно иметь значения, верно?, @Broteen Das
Я использую CAM-модуль ESP32. Мне всегда приходится подключать его через USB-конвертер, чтобы подключить CAM-модуль к ноутбуку., @liaifat85