Почему OTA не работает с платой ESP32-CAM Ai-Thinker?
У меня есть рабочий код на плате ESP32-CAM Ai-Thinker, программирование по последовательному.
Я хотел бы перепрограммировать с помощью OTA, но добавление функциональности из базового скетча (что я успешно сделал на различных других платах) завершается неудачей при попытке программирования OTA, плата перезагружается после abort() и создается трассировка стека.
Бесценный дешифратор исключений ESP32 показывает, что ошибка возникает из-за проверки того, безопасно ли место в памяти для записи.
Обычно я бы выбрал вариант раздела, который включает в себя OTA, но плата Ai-Thinker не имеет этой опции в интегрированной среде разработки
@rolinger, 👍3
5 ответов
Лучший ответ:
В 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.
Вам не придется проходить через хлопоты с редактированием 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
Как указано в комментариях @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
Здесь.
Загрузите этот рабочий 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 не любит передавать очень далеко.
OTA требует, чтобы вы разделили свой ESP32 на два набора пространства для вашей программы (разделы ota_0 и ota_1) — во время процесса OTA неиспользуемый раздел обновляется и будет следующим загружаемым.
Это означает, что для камеры не осталось места (большинство библиотек драйверов камер хранят изображение в SPIFFS) для хранения данных изображения (OV2640 — 1622x1200 пикселей, что составляет 1946400 байт), потому что единственные доступные схемы разделов с OTA в Arduino IDE — это программа размером 1,9 МБ с файлами SPIFF размером 0,19 МБ (190 КБ), что в 10 раз меньше места для хранения изображений с камер.
Проект wjsanek здесь выглядит интересно — они используют один из разделов OTA в качестве SPIFF для камеры. Очень умно.
- ESP32 - "Детектор Браунаута был активирован" при запуске Wi-Fi
- ESP32 открывает "captive portal" при подключении
- Контакты RX и TX на esp32
- Чтение данных из Google Таблиц с помощью Nodemcu
- Аналоговое чтение не работает при использовании WiFi
- WiFiClient::connected() не работает
- Достаточно ли 1 МБ флэш-памяти для загрузки OTA в ESP-01?
- Автоматическая веб-страница ESP32 AP
Спасибо за дополнительную информацию, +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