ESP-8266/ESP32 NodeMCU Lua: азы программирования.

Тема в разделе "ESP8266, ESP32", создана пользователем ИгорьК, 25 июл 2017.

  1. swc

    swc Нерд

    Будет очень кстати. Если Вы сможете написать краткую инструкцию по созданию прошивок - будет вообще отлично. Каким компилятором, какие опции, исходники. Я пользуюсь сборкой через сайт, но это привязка к Интернету. Автономная система всегда лучше, но пока руки не дошли. Если у Вас готова среда сборки и Вы сможете поделиться - буду очень признателен.
     
    Последнее редактирование: 3 июн 2019
  2. vklimk

    vklimk Нерд

    40. Сборка прошивки
    ...занимает несколько минут.
    Среду я настраивал ночью, уставший, хотел поскорее завершить, поэтому, шаги на 100% не припомню, конечно.Но, там все просто.
    Основной документ, который я использовал - Building the firmware. И еще один хороший документ, немного устаревший (исходники nodemcu-firmware содержат в себе весь toolchain, компилировать xtensa-lx106-elf-gcc не нужно, а это 90% всего документа :) ) - How to set up manually the GCC toolchain and SDK.
    Примерно все было так:
    1. У меня была виртуальная машина с линуксом - debian 8.7, на ней я и настраивал. Виртуалка работает под VMware workstation.
    2. Установил пакеты:
    Код (Bash):
    sudo apt-get install \
         build-essential zip gdb git vim make unrar autoconf automake gawk \
         bison texinfo libtool gcc g++ gperf libc-dbg ncurses-dev expat flex help2man \
         lua5.1 lua5.1-doc luarocks
    Код (Bash):
    for m in bitlib luafilesystem md5 luaposix luasocket; do sudo luarocks install $m; done
    3. Выкачал исходники прошивки:
    Код (Bash):
    git clone --recurse-submodules -b <branch> https://github.com/nodemcu/nodemcu-firmware.git
    4. Отредактировал файл app/include/user_modules.h - в нем определено, какие модули в прошивку войдут.
    5. Отредактировал файл app/include/user_config.h - в нем, кроме всего прочего, настраивается LFS.
    6. Запустил команду make
    7. Пару минут компиляции - и прошивка готова (2 файла в папке bin - 0x00000.bin и 0x10000.bin). Их можно прошить по адресам, указанным в названии файлов (перед этим, возможно, будет лучше почистить флешь от греха подальше). А можно объединить в единый файл прошивки (например, с помощью программы srec_cat ). Но, я с этим уже не разбирался.
     
    Последнее редактирование: 3 июн 2019
    swc и ИгорьК нравится это.
  3. ИгорьК

    ИгорьК Оракул Модератор

    В заголовке!
     
  4. ИгорьК

    ИгорьК Оракул Модератор

    Покажите свой файл, пожалуйста!

    upload_2019-6-3_18-59-35.png

    Сюда?
     
  5. vklimk

    vklimk Нерд

    Да. Там еще есть параметры, которые когда-то захочется изменить.
    Но, у Вас-то пока нет проблемы с размером образа LFS, как у swc, и пока ее не возникнет, то можете построить прошивку с LFS через веб-сервис. Так будет проще попробовать что такое LFS, увидеть сколько места в RAM появляется, прочувствовать некоторые задержки исполнения кода и т.п. И не будете думать, не поломали ли своими настройками чего-нибудь в прошивке. если что-то пойдет не так.
    А когда LFS полюбите и начнете писать скрипты, которые уже не влезут в 128КБ - тогда и свою прошивку можно строить, где LFS сделать побольше :) Лично я до этого этапа еще не дорос, мои скрипты помещаются и работают в 128КБ LFS, да, и изучать esp8266 и LUA я стал очень недавно. Поэтому, я пока использую прошивку, построенную веб-сервисом (но, уже подготовился и свою построить, если что).
     
    swc и ИгорьК нравится это.
  6. vklimk

    vklimk Нерд

    Вот файлы, с которыми я успешно построил прошивку для теста. Но, каждый для себя сам должен их отредактировать, ведь, каждому нужны свои модули в прошивке и т.п.
     

    Вложения:

    • user_config.h
      Размер файла:
      10,2 КБ
      Просмотров:
      184
    • user_modules.h
      Размер файла:
      2,8 КБ
      Просмотров:
      191
    swc и ИгорьК нравится это.
  7. vklimk

    vklimk Нерд

    В дополнение, в инструкции на сайте nodemcu и в посте "37. LFS от @swc - отличная работа!" есть файл _init.lua. И в конце его переопределены функции dofile() и loadfile() таким образом, что lua/lc-файл сперва ищется на LFS, а если его там нет - то уже на SPIFFS. Это личный выбор каждого, как оно должно работать, но, как по мне, то последовательность должна быть обратной. Ведь, во время разработки скрипта ты его отлаживаешь сперва обычным образом, без LFS, и, если в LFS лежит предыдущая версия скрипта, то будет невозможно отладить скрипт по быстрому, не меняя LFS.
    Вот мой вариант переопределения функций dofile() и loadfile() в _init.lua. Может быть, выглядит не очень красиво, я пока на LUA пишу топорно, по C-шному, но работает, как мне нужно, - если файл есть на SPIFFS и в LFS, то использоваться будет с SPIFFS.
    Код (Lua):
    --[[-------------------------------------------------------------------------------
      These replaces the builtins loadfile & dofile with ones which preferentially
      loads the corresponding module from SPIFFS if present.
    ---------------------------------------------------------------------------------]]


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

    G.dofile = function(n)
      if file.exists(n) then return df(n) end
      local mod, ext = n:match("(.*)%.(l[uc]a?)");
      if ext ~= 'lc' and ext ~= 'lua' then return df(n) end
      local fn, ba   = index(mod)
      if ba then return df(n) else return fn() end
    end
     
    PS. Кстати, загрузка модулей (require()) в _init.lua сделана именно так, как мне кажется правильным - сперва с SPIFFS, а, если там нет, - с LFS.
     
    swc и ИгорьК нравится это.
  8. y4ixer

    y4ixer Нуб

    Здравствуйте. Столкнулся с проблемой, что ESP принимает данные по uart только после получения CRLF. Использую uart.on. Можно как-то убрать ожидание CRLF?

    Lua 5.1.4 SDK 2.2.1
     
    Последнее редактирование: 7 июн 2019
  9. ИгорьК

    ИгорьК Оракул Модератор

    Можно.
     
  10. y4ixer

    y4ixer Нуб

    А каким образом? Можете подсказать?
     
  11. ИгорьК

    ИгорьК Оракул Модератор

    Подскажу. Пройдите по ссылке.
     
  12. y4ixer

    y4ixer Нуб

    Сейчас покопаюсь. Спасибо :)
     
  13. y4ixer

    y4ixer Нуб

    Посмотрел Ваш код. Я так понимаю, я должен был увидеть как вы используете uart.on?
    Ответа на свой вопрос я не смог найти :(

    Может я не понятно что-то объяснил, либо чего-то не понял у Вас.

    Цель у меня такая:

    Есть 2 ESP модуля. Один работает в режиме STATIONAP другой в режим STA. Я реализую прозрачный ком-порт. Т.е., всё что попадает в uart на сервере (ESP в режиме STATIONAP) должно по WiFi передаться клиенту (ESP в режиме STA) и выплюнуться в ком-порт.

    Клиентская сторона работает. Станция подключается к AP, получает и передает данные. Следит за коннектом и т.д. Всё честно и красиво. Правда реализована клиентская часть в Arduino-IDE.

    Серверная часть изначально тоже должна была быть реализована в Arduino-IDE. Точнее она даже была реализована, но я столкнулся с проблемой, что у меня не поднимается DHCP.

    Недолго думая решил писать на Lua. Пишу на нем второй день, поэтому многие вещи могу не понимать.

    Код до смешного простой, поэтому я даже не понимаю куда копать. Только понимаю, что callback uart.on не выполняется пока не будет найден перевод строки в полученных данных.

    Код (Lua):
    socket = net.createServer(net.TCP,30)
    socket:listen(80,function(c)
             c:on("receive",function(c,l) uart.write(0, l) end)
             uart.on("data", 0, function(data) c:send(data) end,0)
       end)
    Поясните, пожалуйста, где я не прав и как решить мою проблему? :(
     
  14. ИгорьК

    ИгорьК Оракул Модератор

    Ответ здесь:

    upload_2019-6-7_10-57-8.png
    Callback вызывается для каждого сетевого кадра, что подразумевает наличие '\r\n'
    Ничем здесь не помочь.

    Ну кроме как всегда есть решение другое, нежели требуется на первый взгляд.
     
  15. ИгорьК

    ИгорьК Оракул Модератор

    Вы говорили только про UART и больше ни о чем в первом сообщении.
    Однако задача и код у вас не об этом. Вам было лень писать подробно, мне - лень чистить хрустальный шар :)

    В вашем коде проблема не в UART.
     
  16. y4ixer

    y4ixer Нуб

    Не совсем понимаю, как связаны сетевые кадры и данные которые приходят в com-порт? Я так понимаю у меня проблема до сетевых кадров. Я распечатку даже воткнул в этот callback, я туда не попадаю :(

    Код (Lua):
    socket = net.createServer(net.TCP,30)
    socket:listen(80,function(c)
             c:on("receive",function(c,l) uart.write(0, l) end)
             uart.on("data", 0, function(data) print("HERE") c:send(data) end,0)
       end)
    Прошу прощения за надоедание. Хочу понять :(
     
    Последнее редактирование: 7 июн 2019
  17. y4ixer

    y4ixer Нуб

    Действительно. Вы правы. Оставил 1 строчку скрипта для работы с uart.on. Подключился и вижу эхом то, что пишу. Спасибо.

    Мне не было лень писать подробно, просто я думал, что проблема точно в uart :(

    И всё же, не могли бы Вы пояснить, почему я не попадаю в свою распечатку print("HERE") ? Это из-за того, что uart.on находится внутри прослушки соккета? Или у этого какая-то другая причина?
     
  18. ИгорьК

    ИгорьК Оракул Модератор

    У вас не стреляет это?

    Код (C++):
    uart.on("data", 0, function(data) [B]print("HERE")[/B] c:send(data) end,0)
    Полагаю, все дело в том, что у вас события внутри событий. Код надо перепродумать, но когда теперь доберусь до компа - не знаю.
     
  19. y4ixer

    y4ixer Нуб

    Да вроде не стреляет. Если Вы про [ B ] [ /B ], то это я хотел выделить жирным часть кода. Не подумал, что это будет выглядеть как теги :)
     
  20. ИгорьК

    ИгорьК Оракул Модератор

    Я понял.
    Нужно переписать этот скрипт, выведя события получения данных как по уарт так и от сервера в самостоятельные.
    Но... я на дачу. :)