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

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

  1. ИгорьК

    ИгорьК Гуру

    Он самый вместе с базовым ws2812.
    Но я глубоко в ситуацию не вникал, а сейчас этот проект встал на паузу, не до него как-то.
     
    serg3295 нравится это.
  2. serg3295

    serg3295 Гуру

    Варианты загрузки esp32 в прошивке с idf4

    Недавно в ветку idf4 были добавлены новые возможности, касающиеся загрузки esp. Это дало повод обобщить сведения об уже имеющихся вариантах загрузки и описать новые.

    Традиционная загрузка из LFS и из SPIFFS

    С помощью установок в файле конфигурации с помощью make menuconfig теперь можно выбрать способ первоначальной загрузки - из SPIFFS, или из LFS. Для этого перейдём к пункту меню Boot command.
    Код (C++):
    (Top) → Component config → Lua configuration

      Lua version (Lua 5.1)  --->
    [*] Integer-only build
      Core Lua modules  --->
      Lua compilation  --->
      Boot command (init.lua from SPIFFS)  --->
    Выбрав пункт Boot command (init.lua from SPIFFS), развернём его в:
    Код (C++):
    (Top) → Component config → Lua configuration → Boot command

    (X) init.lua from SPIFFS
    ( ) init module from LFS
    ( ) Custom
    При выборе первого пункта файл init.lua будет искаться на SPIFFS, при выборе второго пункта будет выполнена команда node.LFS.get("init")()
    Если вы выберете третий пункт Custom, то вам будет предложено ввести собственную команду, которая будет выполнена при старте, например, print("Custom command"). Или, скажем, node.LFS.get("main")().
    Для ввода команды надо выбрать поле Custom boot command
    Код (C++):
      Boot command (Custom)  --->
    ()  Custom boot command
    Традиционная загрузка из LFS

    Если вы предпочитаете размещать весь свой код Lua в LFS в виде отдельного раздела для более быстрого тестирования изменений прикладного проекта, а не встраивать его в образ firmware NodeMCU, то необходимо произвести следующие установки в файле конфигурации с помощью make menuconfig:

    - установить размер Embedded LUA Flash Store size равным 0x0 (это значение по умолчанию)
    Код (C++):
    Embedded LUA Flash Store size (hex)
    0x0
    - сбросить выбор (это установка по умолчанию) в пункте меню Embed LFS as part of the NodeMCU firmware:
    Код (C++):
    (Top) → Component config → NodeMCU platform config
    [ ] Enable NODE_DBG() output
    [*] Enable NODE_ERR() output
    ()  Partition label of SPIFFS to mount as default file system
    (4) Maximum number of open files
    [ ] Embed LFS as part of the NodeMCU firmware
    (0x0) Embedded LUA Flash Store size
      UART buffer size configuration  --->
    На самом деле, размер раздела, выделенного под LFS, при этом будет 0x10000 (по умолчанию). Это значение можно изменить вручную, поменяв последнюю цифру в файле ./nodeMCU-firmware/components/platform/partitions.csv в строчке:

    lfs, 0xC2, 0x01, , 0x10000

    К сожалению, в настоящее время отсутствует возможность загрузки lfs.img, созданного с ключом -a, по абсолютному адресу в esp, как это было возможно в esp8266.

    Все остальные действия и команды по созданию lfs.img и выгрузке его на esp не отличаются от ранее описанных для esp8266.

    Загрузка с использованием embedded LFS

    Вместо использования "обычной" LFS можно встраивать в сам образ ПО NodeMCU LFS с уже размещёнными в ней файлами *.lua вашего проекта. Это может быть полезно в сценариях, где требуется обновление встроенного ПО по воздуху (over-the-air), так как выгружается вся прошивка вместе с зашитым в неё прикладным ПО. Основным недостатком является то, что после встраивания LFS в образ NodeMCU файлы в LFS больше нельзя изменить.
    Данный тип загрузки не использует SPIFFS и, следовательно, игнорирует наличие или отсутствие файла init.lua на SPIFFS.
    Вместо этого система ищет файл init.lua в embedded LFS и запускает его, выполняя команду node.LFS.get('init')().

    Для использования данного режима необходимо произвести следующие установки в файле конфигурации с помощью make menuconfig:

    - выбрать пункт меню Embed LFS as part of the NodeMCU firmware:
    Код (C++):
    (Top) → Component config → NodeMCU platform config
    [ ] Enable NODE_DBG() output
    [*] Enable NODE_ERR() output
    ()  Partition label of SPIFFS to mount as default file system
    (4) Maximum number of open files
    [*] Embed LFS as part of the NodeMCU firmware
    (0x10000) Embedded LUA Flash Store size
      UART buffer size configuration  --->
    - установить требуемый размер LFS в hex, например, 0x10000
    Код (C++):
    Embedded LUA Flash Store size (hex)
    0x10000
    Далее, собрать прикладные файлы вашего проекта с помощью команды:

    >./tools/embed_lfs.sh /path/init.lua /path/to/file1.lua /path/to/file2.lua ...

    Которая выведет в результате что-то вроде такого:
    Код (C++):

    LFS segment address 0x000000003f426000, length 65536 (0x10000)
    Generating intermediate Lua 5.3 LFS image...
    Converting to absolute LFS image...
    Generated 2924 bytes of LFS data
    Re-linking nodemcu binary by invoking IDF build...
    Done.
    Теперь можно прошивать esp'шку
    >make flash
     
    ИгорьК нравится это.
  3. ИгорьК

    ИгорьК Гуру

    Надо вникнуть. Спасибо за такую работу!
     
    serg3295 нравится это.
  4. serg3295

    serg3295 Гуру

    Небольшое дополнение к вариантам загрузки

    При старте NodeMCU выводится так называемый NodeMCU startup banner с различной информацией о версии программного обеспечения, таблица разделов (partitions table), состояние wifi и так далее.
    Объём выводимой информации регулируется двумя параметрами в файле конфигурации, настраиваемом через make menuconfig. Это параметры `CONFIG_BOOTLOADER_LOG_LEVEL_уровень` и `CONFIG_LOG_DEFAULT_LEVEL_уровень`. Они независимо задаются для bootloader'a и log'a в соответствующих секциях.
    Код (Bash):
    (Top) → Bootloader config → Bootloader log verbosity

    ( ) No output
    ( ) Error
    (X) Warning
    ( ) Info
    ( ) Debug
    ( ) Verbose
    Код (Bash):
    (Top) → Component config → Log output → Default log verbosity

    ( ) No output
    ( ) Error
    ( ) Warning
    (X) Info
    ( ) Debug
    ( ) Verbose
    Устанавливая различные значения для этих параметров вы сможете добиться вывода только необходимой на конкретном этапе работы информации при старте NodeMCU.
     
    ИгорьК нравится это.
  5. obuhanoe

    obuhanoe Гик

    Только сегодня заметил, что после завода в сеть модуля, на idf4.4.2 перестал работать следующий код:
    Код (Text):
    do
        -- стартуем Wifi: при дисконекте (callback произойдет), ощищаем ip в таблице
        wifi.start()
       
        wifi.sta.on("got_ip", function(ev, info)
            print("IP now:",  info.ip)
        end)
       
        wifi.sta.on("disconnected", function(ev, info)    
               print("WIFI DISCONNECTED!!!")
             
        end)
    end
    Вот что вываливается:
    Код (Text):
    [0;32mI (76886) phy_init: phy_version 4670,719f9f6,Feb 18 2021,17:07:07[0m
    I (76986) wifi:mode : sta (24:0a:c4:04:5a:44)
    I (76986) wifi:enable tsf
     
    Также заметил, что по прошествию какого-то времени, idf отрубает неактивный esp32 от WIFI принудительно.
     
  6. obuhanoe

    obuhanoe Гик

    Что-то не получается у меня подключаться к WIFI
    В сеть модуль завожу как и обычно, IP при этом получает
    Код (Text):
    do
         wifi.start()
         wifi.mode(wifi.STATION, true)
         local scfg = {}
         scfg.auto = true
         scfg.save = true
         scfg.ssid = 'XXX'
         scfg.pwd = 'XXX'
         wifi.sta.config(scfg, true)
         wifi.sta.on("got_ip", function(ev, info)
           print("NodeMCU IP config:", info.ip)
         end)
         wifi.sta.connect()
    end
    А уже в работе модуля вот этот код
    Код (Text):
    do
        wifi.start()
       
        wifi.sta.on("got_ip", function(ev, info)      
          --  params.ip =
            print("IP now:", info.ip)
        end)
    end
    не работает и непонятно что он хочет, описание же на сайте еще пока для текущей idf, а не 4.4.2.
    Подскажите как быть?
    Спасибо
     
  7. serg3295

    serg3295 Гуру

    Документация для wifi не изменялась для idf4. Можете пользоваться текущей. Если потребуется именно документация на idf4, то она находится на github'e, можете читать её прямо там.
    Для работы wifi необходимо вызвать функцию wifi.sta.connect() о чём и написано в документации.
     
    obuhanoe нравится это.
  8. obuhanoe

    obuhanoe Гик

    Открыл документацию file.md - так как в новой версии idf ругается на команду open
    Код (Text):
     file.open("one.lua", "r")
    А такого метода и нет.

    На странице https://nodemcu.readthedocs.io/en/dev-esp32/modules/file/#fileopen
    пример соответственно нерабочий (((
    Код (Text):
    if file.open("init.lua") then
      print(file.read())
      file.close()
    end
     
    Нет ли в документации что то такого:
    было file.open
    Стало - XXXXX

    А так получается хотел уйти от утечки памяти, а приходится немного переписывать код )
     
  9. serg3295

    serg3295 Гуру

    Документацию недостаточно открыть, её ещё надо прочитать. В первом абзаце написано, что теперь в ветке idf4 используется стандартный модуль io, и только несколько функций file специфичных для SPIFFS.
    То есть, пользуйтесь учебником Иерузалимски для написания файловых операций.
     
    obuhanoe нравится это.
  10. serg3295

    serg3295 Гуру

    Информация для тех, кто собирает прошивку из исходников.

    В репозитории /nodemcu/nodemcu-firmware произошли изменения. Ветка dev-esp32 с последним коммитом Update RTD MkDocs (#3457) признана устаревшей и переименована в dev-esp32-idf3-final.
    Планируется переход на версию idf5, и вносить изменения в ветку с названием -idf4 было бы странно, поэтому...
    Активная ветка dev-esp32-idf4 переименована в dev-esp32.
     
    ИгорьК нравится это.
  11. ИгорьК

    ИгорьК Гуру

    Таки как теперь сделать аналог:
    Код (Lua):
    var = dofile('somefile.lua')
    Все, никак?

    Перегрузился :)
     
    Последнее редактирование: 25 янв 2023
    serg3295 нравится это.
  12. ИгорьК

    ИгорьК Гуру

    Собрал вчера прошивку в WSL на винде из новой ветки dev-esp32, удалив при этом старую. Все как-то сразу скомпилировалось, на удивление, ничего сильно не требовало установить, Питон тоже как-то быстренько соорганизовался в версиях. В общем, спасибо за информацию.

    А вот старый любимый файл ide.lua, что позволял на ESP запускать редактор кода, уже требует серьезного пересмотра.

    Какие-то мелочи из старых проектов вывалили в guru meditation error. В общем, вчера шло тестирование до состояния помрачения рассудка, что вылилось в предыдущий пост :)

    За одно пытался понять ваши манипуляции с nodemcu-tool и... ничего не понял, ибо у меня все работает и грузится без проблем и через ваши доработки VS-Code и через ваш ESPlorer.
    Итого, огромное огромное спасибо!
     
  13. ИгорьК

    ИгорьК Гуру

    А вот еще какая фигня иногда приключается:

    upload_2023-1-25_14-47-54.png

    Чет там правлю на lua и в один прекрасный момент вылезает такая фигня.
    И это действительно прекрасный момент, ибо иногда вместо такой заметной штуки код в последних строках начинает исчезать, и если сильно увлечешься, а тем более код внизу и не виден, можно получить строки три-четыре сгрызенных. Причем происходит это не на одном компьютере.

    Бывало у кого это явление?
     
  14. ИгорьК

    ИгорьК Гуру

    Таки заметил, что в idf4 лучше не забывать про collectgarbage(), Кажется это раньше обсуждалось.
     
  15. serg3295

    serg3295 Гуру

    Да, в этой версии разработчики очень качественно отладили скрипты сборки. По сравнению даже с предыдущей веткой для esp32 (не idf3, а ещё с модулем file) просто небо и земля.
    С модулем net изменения произошли нехорошие. У меня сломался из-за этого ftp сервер, которым я всё время пользовался. Я переписал его немного, чтобы он работал с новой версией для esp32, но наткнулся на то, что net.server:close() выбрасывает ошибку. Как следствие, удаётся один раз приконнектится к ftp серверу, а вот второй раз уже нет. Я открыл issue по поводу net.server:close(), но она так и висит там без движения.
    Также разработчиками была убрана функция net.socket:hold(), которая тормозила поток данных на приёме ftp сервера в esp. И чем эту функцию заменить я пока не придумал. Да и без починки net.server:close это не имеет смысла.
    Так что остался я пока что без любимого способа загрузки.
    Я вчера очень поздно заметил ваше сообщение, и компьютер включать было уже лениво. Поэтому минут 15 в голове прокручивал алгоритмы загрузки через loadfile с определением загруженной функции в глобальном окружении и в пользовательском, их отличие от загрузки по require и прочую фигню. Так ничего, естественно, и не придумал.
    Так что очень хорошо, что починилось ничего и не ломалось.:)
    Ну с Esplorer'ом всё грузилось и без меня. А вот автору расширения для VS Code я написал, он вроде выразил готовность доработать свою программу, добавив туда новые возможности. Но, к сожалению, очевидно у него нет пока времени на это.
    Я потихоньку разбираюсь с его кодом. К настоящему моменту отладил автоматическое определение архитектуры подключенного чипа, теперь пытаюсь дописать код для выбора системы команд в зависимости от того, что за чип подключен. Typescript я изучаю с нуля, поэтому процесс идёт очень не быстро.

    Про nodemcu-tool я действительно написал несколько сумбурно, поскольку шёл итерационный процесс разработки. В ближайшее время я оформлю отдельным сообщением небольшую инструкцию с пояснениями.
    Спасибо вам за тот огромный объём выложенного материала, которым вы сподвигли массу людей, и меня в том числе :rolleyes:, на применение nodemcu с Lua внутри.
     
    ИгорьК нравится это.
  16. serg3295

    serg3295 Гуру

    Такого никогда у себя не видел.:eek:
     
  17. serg3295

    serg3295 Гуру

    Применение утилиты nodemcu-tool с новейшей веткой dev-esp32.

    Для загрузки программного обеспечения пользователя в esp32 с firmware, собранным из ветки dev-esp32 можно использовать Esplorer. Однако, если требуется производить загрузку в автоматизированном режиме, с помощью пользовательских скриптов, (или вам просто нравится командная строка), то необходимо применять внешнюю утилиту nodemcu-tool.

    Поскольку maintainer этого проекта долгое время не обновлял репозиторий из предлагаемых Pull request, то для корректной работы данной утилиты как с esp8266, так и с esp32 c текущим firmware dev-esp32 необходимо использовать fork. Вы можете склонировать этот fork и собрать ветку auto из исходников для получения рабочего варианта. Или...

    Установка (простой путь)
    1. Установить оригинальный nodemcu-tool, пользуясь документацией из репозитория исходного проекта.
    2. Скопировать поверх установленной директорию nodemcu-tool из архива на Yandex disk.
     
    ИгорьК нравится это.
  18. ИгорьК

    ИгорьК Гуру

    Шаг один. Проверяю, что в текущем состоянии VSCode грузит файлы в ESP8266, ESP32 c последней прошивкой, что компилировал вчера из ветки dev-esp32 (idf4)

    Шаг два. Устанавливаю по простому пути. VSCode перестает работать со всеми модулями.

    Шаг три. Переустанавливаю nodemcu-tool из репозитория (удаляю папку nodemcu-tool, npm install nodemcu-tool -g) - все грузится нормально.

    ЧЯНД? Что я не так делаю думаю? :)

    Кстати, у меня стоит патченная ява-машина "jre-8u111-windows-i586_filezebra", может в этом дело?
     
  19. serg3295

    serg3295 Гуру

    Здесь нужна дополнительная информация. Сам ведь VS Code ничего не грузит. Используется либо расширение boressoft с модулем serialport, либо nodemcu-tool, вызываемый из скриптов.
    1. Какой вариант в данном случае используется?
    2. Какая версия node?
    3. Работает ли nodemcu-tool из командной строки без VS Code?

    В архив я паковал файлы из своего рабочего каталога /usr/local/lib/node_modules/nodemcu-tool/
    Ну, то есть те, с которыми сам работаю. У меня Linux Mint и node -v
    v14.20.0
    Скачал архив с яндекс диска, переписал поверх существующей установки. Проверил, работает.
    Под jre Esplorer запускается. На nodemcu-tool, по идее, не должно никак влиять.

    Обновление от 10:22
    Перегрузился под Windows. Переписал поверх nodemcu-tool файлами из архива. Всё работает. Причём версия node 12.21.0
    Код (Bash):
    PS C:\temp> nodemcu-tool -p com4 upload .\net.lua
    [NodeMCU-Tool]~ Connected
    [device]      ~ Arch: esp32 | Version: unknown | ChipID: 0x9530aea499d1 | FlashID: 0xunknown
    [NodeMCU-Tool]~ Uploading ".\net.lua" >> "net.lua"...
    [connector]   ~ Transfer-Mode: base64
    [NodeMCU-Tool]~ File Transfer complete!
    [NodeMCU-Tool]~ disconnecting
    PS C:\temp> nodemcu-tool -p com4 fsinfo
    [NodeMCU-Tool]~ Connected
    [device]      ~ Arch: esp32 | Version: unknown | ChipID: 0x9530aea499d1 | FlashID: 0xunknown
    [device]      ~ Free Disk Space: 380 KB | Total: 404 KB | 7 Files
    [device]      ~ Files stored into Flash (SPIFFS)
    [device]      ~  - _init.lua (367 Bytes)
    [device]      ~  - ftpserver.lua (8332 Bytes)
    [device]      ~  - tr.lua (11127 Bytes)
    [device]      ~  - net.lua (380 Bytes)
    [device]      ~  - f2.lua (70 Bytes)
    [device]      ~  - e.lua (12 Bytes)
    [device]      ~  - send_data_t.lua (1033 Bytes)
    [NodeMCU-Tool]~ disconnecting
    PS C:\temp> node
    Welcome to Node.js v12.21.0.
    Type ".help" for more information.
    >
     
    Последнее редактирование: 26 янв 2023
    ИгорьК нравится это.
  20. ИгорьК

    ИгорьК Гуру

    Ну да. Грузит ваше дополнение через RunTask, что вы раскрыли здесь.
    boressoft работает только с ESP8266.

    Windows 10 машина.
    Код (Bash):
    PS C:\tmp> nodemcu-tool -p com14 upload .\__init.lua
    [NodeMCU-Tool]~ Connected
    [device]      ~ Arch: esp32 | Version: unknown | ChipID: 0xb130aea4479e | FlashID: 0xunknown
    [NodeMCU-Tool]~ Uploading ".\__init.lua" >> "__init.lua"...
    [connector]   ~ Transfer-Mode: hex
    [NodeMCU-Tool]~ File Transfer complete!
    [NodeMCU-Tool]~ disconnecting
    PS C:\tmp> nodemcu-tool -p com14 fsinfo
    [NodeMCU-Tool]~ Connected
    [device]      ~ Arch: esp32 | Version: unknown | ChipID: 0xb130aea4479e | FlashID: 0xunknown
    [device]      ~ Free Disk Space: 380 KB | Total: 404 KB | 16 Files
    [device]      ~ Files stored into Flash (SPIFFS)
    [device]      ~  - mqttpub.lua (591 Bytes)
    [device]      ~  - _mh-z19b.lua (1194 Bytes)
    [device]      ~  - wifi32.lua (298 Bytes)
    [device]      ~  - mqttset.lua (1536 Bytes)
    [device]      ~  - ide.lua (8436 Bytes)
    [device]      ~  - _renameinit.lua (277 Bytes)
    [device]      ~  - _mh-z19bclb.lua (1494 Bytes)
    [device]      ~  - setglobals.lua (243 Bytes)
    [device]      ~  - asktime.lua (170 Bytes)
    [device]      ~  - main.lua (108 Bytes)
    [device]      ~  - askMHZ19.lua (251 Bytes)
    [device]      ~  - _printREG.lua (567 Bytes)
    [device]      ~  - _init.lua (762 Bytes)
    [device]      ~  - sendboot.lua (1209 Bytes)
    [device]      ~  - mqttanalize.lua (507 Bytes)
    [device]      ~  - _check.lua (637 Bytes)
    [NodeMCU-Tool]~ disconnecting
    PS C:\tmp> node -v
    v10.24.1
    PS C:\tmp>
    Что касается node.js:
    upload_2023-1-26_11-11-6.png

    Это отсюда.
     
    Последнее редактирование: 26 янв 2023