Почему OTA не работает с платой ESP32-CAM Ai-Thinker?

esp32 wifi ota partition

У меня есть рабочий код на плате ESP32-CAM Ai-Thinker, программирование по последовательному.

Я хотел бы перепрограммировать с помощью OTA, но добавление функциональности из базового скетча (что я успешно сделал на различных других платах) завершается неудачей при попытке программирования OTA, плата перезагружается после abort() и создается трассировка стека.

Бесценный дешифратор исключений ESP32 показывает, что ошибка возникает из-за проверки того, безопасно ли место в памяти для записи.

Обычно я бы выбрал вариант раздела, который включает в себя OTA, но плата Ai-Thinker не имеет этой опции в интегрированной среде разработки

, 👍3


5 ответов


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

2

В boards.txt файл настраивает то, что может быть настроено в среде IDE Arduino для каждой платы.

В моей установке это можно найти по адресу C:\Users\MyUser\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.4\boards.txt

Я нашел раздел esp32cam.name=AI Thinker ESP32-CAM и изменил строки:

esp32cam.upload.maximum_size=3145728
esp32cam.build.partitions=huge_app

Для

esp32cam.upload.maximum_size=1966080
esp32cam.build.partitions=min_spiffs

Различные параметры подробно описаны в одном файле с ключами esp32.menu.Схема разделов., и для некоторых плат эти параметры настраиваются пользователем. Чтобы добавить это, удалите (или закомментируйте символом#) две строки, найденные выше, чтобы они выглядели так:

# esp32cam.upload.maximum_size=3145728
# esp32cam.build.partitions=huge_app

и добавьте необходимые пункты меню для вашего приложения - например

esp32cam.menu.PartitionScheme.huge_app=Huge APP (3MB No OTA/1MB SPIFFS)
esp32cam.menu.PartitionScheme.huge_app.build.partitions=huge_app
esp32cam.menu.PartitionScheme.huge_app.upload.maximum_size=3145728
esp32cam.menu.PartitionScheme.min_spiffs=Minimal SPIFFS (Large APPS with OTA)
esp32cam.menu.PartitionScheme.min_spiffs.build.partitions=min_spiffs
esp32cam.menu.PartitionScheme.min_spiffs.upload.maximum_size=1966080

После внесения любых изменений в boards.txt, перезапустите среду разработки Arduino, чтобы изменения вступили в силу. Обратите внимание, что эти изменения (и любые изменения в установке) могут быть перезаписаны любыми будущими обновлениями или обновлениями библиотеки, поэтому обратите внимание на свои изменения, чтобы их можно было легко применить повторно.

В качестве альтернативы добавьте строки меню в boards.local.txt, введены в Arduino 1.6.6, поэтому они должны сохраняться во время обновлений. В этом случае не нужно вносить никаких изменений в boards.txt, так как в boards.local.txt записи переопределяют записи в boards.txt. Я не тестировал это, надеюсь, оно работает с обновлениями библиотек и обновлениями IDE.

,

2

Вам не придется проходить через хлопоты с редактированием boards.txt если вы хотите иметь OTA, только если вам это не нужно или вам нужна пользовательская схема разделов.
Тем не менее, раздел OTA-это всегда то, что остается, поэтому, например, приложение Med Spiffs 1,9 МБ, Spiffs 190KB означает раздел OTA 1,9 МБ.
Предостережение заключается в том, что если вы хотите использовать приложение объемом 1,8 МБ с 1 МБ, которое НЕ будет работать. Файл OTA должен быть примерно на 100 КБ (по опыту) меньше, чем доступный раздел OTA. Если вы хотите обновить приложение и обновления, это отдельная тема. Поэтому перед редактированием вашего boards.txt проверьте следующее:

  • Приложение (несжатое) - это ОТА-пространство + ~100 КБ
  • ваша процедура OTA работает стабильно с/в небольших приложениях
  • никаких проблем с подключением во время загрузки и
  • правильная обработка ошибок OTA в вашем коде
  • для первоначального тестирования не подключайте к плате никакого оборудования.
  • Если вы используете пример немодифицированной камеры или обычай с распознаванием лиц, вы потерпите неудачу с OTA, потому что это слишком большое (~3 МБ приложение!)
  • Процедуры OTA (включая библиотеки Wi-Fi) занимают ~800 Кб для базового OTA

Поскольку я использую модули AIThinker32cam в различных сценариях, я знаю, через что вы проходите ;-)
Прилагаются два пользовательских определения платы (без OTA), так как в них нет предопределенного (ESP32 core 1.04) C:\Users\YOUR_USERNAME\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.4\boards.txt просто скопируйте и вставьте в раздел (поиск esp32AiThinkerCam.menu.Схема разделов :

esp32AiThinkerCam.menu.PartitionScheme.noota_3g=1MB APP/3MB SPIFFS (No OTA)
esp32AiThinkerCam.menu.PartitionScheme.noota_3g.build.partitions=noota_3g
esp32AiThinkerCam.menu.PartitionScheme.noota_3g.upload.maximum_size=1048576
esp32AiThinkerCam.menu.PartitionScheme.no_ota=2MB APP/2MB SPIFFS (No OTA)
esp32AiThinkerCam.menu.PartitionScheme.no_ota.build.partitions=no_ota
esp32AiThinkerCam.menu.PartitionScheme.no_ota.upload.maximum_size=2097152

а "волшебный разблокировщик" - это файл noota_3g.csv, найденный в C:\Users\YOUR_USERNAME\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.4\tools\partitions,там определена схема разделения. Если вы хотите изменить это для пользовательских разделов, пожалуйста, задайте новый вопрос.
Обновление
Прилагаемое дополнение boards.txt часть для AI-мыслителя просто замените полностью существующую часть на эту amd у вас есть куча новых опций - все они протестированы в производстве с ядром ESP32 1.04. (без пользовательских схем разделов):

##############################################################

esp32AiThinkerCam.name=ESP32 AI Thinker Cam

esp32AiThinkerCam.upload.tool=esptool_py
esp32AiThinkerCam.upload.maximum_size=1310720
esp32AiThinkerCam.upload.maximum_data_size=327680
esp32AiThinkerCam.upload.wait_for_upload_port=true

esp32AiThinkerCam.serial.disableDTR=true
esp32AiThinkerCam.serial.disableRTS=true

esp32AiThinkerCam.build.mcu=esp32
esp32AiThinkerCam.build.core=esp32
esp32AiThinkerCam.build.variant=esp32
esp32AiThinkerCam.build.board=ESP32_DEV

esp32AiThinkerCam.build.f_cpu=240000000L
esp32AiThinkerCam.build.flash_size=4MB
esp32AiThinkerCam.build.flash_freq=40m
esp32AiThinkerCam.build.flash_mode=dio
esp32AiThinkerCam.build.boot=dio

esp32AiThinkerCam.menu.CPUFreq.240=240MHz (WiFi/BT)
esp32AiThinkerCam.menu.CPUFreq.240.build.f_cpu=240000000L
esp32AiThinkerCam.menu.CPUFreq.160=160MHz (WiFi/BT)
esp32AiThinkerCam.menu.CPUFreq.160.build.f_cpu=160000000L
esp32AiThinkerCam.menu.CPUFreq.80=80MHz (WiFi/BT)
esp32AiThinkerCam.menu.CPUFreq.80.build.f_cpu=80000000L

esp32AiThinkerCam.build.partitions=default
esp32AiThinkerCam.build.defines=-DBOARD_HAS_PSRAM -mfix-esp32-psram-cache-issue
esp32AiThinkerCam.menu.PartitionScheme.default=Default 1.2MB APP/1.5MB SPIFFS (OTA)
esp32AiThinkerCam.menu.PartitionScheme.default.build.partitions=default
esp32AiThinkerCam.menu.PartitionScheme.defaultffat=Default FATFS 1.2MB APP/1.5MB FATFS (OTA)
esp32AiThinkerCam.menu.PartitionScheme.defaultffat.build.partitions=default_ffat
esp32AiThinkerCam.menu.PartitionScheme.noota_3g=1MB APP/3MB SPIFFS (No OTA)
esp32AiThinkerCam.menu.PartitionScheme.noota_3g.build.partitions=noota_3g
esp32AiThinkerCam.menu.PartitionScheme.noota_3g.upload.maximum_size=1048576
esp32AiThinkerCam.menu.PartitionScheme.no_ota=2MB APP/2MB SPIFFS (No OTA)
esp32AiThinkerCam.menu.PartitionScheme.no_ota.build.partitions=no_ota
esp32AiThinkerCam.menu.PartitionScheme.no_ota.upload.maximum_size=2097152
esp32AiThinkerCam.menu.PartitionScheme.huge_app=3MB APP/1MB SPIFFS (No OTA)
esp32AiThinkerCam.menu.PartitionScheme.huge_app.build.partitions=huge_app
esp32AiThinkerCam.menu.PartitionScheme.huge_app.upload.maximum_size=3145728
esp32AiThinkerCam.menu.PartitionScheme.noota_ffat=2MB APP/2MB FATFS (No OTA)
esp32AiThinkerCam.menu.PartitionScheme.noota_ffat.build.partitions=noota_ffat
esp32AiThinkerCam.menu.PartitionScheme.noota_ffat.upload.maximum_size=2097152
esp32AiThinkerCam.menu.PartitionScheme.noota_3gffat=1MB APP/3MB FATFS (No OTA)
esp32AiThinkerCam.menu.PartitionScheme.noota_3gffat.build.partitions=noota_3gffat
esp32AiThinkerCam.menu.PartitionScheme.noota_3gffat.upload.maximum_size=1048576
esp32AiThinkerCam.menu.PartitionScheme.minimal=Min SPIFFS 1.3MB APP/700KB SPIFFS (OTA)
esp32AiThinkerCam.menu.PartitionScheme.minimal.build.partitions=minimal
esp32AiThinkerCam.menu.PartitionScheme.min_spiffs=Med SPIFFS 1.9MB APP/190KB SPIFFS (OTA)
esp32AiThinkerCam.menu.PartitionScheme.min_spiffs.build.partitions=min_spiffs
esp32AiThinkerCam.menu.PartitionScheme.min_spiffs.upload.maximum_size=1966080


esp32AiThinkerCam.menu.FlashMode.qio=QIO
esp32AiThinkerCam.menu.FlashMode.qio.build.flash_mode=dio
esp32AiThinkerCam.menu.FlashMode.qio.build.boot=qio
esp32AiThinkerCam.menu.FlashMode.dio=DIO
esp32AiThinkerCam.menu.FlashMode.dio.build.flash_mode=dio
esp32AiThinkerCam.menu.FlashMode.dio.build.boot=dio
esp32AiThinkerCam.menu.FlashMode.qout=QOUT
esp32AiThinkerCam.menu.FlashMode.qout.build.flash_mode=dout
esp32AiThinkerCam.menu.FlashMode.qout.build.boot=qout
esp32AiThinkerCam.menu.FlashMode.dout=DOUT
esp32AiThinkerCam.menu.FlashMode.dout.build.flash_mode=dout
esp32AiThinkerCam.menu.FlashMode.dout.build.boot=dout

esp32AiThinkerCam.menu.FlashFreq.80=80MHz
esp32AiThinkerCam.menu.FlashFreq.80.build.flash_freq=80m
esp32AiThinkerCam.menu.FlashFreq.40=40MHz
esp32AiThinkerCam.menu.FlashFreq.40.build.flash_freq=40m

esp32AiThinkerCam.menu.UploadSpeed.921600=921600
esp32AiThinkerCam.menu.UploadSpeed.921600.upload.speed=921600
esp32AiThinkerCam.menu.UploadSpeed.115200=115200
esp32AiThinkerCam.menu.UploadSpeed.115200.upload.speed=115200
esp32AiThinkerCam.menu.UploadSpeed.256000.windows=256000
esp32AiThinkerCam.menu.UploadSpeed.256000.upload.speed=256000
esp32AiThinkerCam.menu.UploadSpeed.230400.windows.upload.speed=256000
esp32AiThinkerCam.menu.UploadSpeed.230400=230400
esp32AiThinkerCam.menu.UploadSpeed.230400.upload.speed=230400
esp32AiThinkerCam.menu.UploadSpeed.460800.linux=460800
esp32AiThinkerCam.menu.UploadSpeed.460800.macosx=460800
esp32AiThinkerCam.menu.UploadSpeed.460800.upload.speed=460800
esp32AiThinkerCam.menu.UploadSpeed.512000.windows=512000
esp32AiThinkerCam.menu.UploadSpeed.512000.upload.speed=512000

esp32AiThinkerCam.menu.DebugLevel.none=None
esp32AiThinkerCam.menu.DebugLevel.none.build.code_debug=0
esp32AiThinkerCam.menu.DebugLevel.error=Error
esp32AiThinkerCam.menu.DebugLevel.error.build.code_debug=1
esp32AiThinkerCam.menu.DebugLevel.warn=Warn
esp32AiThinkerCam.menu.DebugLevel.warn.build.code_debug=2
esp32AiThinkerCam.menu.DebugLevel.info=Info
esp32AiThinkerCam.menu.DebugLevel.info.build.code_debug=3
esp32AiThinkerCam.menu.DebugLevel.debug=Debug
esp32AiThinkerCam.menu.DebugLevel.debug.build.code_debug=4
esp32AiThinkerCam.menu.DebugLevel.verbose=Verbose
esp32AiThinkerCam.menu.DebugLevel.verbose.build.code_debug=5
,

Спасибо за дополнительную информацию, +1 за подробности. Однако первоначально установленная настройка " huge_app` для этой платы, похоже, не оставляет места для OTA (приложение размером 3 МБ). Я использую небольшой раздел SPIFFS, но это не меняет настройки в boards.txt., @rolinger

Как я уже писал, огромное приложение 3 МБ не может быть удалено - для этого не осталось места, вы можете использовать приложение объемом не более 1,8 МБ или получить плату с 8 МБ PSRAM - это аппаратное ограничение, а не программное обеспечение - попробуйте с помощью med asgiven в тексте y - если ваше приложение больше, уменьшите его или нет OTA, @Codebreaker007

huge_app-это фиксированное значение по умолчанию для этой платы в прилагаемом `boards.txt", что не позволяет ОТА, как мы оба согласны. У него нет настраиваемой опции для выбора min_spiffs, вот что я добавляю ниже, возможно, это отличается от установленного вами esp32 boards.txt?, @rolinger

Извините за недоразумение - выберите модуль ESP32 Wrover и используйте его для прошивки Ai Thinker32Cam, если вы хотите иметь собственное меню, скопируйте новую часть, которую я опубликовал выше, на свои платы txt, @Codebreaker007

Спасибо за разъяснение, я не знал, что платы Wrover и Ai-мыслителя взаимозаменяемы для программирования, так что в данном случае это было бы альтернативным обходным путем. Примечание для других пользователей, которые могут следить за - выводами камеры различаются между модулями Wrover и Ai-Thinker (см. camera_pins.h в примере CameraWebServer)., @rolinger

Использование модуля ESP32 Wrover сработало для меня, спасибо. Определения контактов встроены в приложение, поэтому с ними нет проблем., @Bra1n


1

Как указано в комментариях @Codebreaker007, использование модуля Wrover ESP32 работает, и если вы вставите определения контактов в приложение, проблем не возникнет

#define CAMERA_MODEL_AI_THINKER

#if defined(CAMERA_MODEL_AI_THINKER)
  #define PWDN_GPIO_NUM     32
  #define RESET_GPIO_NUM    -1
  #define XCLK_GPIO_NUM      0
  #define SIOD_GPIO_NUM     26
  #define SIOC_GPIO_NUM     27
  
  #define Y9_GPIO_NUM       35
  #define Y8_GPIO_NUM       34
  #define Y7_GPIO_NUM       39
  #define Y6_GPIO_NUM       36
  #define Y5_GPIO_NUM       21
  #define Y4_GPIO_NUM       19
  #define Y3_GPIO_NUM       18
  #define Y2_GPIO_NUM        5
  #define VSYNC_GPIO_NUM    25
  #define HREF_GPIO_NUM     23
  #define PCLK_GPIO_NUM     22
#else
  #error "Camera model not selected"
#endif
,

0

Здесь.

Загрузите этот рабочий zip-файл скетча ESP32-CAM с рабочей загрузкой OTA: "Working_ESP32_CameraWebServer_V2_with_OTA"

около

https://github.com/wjsanek/wjsanek.git

Убедитесь, что вы прочитали простой файл "СНАЧАЛА ПРОЧТИТЕ МЕНЯ" в zip-архиве после распаковки.

Этот скетч преодолевает любые проблемы с загрузкой "файла в большой" или других скетчей OTA с помощью этой крошечной, временной платы ESP32-CAM (NodeMCU за 5 долларов ESP8266 лучше, но камера Arducam для нее стоит 23 доллара).

Плата ESP32-CAM не любит передавать очень далеко.

,

0

OTA требует, чтобы вы разделили свой ESP32 на два набора пространства для вашей программы (разделы ota_0 и ota_1) — во время процесса OTA неиспользуемый раздел обновляется и будет следующим загружаемым.

Это означает, что для камеры не осталось места (большинство библиотек драйверов камер хранят изображение в SPIFFS) для хранения данных изображения (OV2640 — 1622x1200 пикселей, что составляет 1946400 байт), потому что единственные доступные схемы разделов с OTA в Arduino IDE — это программа размером 1,9 МБ с файлами SPIFF размером 0,19 МБ (190 КБ), что в 10 раз меньше места для хранения изображений с камер.

Проект wjsanek здесь выглядит интересно — они используют один из разделов OTA в качестве SPIFF для камеры. Очень умно.

,