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

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

  1. ИгорьК

    ИгорьК Гуру

    Так понимаю, что когда-то, установив nodemcu-tool, я не обновлял node-js, ибо не надо. У вас, видимо, node.js последний и под него скомпилировано nodemcu-tool. Вот и все объяснение.

    Кстати, помню что при установке всего, тоже сначала установил нод последний и долго мучался с установкой nodemcu-tool, пока не прочитал, что нужен нод десятый. Потом все это забылось.
     
  2. serg3295

    serg3295 Гуру

    TL;DR
    На версии node 10 работать не будет. Минимум 12
    На рекомендацию автора наплюйте.

    Объяснение проблемы и её решение.

    Вот этот Pull request внёс BREAKING CHANGE: Because serialport only supports node versions >= 12 this requirement will flow through to the CLI
    Поэтому с новой версией nodemcu-tool необходимо использовать nodejs с версией не ниже 12.

    Установка nodemcu-tool на Windows 10

    Подопытный кролик - Windows 10 64bit

    1. Удаляем все предыдущие установки nodejs, как описано в этом руководстве

    2. Скачиваем версию nodejs с их сайта

    3. Устанавливаем, не соглашаясь на установку Chocolatey

    4. Смотрим что получилось:
    Код (Bash):
    PS C:\Users\defaultuser0> node -v
    v12.22.11
    PS C:\Users\defaultuser0> npm -v
    6.14.16
    5. Устанавливаем оригинальный nodemcu-tool
    Код (Bash):
    PS C:\Users\defaultuser0> npm install nodemcu-tool -g
    C:\Users\defaultuser0\AppData\Roaming\npm\nodemcu-tool -> C:\Users\defaultuser0\AppData\Roaming\npm\node_modules\nodemcu-tool\bin\nodemcu-tool.js

    > @serialport/bindings@8.0.8 install C:\Users\defaultuser0\AppData\Roaming\npm\node_modules\nodemcu-tool\node_modules\@serialport\bindings
    > prebuild-install --tag-prefix @serialport/bindings@ || node-gyp rebuild

    > serialport@8.0.8 postinstall C:\Users\defaultuser0\AppData\Roaming\npm\node_modules\nodemcu-tool\node_modules\serialport
    > node thank-you.js

    Thank you for using serialport!
    If you rely on this package, please consider supporting our open collective:
    > https://opencollective.com/serialport/donate

    + nodemcu-tool@3.2.1
    added 161 packages from 75 contributors in 22.361s

    6. Копируем каталог nodemcu-tool из архива поверх установленного в c:\Users\defaultuser0\AppData\Roaming\npm\node_modules\nodemcu-tool\

    7. Проверяем работоспособность.
    Код (Bash):

    d:\temp>nodemcu-tool upload helloworld.lua
    [config]      ~ Project based configuration loaded
    [NodeMCU-Tool]~ Connected
    [device]      ~ Arch: esp32 | Version: unknown | ChipID: 0x9530aea499d1 | FlashID: 0xunknown
    [NodeMCU-Tool]~ Uploading "helloworld.lua" >> "helloworld.lua"...
    [connector]   ~ Transfer-Mode: base64
    [NodeMCU-Tool]~ File Transfer complete!
    [NodeMCU-Tool]~ disconnecting

    d:\temp>nodemcu-tool fsinfo
    [config]      ~ Project based configuration loaded
    [NodeMCU-Tool]~ Connected
    [device]      ~ Arch: esp32 | Version: unknown | ChipID: 0x9530aea499d1 | FlashID: 0xunknown
    [device]      ~ Free Disk Space: 380 KB | Total: 404 KB | 8 Files
    [device]      ~ Files stored into Flash (SPIFFS)
    [device]      ~  - _init.lua (367 Bytes)
    [device]      ~  - ftpserver.lua (8332 Bytes)
    [device]      ~  - helloworld.lua (383 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

    d:\temp>nodemcu-tool run helloworld.lua
    [config]      ~ Project based configuration loaded
    [NodeMCU-Tool]~ Connected
    [device]      ~ Arch: esp32 | Version: unknown | ChipID: 0x9530aea499d1 | FlashID: 0xunknown
    [device]      ~ Running "helloworld.lua"
    [device]      ~ >----------------------------->
    Hello World!
    |---|
    | H |
    | E |
    | L |
    | L |
    | O |
    | | |
    | W |
    | O |
    | R |
    | L |
    | D |
    |---|
    YEAH!!! HELLO WORLD!!!
    String: Lorem ipsum dolor sit amet, consetetur sadipscing elitr
    [device]      ~ >----------------------------->
    [NodeMCU-Tool]~ disconnecting
     
     
    Последнее редактирование: 26 янв 2023
    ИгорьК нравится это.
  3. ИгорьК

    ИгорьК Гуру

    На винде у меня nodemcu-tool не устанавливался, пока не откатился на 10 нод. Тут плюй, не плюй - деваться не куда.

    И у меня действительно все работает так без проблем.
     
  4. ИгорьК

    ИгорьК Гуру

    А вот и не работает, это видно даже на примере здесь. Файлы то в esp32 не грузятся.
    А я только начал отвыкать от ESPLorer :)
     
  5. serg3295

    serg3295 Гуру

    Ну так и не должно работать. Модуля file больше ведь нет. А моя версия как раз добавляет модуль io.
    У меня на Windows 10 установлен node 12 с которым работает свежая версия nodemcu-tool. То есть, установить можно. Это было очень давно, но я попробую вспомнить как я это сделал.
     
  6. ИгорьК

    ИгорьК Гуру

    А если сейчас просто обновить node.js?
     
  7. serg3295

    serg3295 Гуру

    Обновил своё предыдущее сообщение. Добавил инструкцию по установке nodemcu на Windows 10
    Если всё заработает, то, полагаю, мои последние сообщения можно стирать.
     
    ИгорьК нравится это.
  8. ИгорьК

    ИгорьК Гуру

    Жаль пока нет времени проверить. Позже, возможно через день.
     
  9. ИгорьК

    ИгорьК Гуру

    Windows 11. Да! Это работает!

    upload_2023-1-26_20-37-53.png

    Великолепно!
    Спасибо за труд.
     
    Последнее редактирование: 26 янв 2023
    serg3295 нравится это.
  10. ИгорьК

    ИгорьК Гуру

    Чет не нашел там где конфигурируется LFS. По умолчанию он присутствует, но где его определять - найти не смог.
     
  11. serg3295

    serg3295 Гуру

    Я давно хотел написать заметку про вашего мальчика LFS. Всё некогда было. Но напишу чуть попозже.

    Проверьте, что вы взяли luac.cross с нужного места, а именно, путь/nodeMCU-firmware/build/luac_cross/luac.cross
    И очень коротко, вот так:

    Код (C++):
    -- _init.lua

    local index = node.flashindex

    local lfs_t = {
      __index = function(_, name)
          fn_ut, ba, ma, size, modules = index(name)
          if not ba then
            return fn_ut
          elseif name == '_time' then
            return fn_ut
          elseif name == '_config' then
            fs_ma, fs_size = file.fscfg()
            return {lfs_base = ba, lfs_mapped = ma, lfs_size = size,
                    fs_mapped = fs_ma, fs_size = fs_size}
          elseif name == '_list' then
            return modules
          else
            return nil
          end
        end,

      __newindex = function(_, name, value)
          error("LFS is readonly. Invalid write to LFS." .. name, 2)
        end,

    }

    _G.LFS = setmetatable(lfs_t,lfs_t)


    package.loaders[3] = function(module) -- loader_flash
      fn, ba = index(module)
      return ba and "Module not in LFS" or fn
    end

    _G.module       = nil    -- disable Lua 5.0 style modules to save RAM
    package.seeall = nil


    lf, df = loadfile, dofile
    _G.loadfile = function(n)
      mod, ext = n:match("(.*)%.(l[uc]a?)");
      fn, ba   = index(mod)
      if ba or (ext ~= 'lc' and ext ~= 'lua') then return lf(n) else return fn end
    end

    _G.dofile = function(n)
      mod, ext = n:match("(.*)%.(l[uc]a?)");
      fn, ba   = index(mod)
      if ba or (ext ~= 'lc' and ext ~= 'lua') then return df(n) else return fn() end
    end

    -- tstlfs.lua
    print("test from LFS esp32\n30 jan 2023")

     
    Код (C++):

    >/home/serg/Projects/nodeMCU-firmware/build/luac_cross/luac.cross -o lfs.img -f _init.lua tstlfs.lua
    >nodemcu-tool upload lfs.img
    >nodemcu-tool run lfsreload.lua

    -- Результат

    > node.LFS.tstlfs()
    test from LFS esp32
    30 jan 2023
    >
     
    Или я просто не понял вопроса. Что не работает?
     
    ИгорьК нравится это.
  12. ИгорьК

    ИгорьК Гуру

    Это я плохо спросил. Не об этом речь.

    Выполняю make menuconfig.

    Смотрю картинку:

    upload_2023-1-30_15-27-50.png

    Гуляю, там, гуляю, но не смог найти ничего касаемо LFS (ясно, мало гулял, плохо смотрел).

    Выбираю модули, компилирую, и опс:

    upload_2023-1-30_15-31-24.png
    А LFS там есть! А откуда он взялся, если я его не нашел?
     
  13. serg3295

    serg3295 Гуру

    Для LFS всегда выделен отдельный раздел, если я не ошибаюсь. Я что-то писал про это в сообщении в пункте про загрузку с LFS. Но надо всё-таки будет отдельно про LFS написать, а то там просто в контексте упомянуто.
    Дополнение.
    Поставьте уровень вывода в консоль info,там вроде partitions выводятся.
     
    Последнее редактирование: 30 янв 2023
    ИгорьК нравится это.
  14. ИгорьК

    ИгорьК Гуру

    И опять я промахнулся. Я имею в виду, что make menuconfig не имеет настроек LFS или я их не нашел.
    А с остальным проблем нет :)
     
  15. serg3295

    serg3295 Гуру

    Я же говорю, мне надо будет написать нормально про LFS, а не обрывками информации. А то возникает недопонимание.
    Вопрос я понял, все настройки вместе со справкой по каждому пункту находятся в файле путь/nodeMCU-firmware/components/platform/Kconfig. В явном виде про отдельное включение\выключение LFS я ничего не нашёл. Поэтому и написал, что для LFS всегда выделен отдельный раздел.
    То есть, LFS наше всё:)

    Добавлено.
    И опять я не всё написал. Файлов Kconfig несколько, и расположены они в разных каталогах, каждый отвечает за свой раздел.
     
    Последнее редактирование: 30 янв 2023
    ИгорьК нравится это.
  16. ИгорьК

    ИгорьК Гуру

    А в ветке IDF5.0 LFS по умолчанию не создается. Не проводили эксперименты?
     
  17. serg3295

    serg3295 Гуру

    У меня после обновления прошивки на 5.0 LFS уже был на тестовом чипе со старыми файлами на нём. Файлы с него запускались. Работало, то есть.
    Поскольку файл partition.csv в версии 5.0 не изменился, размер и наличие lfs как было 64кб, так и осталось.
    Специальных экспериментов не проводил дополнительно.
     
  18. serg3295

    serg3295 Гуру

    Обновление версии утилиты nodemcu-tool

    Учитывая возможные обновления версий nodejs, я немного обновил свой fork утилиты nodemcu-tool.
    Теперь можно не устанавливать утилиту через npm, а просто скачать архив nodemcu-tool.zip с github'a
    Установка заключается в распаковывании архива и размещении папки nodemcu-tool в любом месте, которое устроит пользователя.
    Исполняемой программой является файл nodemcu-tool/out/nodemcu-tool.js.

    Протестировано на Windows 10 и Linux Mint 21.1 с версиями nodejs v12.22.12, v14.21.3, v16.19.1
     
  19. serg3295

    serg3295 Гуру

    Поскольку разработчики NodeMCU планируют перейти с IDFv4.4 на IDFv5.x я буду добавлять информацию про прошивки с новой idf в эту же тему, а не создавать новую. Так как информация, относящаяся к версии 4, относится и к версии 5.

    Надо бы было переименовать тему в "Прошивка для esp32 nodemcu lua на базе idf v4-v5"
    но я не знаю как это сделать.
     
    ИгорьК нравится это.
  20. serg3295

    serg3295 Гуру

    Модуль MQTT

    В ветке dev-esp32-idf5-testing обновился модуль mqtt, в нём была исправлена ошибка, приводящая к отсутствию соединения. Можно подтягивать ветку из upstream и собирать прошивку.

    В оригинальной документации не описаны некоторые дополнительные возможности при вызове функции mqtt:connect(). Я коротко опишу их здесь.

    Кроме "стандартного" вызова
    Код (C++):
    m:connect('192.168.1.31', 1883, 0, 0, function(client)
      print("MQTT connected! Host, port.")
    end,
    function(client)
      print("MQTT disconnected! Host, port.")
    end
    )
    можно сразу указать uri в формате "mqtt://ip_хоста", или "mqtts://ip_хоста".
    В этом случае нельзя задавать параметры port и secure. При попытке их задать будут выброшены ошибки
    - port arg must be nil if giving full uri
    и
    - secure on/off determined by uri
    соответственно.

    Один из возможных вариантов вызова функции m:connect() с полным uri может выглядеть так:
    Код (C++):
    m:connect('mqtt://192.168.1.31', function()
        print("MQTT connected! Full uri.")
      end,
      function(client)
        print("MQTT disconnected! Full uri.")
      end
    )
     
    ИгорьК нравится это.