本人使用ESP是从8266开始,从安信可的Eclipse开发直接跳到Arduino,当时就听说还有Lua可以开发,虽然后来也购入了NodeMCU,但是拿到手后就直接上的Arduino IDE。
前一阵子,网络上天天都蹦出来合宙Luat-OS,搞得在下也是心念念。这次也是感谢EEWORLD的Beetle ESP32-C3测评活动,终于有机会体验一下Lua在ESP系列中的开发方式。
1、Luat-OS的一些资料
搞了一晚上,查询了一些网上资料,将感觉比较有用的整理如下:
① 合宙的Luat-OS Wiki,有工具下载、论坛链接、Lua教程、开发板介绍、API手册、内核编译源码等内容。
https://wiki.luatos.com/
② 合宙的Gitee,里面的仓库不少。
https://gitee.com/openLuat
③ 一位大神的Gitee,里面有构建好的固件(.SOC)。
https://gitee.com/dreamcmi/LuatOS-ESP32/releases
④ 另一位大神的博客,有很多Luat-OS的使用教程,这里给出第一讲链接,本身还包含其它资料的链接。
https://blog.csdn.net/qq_38091632/article/details/122665567
2、编译内核源码
所谓Luat-OS,在下理解就是一个大号的BootLoader或者像MicroPython这样的解析引擎(也许理解不到位)。
所以,要做Lua开发,先要得到其内核固件,合宙Wiki中就有完整的教程:https://wiki.luatos.com/develop/compile/ESP32C3.html 。
第一步是从Gitee上下载源码,这里建议使用git clone,毕竟是国内的站点,网速很快。如果是下载zip包,一定记得解压后目录去掉“-master”的后缀。需要两个仓库:
① LuatOS源码:git clone https://gitee.com/openLuat/LuatOS.git
② LuatOS-ESP32项目源码:git clone https://gitee.com/dreamcmi/LuatOS-ESP32.git
两个仓库下载到统一目录下,文件夹名字不能改变——因为项目的CMakeLists.txt都是固定的路径名。
图4-1 两个源码仓库(注意放到同一路径,并保证目录名与图中一致)
第二步,按官网教程要求,检查两个文件是否存在——个人估计教程这样写也是怕用户出现下载不全的问题。
图4-2 官网教程说明截图
第三步是IDF编译,如果有朋友还没有建立IDF环境,可以参考本人帖子:https://bbs.eeworld.com.cn/thread-1210470-1-1.html 。
这里本人按照教程,使用的也是IDF控制台方式,首先打开IDF控制台并进入LuatOS-ESP32路径,然后执行命令“idf.py set-target esp32c3”。
接着执行命令“idf.py menuconfig”并进入Component config -> ESP System Settings -> Channel for console output 勾上USB Serial/JTAG Controller。
最后就是“idf.py build”一路编译。build成功后,本人还下意识的idf.py flash,实际上Luat-OS的内核还要经过构建SOC文件的过程。
第四步就是构建SOC文件,控制台继续进入“LuatOS-ESP32/tools”路径,执行命令“pip install -r requirements.txt”,安装需要的依赖包——就两个“esptool 3.2和toml 0.10.2”,再执行命令“http://python esp32v3.py -t esp32c3 -p”就在tools目录下构建好SOC文件。
图4-3 构建好的内核
3、下载内核并测试闪烁灯
编译内核出奇的顺利,原来“坑”都留在测试阶段了。
先是工具的获取:https://luatos.com/luatools/download/last ,得到烧写工具“luatools_v2.exe”,记住要右键“以管理员身份运行”,否则就会报错。
图4-4 直接双击打开报错
烧写固件过程,还算顺利,具体如下:
图4-5 luatools下载固件
官方提到ESP32-C3 USB版不能使用Luat IDE(本人后来尝试过,确实没成功,而且感觉便利性也一般),所以用记事本写了一个测试代码,并保存为main.lua——这里也是一个“坑”,项目必须有一个main.lua。
PROJECT = "gpiodemo"
VERSION = "1.0.0"
-- 一定要添加sys.lua !!!!
local sys = require "sys"
sys.taskInit(
function()
local LED_D4 = gpio.setup(10, 0)
while 1 do
LED_D4(0)
sys.wait(1000)
LED_D4(1)
sys.wait(1000)
end
end
)
-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!
最后一个大坑来了,就是下载main.lua文件,先来看看错误的提示。
图4-6 下载lua文件报错
错误提示文件名不合法,考虑到源程序文件必须是main.lua(因为也报错过),很明显是CORE——也就是固件的文件名命名方法不对,生成SOC的名字后缀看着应该是建立的时间戳,应该改为版本号“_Vxxxx_”,鬼知道是什么呢?
所以,这里本人重新下载大神提供的现成SOC,名字附带版本号,成功烧录。当然,成功后在下不死心,自己又构建了一次SOC,结果在构建命令完成后看到了版本号输出(前面真是瞎了)。
图4-7 看到版本号V0004-BETA
接着,修改自己的固件名称,这里还有一个小坑,控制台输出版本号是中横线,必须改为下划线“LuatOS-SoC_ESP32C3_V0004_BETA.soc”。
图4-8 案例下载成功
4、Lua使用初体验
先说优点——就是功能完备。Luat-OS集成了绝大部分ESP32支持功能,默认烧写固件也包含这些功能,比如:u8g2和lvgl都是默认包含的。
当然也可以通过在“..\LuatOS-ESP32\components\luat\include\luat_conf_bsp.h”头文件中对应的宏定义来实现内核功能裁剪。
这样就可以跳过Arduino和MicroPython方式下载库、IDF方式进行menuconfig配置和加载components的过程。
再说缺点——需要学习Lua语言,当然学习成本初步看来不高,毕竟只是单片机开发不涉及到Web后端之类的。另外就是烧写过程有点繁琐,坑也有点多——尤其是SOC文件名这个要求。
总体来说,一个晚上搞明白Lua使用过程,外加一个上午写好测评,还是挺开心的。不过后续准备还是先从熟悉的Arduino进行,搞定一个小案例之后,再转向Lua看看。