Прошивка для esp32 nodemcu lua на базе последней idf4.4

Тема в разделе "ESP8266, ESP32", создана пользователем serg3295, 11 июл 2022.

  1. serg3295

    serg3295 Гик

    Коллектив разработчиков программного обеспечения для ESP32 и ESP8266 на базе Lua https://github.com/nodemcu/nodemcu-firmware в последнее время работает над версией прошивки с использованием последней Espressif IDF версии 4.4. В прошивке заявлена поддержка чипов ESP32-S2, ESP32-C3, дополнительно к имеющимся.

    Разработчики планируют в дальнейшем заменить ветку dev-esp32, являющуюся сейчас базовой для ESP32 на ветку dev-esp32-idf4 после завершения тестирования последней и обретения ею стабильности.
    Однако, поскольку уже сейчас в новой ветке присутствуют Lua 5.3, LFS и несколько новых функциональных модулей, можно её использовать, особенно, если данные новые возможности для пользователя актуальны.

    К сожалению, в текущую версию прошивки внесены изменения, приведшие к потере совместимости со старыми версиями внешних программ, таких как ESPLorer и nodemcu-tool.
    Для решения этой проблемы сообществом выпущены несколько исправлений (как для ESPLorer так и для nodemcu-tool), позволяющих работать с новой версией прошивки. Хотя данные исправления и временные, но можно надеятся, что авторы впоследствии внесут их в релиз.

    Учитывая то, что ветка dev-esp32-idf4 имеет перспективы к развитию и может стать основной для ESP32, предлагаю обсуждать в этой теме вещи, связанные с применением прошивки на базе данной ветки.
     
  2. serg3295

    serg3295 Гик

    Если собрать прошивку с коммита от Oct 06 2021
    32f66e3db50e8923a39a648fa4114da2a5c3235d Attempt to address IDF certificate issue
    то еще все работает как раньше. Файлы грузятся из старого есплорера и из nodemcu-tool.

    А вот в прошивке на следующем коммите от Oct 20 2021
    a2ba49e36ba120466a6f3e64e7602b7a5390de2d Switch to IDF-provided VFS and standard `io` module
    уже необходимо переходить на новый есплорер и nodemcu-tool.

    Причём, nodemcu-tool пишет, что всё удачно загрузил и без ошибок, хотя файл не записывается на диск ESP.

    Для загрузки файлов в dev-esp32-idf4 через ESPlorer необходимо пересобрать свежую версию есплорера из исходника, так как он уже будет содержать коммит от pjsg Philip Gladstone с исправлением этой ошибки.
    Обсуждение проблемы начиная отсюда https://github.com/nodemcu/nodemcu-firmware/issues/3397#issuecomment-948391792

    Из новой пересобранной версии есплорера файлы начинают грузиться. Однако, начинают появляться другие неприятности.
    1. Размер файла на диске показывается равным 0 байт, хотя файл записан нормально и имеет нужный размер (можно проверить через FS Info)
    2. В интерфейсе есплорера появляется большое пустое серое поле, которое крадёт половину окошка вывода. Как это победить я не знаю.

    Имеется способ отправлять файлы на esp32 со свежей веткой idf4 через nodemcu-tool. Правда, этот способ немного кривой в реализации и использовании.
    Товарищ juju2143 создал костыль к программе nodemcu-tool, который позволяет работать только с новой версией ветки idf4.

    Для применения необходимо склонировать https://github.com/juju2143/NodeMCU-Tool.git и checkout на ветку esp32-fix.
    Если не устанавливать программу, а вызывать её напрямую из каталога
    /home/где-то/NodeMCU-Tool/bin/nodemcu-tool.js -p (порт) upload файл.lua
    то файл в esp32 будет загружаться.

    Минус данного решения в его неуниверсальности, так как в этом варианте программы вместо команд для старых версий nodemcu с модулем file используется модуль io для самой последней реализации idf4. То есть, придётся использовать разные nodemcu-tool, один (например, уже установленный) для старых прошивок и второй для новой прошивки idf4.
    В-принципе, это не так страшно, и может потом автор оригинального nodemcu-tool сделает свой вариант уже по-нормальному.
     
    Последнее редактирование: 12 июл 2022
  3. ИгорьК

    ИгорьК Гуру

    Таки я не против, но про Lua здесь народу не много.
     
  4. serg3295

    serg3295 Гик

    В ходе настройки LFS в новой ветке dev-esp32-idf4 стал решать задачу по изменению размера LFS со стандартных 0x10000 на другие значения.
    При конфигурации через make menuconfig мне не удалось найти пункт для изменения размера LFS (не embedded, а обычной).
    Тем не менее, размер можно поменять в файле partitions.csv. Файл находится в папке ./nodeMCU-firmware/components/platform/partitions.csv
    Код (C++):

    # Name,  Type, SubType, Offset,  Size
    nvs,  data, nvs,  0x9000,  0x6000
    phy_init,  data, phy,  0xf000,  0x1000
    factory,  app,  factory, 0x10000, 0x180000
    # Type 0xC2 => NodeMCU. SubTypes: 0x01 = LFS
    lfs,  0xC2, 0x01,  , 0x10000
    storage,  data, spiffs,  , 0x70000
    Заменив в строке
    lfs, 0xC2, 0x01, , 0x40000
    последний параметр на требуемое значение и пересобрав прошивку, получаем нужный размер LFS.
     
  5. ИгорьК

    ИгорьК Гуру

    Сергей! Чет я не въехал - а разработчики код в модуль как загружают: лопатой закидывают что ли? Как такое может быть в принципе? nodemcu-tool - основной инструмент, как можно допустить его поломку. Видел по вашей ссылке что кто-то перешел полностью на LFS. Так ведь init.lua все равно надо в модуль как-то закинуть.

    Сейчас занялся переделкой старого первого своего проекта подсветки лестницы. Пробовал обе прошивки для ESP32 - работа с WS2812 сломана в обеих, к сожалению. Давно хотел к ардуино вернуться, вот и случай представился :)
     
  6. serg3295

    serg3295 Гик

    Так всё же сделано для удобства разработчиков и по их просьбам. То есть, хотели сделать как лучше :)

    TerryE предупреждал о необходимости тщательно обдумать последствия подобного шага с внесением несовместимости с уже разработанными приложениями.
    Но, в результате, получилось как всегда.

    При использовании embedded LFS наличие init.lua на SPIFFS вообще не требуется. При рестарте есп'шки стартует всё с внутренней LFS. Таким образом, процесс разработки сводится к запуску

    ./tools/embed_lfs.sh /home/serg/Documents/nodeMCU-firmware/examples/init.lua /home/serg/Documents/nodeMCU-firmware/examples/user.lua
    make flash
    если будете пробовать, то уберите из init.lua всю дичь, которая там написана, и напишите там только node.LFS.get("user")()
    Минусом данного подхода является то, что перешивается вся флешка, но я думаю, можно esptool'ом загнать по абсолютному адресу только область LFS, но сам еще не пробовал именно так. В результате, мы видим, что ни есплорер, ни nodemcu-tool не использовались. А esptool всегда работает.

    Для остального народа, не владеющего в совершенстве магией LFS, оперативно исправили утилиты.
    Переход на модуль io c потерей обратной совместимости был произведён 20 октября 2021г, 22-го прилепили заплатку к ESPLorer, а 11 ноября сделали костыль к nodemcu-tool. Так что, init.lua при большом желании можно было закинуть.

    Про WS2812 что-то было в issues. У меня нашлось кольцо светодиодов WCMCU-2812B-24. Попробую тоже посмотреть что они там поломали:)
     
  7. serg3295

    serg3295 Гик

    Проверил на самой новой прошивке для ESP32 работу своего WCMCU-2812B-24. Всё работает, все светодиоды зажигаются разными цветами.
     
    ИгорьК нравится это.
  8. serg3295

    serg3295 Гик

    В связи с тем, что всё равно пришлось пересобрать ESPlorer для обеспечения его работоспособности с веткой idf4, я попробовал исправить проблему с уменьшенным окном терминала, в который идёт вывод с ESP.

    Сразу хочу предупредить, что Java я не знаю совсем, поэтому исправление проводилось методом логического анализа кода в условиях полной неопределённости (методом научного тыка). Возможно, я что-то неправильно сделал, или даже поломал, но так как окно терминала вернулось в нужный мне размер, а есплорер продолжает работать и выполнять свои функции, то результат можно считать удовлетворительным.

    Итак, чтобы вернуть окно вывода к нормальному большому размеру необходимо исправить одну строчку в файле ESPlorer.java
    2022-07-20_14-28.png
     
    ИгорьК нравится это.
  9. ИгорьК

    ИгорьК Гуру

    Прям язык чесался попросить выложить прошивку, но не нужен лёгкий путь. Буду делать на Ардуино :)

    А может выложишь готовый файл?
     
  10. serg3295

    serg3295 Гик

    Да, нет проблем. Только почему-то форум не даёт выгрузить файл, хотя тот всего 2.5 Мб
    Ну, если стоит задача вспомнить язык С, то имеет смысл, конечно. Кстати, рекомендую обратить внимание на расширение PlatformIO IDE для VS Code вместо IDE ардуино. Если, конечно, вы его уже не используете.
     
    ИгорьК нравится это.
  11. ИгорьК

    ИгорьК Гуру

    Google, Yandex диски - все сгодится. Ссылку то этот форум еще принимает.

    Знаю такое, особливо когда прошивку для 3D принтера надо компилировать.
     
  12. serg3295

    serg3295 Гик

    Ссылка на Яндекс диск файл ESPlorer.jar
     
    ИгорьК нравится это.
  13. ИгорьК

    ИгорьК Гуру

    Многа-многа добрых слов!
     
  14. serg3295

    serg3295 Гик

    Модуль eromfs

    В версии прошивки для ESP8266 имеется утилита make_resource, которая собирает произвольные файлы в файл resource.lua, записываемый в LFS. Затем к этим файлам можно получить доступ в режиме read-only из своей программы, используя функции модуля file_LFS. Теперь такая возможность имеется и для esp32 в ветке с idf4.

    Новый модуль eromfs позволяет размещать любые файлы на монтируемых томах внутри образа прошивки в режиме read-only, и получать к ним доступ из приложений. Например, можно поместить в эти тома неизменяемые файлы с содержимым вебсайта (index.html, favicon.ico и пр.).

    Модуль eromfs не поддерживает каталоги как таковые, но сохраняет путь к каталогу как часть имени файла, как это делает SPIFFS. Пути могут быть абсолютными и относительными. Путь не должен оканчиваться на "/", и не должен содержать пробелы.

    Абсолютный - например, /home/serg/Documents/lua/mod1/resource

    Относительный - например, ../relpath . Расположение каталога считается относительно nodeMCU-firmware, то есть в данном случае каталог relpath должен находится на одном уровне с nodeMCU-firmware.

    Можно объявить несколько томов, разделив пути к ним точкой с запятой " ; "

    myvol1=/home/serg/Documents/lua/mod1/resource;myvol2=../relpath

    Для использования модуля eromfs необходимо в конфигураторе, вызываемом через make menuconfig, установить следующие параметры:
    Код (C++):
    Component config --->
       NodeMCU modules --->
          [*] Eromfs module (embedded read-only mountable file sets)
           (объявления томов) File sets to embed
    При включении данного модуля обязательно требуется указать один, или более наборов файлов (томов).

    При изменении файлов в каталогах, содержащих файлы для eromfs, необходимо удалить файл nodeMCU-firmware/build/esp-idf/modules/eromfs.bin чтобы make пересобрало прошивку с новыми файлами. Возможно существует другой способ отслеживания изменений в файлах eromfs, чтобы make "увидел" эти изменения, я пока его не нашёл (кроме make clean и make menuconfig, разумеется).

    Пример использования.

    Создадим каталоги relpath и /home/serg/Documents/lua/mod1/resource с подкаталогом lvl2 и запишем туда какие-нибудь файлы. В целях тестирования можно записать во все эти файлы какую-либо текстовую информацию, которая будет в читаемом виде выводиться на экран.
    Код (C++):
    /home/serg/Documents/lua/mod1/resource
      |_lvl2/
      |     |_README.md
      |_favicon.ico
      |_tst.lua

    ~/nodemcu-firmware
    ~/relpath
      |_tt.bin
      |_new.txt
    Установим нужные параметры в конфигураторе, как указано выше, соберем прошивку и в есплорере посмотрим что у нас получилось.

    Для начала убедимся, что присутствуют наборы файлов (тома) myvol1 и myvol2, которые мы заказывали в конфигураторе. Это делается функцией eromfs.list()
    Код (C++):
    > for _, volname in ipairs(eromfs.list()) do print(volname) end
    myvol1
    myvol2
    Затем с помощью eromfs.mount() смонтируем тома в указанной точке виртуальной файловой системы VFS.
    Код (C++):
    > eromfs.mount('myvol1', '/vol1')
    > eromfs.mount('myvol2', '/vol2')
    Если тома смонтировались успешно, то можно посмотреть их содержимое. При этом видим, что подкаталог в первом томе присутствует.
    Код (C++):
    > for name,size in pairs(file.list('/vol1')) do print(name, size) end
    lvl2/README.md 1890
    favicon.ico 13950
    tst.lua 399
    > for name,size in pairs(file.list('/vol2')) do print(name, size) end
    tt.bin 26
    new.txt 10
    >
    Поскольку в данной версии прошивки уже используется стандартный модуль io, для операций с файлами на смонтированных томах необходимо пользоваться функциями этого модуля, а не устаревшего модуля file. Ниже приведены примеры чтения и вывода на экран разных файлов, находящихся на смонтированных томах.
    Код (C++):
    fh=io.input('/vol2/tt.bin')
    print(io.read("*a"))
    io.close(fh)

    fh1=io.input('/vol1/tst.lua')
    for line in io.lines() do
      print(line)
    end
    io.close(fh1)

    fh2=io.input('/vol1/lvl2/README.md')
    for line in io.lines() do
      print(line)
    end
    io.close(fh2)
    Если том больше не нужен, то его можно отмонтировать функцией eromfs.unmount()
    > eromfs.unmount('myvol1', '/vol1')
     
    ИгорьК нравится это.
  15. serg3295

    serg3295 Гик

    Расширение для VS Code boressoft.nodemcu-tools

    Я уже долгое время пробовал использовать расширение NodeMCU-Tools для VS Code. Однако, оно было несовместимо с загрузчиком AndiDittrich/NodeMCU-Tool из-за того что nodemcu-tool не работал с версией node больше 12.22.12, а расширение NodeMCU-Tools заработало только с версией node 14.20.0.

    Моих знаний на то чтобы исправить AndiDittrich/NodeMCU-Tool явно не хватало, но некоторое время назад был сделан pull request Upgrade node-serialport dependency to v10, позволяющий использовать свежую версию serialport и перейти на версию 14 node. Пересобрав nodemcu-tool, я наконец-то смог одновременно использовать как загрузчик, так и расширение.

    Устанавливается расширение традиционно для VS Code, набираете nodemcu в строке поиска дополнений и выбираете NodeMCU-Tools v3.5.0 boressoft.

    Функционал расширения позволяет заменить ESPlorer и это его главная фишка. Дополнительно оно позволяет делать еще много вещей о которых можно прочитать в его описании.

    Для ESP8266 работает прекрасно, но, к сожалению, с веткой esp32-idf4 это расширение пока не работает, так как команды файловых операций у него забиты прямо в код.
    Со старой версией ESP32-dev (с модулем file, а не io) тоже не законнектился. Может не выдерживает тайм-аут --connection-delay <delay>, не знаю.
     
    Последнее редактирование: 13 сен 2022
    ИгорьК нравится это.
  16. serg3295

    serg3295 Гик

    Доработка nodemcu-tool для работы с node v.14

    Как я уже ранее писал, из-за смены в ветке esp32-idf4 модуля file на модуль io приходится пользоваться сразу двумя разными версиями nodemcu-tool. Одна для ESP8266 и ESP32-dev с модулем file, другая для esp32-idf4 с модулем io.

    Я собрал две версии и выложу их в архиве, содержащим две папки. Папка с именем 8266 - это первая версия, с именем 32 - вторая версия.

    Обе версии включают патч для работы с node v.14, а вторая дополнительно включает патч Lua file functions moved to standard io module и используется исключительно с esp32-idf4.
    Файлы первой версии можно просто переписать поверх nodemcu-tool, установленного глобально через npm в /usr/local/lib/node_modules/nodemcu-tool, тогда она будет вызываться как раньше, то есть для пользователя ничего не изменится.
    Вторую версию тогда придётся вызывать непосредственно из её каталога. Можно сделать и наоборот, если вы в основном работаете с esp32-idf4.

    Ссылка на Яндекс диск архив
     
    ИгорьК нравится это.
  17. serg3295

    serg3295 Гик

    Я сделал новую версию nodemcu-tool. Теперь выбор набора команд для модуля io или file осуществляется с помощью флага командной строки io-module. То есть, версия для всех веток только одна. Пример:
    Код (Bash):
    $ nodemcu-tool --io-module upload helloworld.lua
    Этот флаг, как и все остальные штатные флаги, может быть записан в конфигурационный файл .nodemcutool. Наличие его в командной строке имеет приоритет перед файлом конфигурации.
    Исходные коды на github, ветка dev-esp32.

    Ссылка на Яндекс диск архив
     
    ИгорьК нравится это.
  18. serg3295

    serg3295 Гик

    Комментарии в скриптах Lua

    Комментарии в программах писать нужно. Это даже полезно. Однако, в случае с nodeMCU также необходимо заботиться о размере файла, загружаемого в память ESP. Комментарии являются в данном случае мешающим фактором. Пробелы тоже вносят свой вклад в размер файла.

    Постановка задачи

    1. Комментарии должны вырезаться при загрузке файла в ESP;
    2. Должны обрабатываться как строчные, так и блочные комментарии;
    2. Лидирующие и концевые пробелы должны уничтожаться;
    3. Лишние пробелы внутри операторов сократить до одного;
    4. Должен поддерживаться синтаксис Lua 5.3 (битовые операции в том числе);
    5. Должны сохраняться номера строк скрипта, чтобы облегчить отладку.

    Методы решения

    Самое простое, что можно сделать - это обработку текста шаблонами.
    Код (C++):
    content = content:gsub("\n[ \t]+","\n")
    content = content:gsub("[ \t]+\n","\n")
    content = content:gsub("%-%-[^\n]*","")
    Вот только блочные комментарии здесь не обрабатываются, так как сложность задачи начинает сильно возрастать. Может же встретиться в тексте такая экзотика как
    Код (C++):
    a = [[ text ]] -- или
    b = print(a --[[ печать а ]])
    Надо применять парсер. Уже есть готовые решения на базе парсера. Одно из проверенных это luamin, a Lua minifier written in JavaScript. Он хорошо минимизирует код, убирая там вообще всё лишнее, и переименовывая переменные. Из недостатков можно отметить отсутствие поддержки Lua 5.3, однако, это решается применением вместо этого приложения его форка в котором добавлен Lua 5.3.

    Сжимается им всё очень хорошо, вот только вывод результирующего файла производится в одну строку. То есть, мы теряем номера строк, и получаем проблемы при отладке.

    Наконец, рассмотрим updated ltokenp, a token processor for Lua. Это замечательная утилита, которая может применяться еще много для чего :)
    Она решает сразу задачи 1-4, а для решения 5-ой я немножко подправил скрипт strip.lua, который входит в исходный пакет. То есть, теперь файл, полученный в результате обработки, содержит пустые строки там, где были комментарии, и нумерация строк не нарушается.

    Я заметил некоторую особенность работы скрипта - он всегда преобразует строку вида 'text1 "inner" text2' в "text1 \"inner\" text2".
    Если кто-то против этого, то он может написать свою большую функцию по обработке кавычек и подставить её в скрипте strip.lua вместо маленького шаблона "%q" в строку

    if t=="<string>" then value=string.format("%q",value):gsub("\n","n") end

    Про компиляцию и использование ltokenp всё написано в его README. Пример:

    $ ./ltokenp -s strip.lua 'ваш файл.lua' > 'результирующий файл.lua'

    Выводы

    - Для финального сжатия отлаженного файла целесеобразно применять форк Lua minifier.
    - Для сжатия файла при выгрузке в процессе отладки лучше использовать ltokenp.

    Приложения

    - Скорректированный скрипт strip.lua;
    - Скомпилированный под Linux ltokenp.
     

    Вложения:

    • strip.zip
      Размер файла:
      694 байт
      Просмотров:
      101
    • ltokenp.zip
      Размер файла:
      135,5 КБ
      Просмотров:
      63
    ИгорьК нравится это.
  19. serg3295

    serg3295 Гик

    Немного доработал nodemcu-tool. Теперь архитектура чипа определяется автоматически при соединении и в зависимости от типа ESP выбирается соответствующая система команд. Соответственно, убран флаг --io-module.
    Этот вариант находится в ветке auto на github.
    Я специально оставил оба варианта, с флагом и без него, так как версия с автоматическим определением не распознаёт какой модуль - io или file используется в прошивке ESP32. То есть, "старая" версия ESP32 с модулем file требует использования версии nodemcu-tool с флагом.
     
    ИгорьК нравится это.
  20. serg3295

    serg3295 Гик

    @ИгорьК А когда вы говорили о неработоспособности прошивки со светодиодами имелся ввиду модуль ws2812 или модуль ledc.
    Я проверял, используя ws2812 без эффектов. Он работал. А сейчас начал использовать ledc, вот он сломан. Или я что-то не так делаю.

    Upd.
    Починил я ledc, напишу им потом в issues.
     
    Последнее редактирование: 10 ноя 2022