麻雀板使用micropython开发lvgl
-
前言
为什么要使用micropython来开发lvgl而不是用c?
当然在资源非常受限的芯片比如单片机上c开发会是很好的选择,或者对于某些不喜欢mpy解释器特性的也不适合。这些都不是本教程谈论的重点,我们先来看看使用micropython开发起来有何不同。我们先来看看lvgl官网关于这个的介绍:
https://docs.lvgl.io/master/get-started/micropython.html
https://blog.lvgl.io/2019-02-20/micropython-bindings
截取其中提到的一些要点(google网页翻译内容):
lvgl官网也做了在线模拟器支持:如果您想在不下载任何东西的情况下尝试LVGL + Micropython - 您可以使用我们的在线模拟器!
它是一个功能齐全的LVGL + Micropython,完全在浏览器中运行,并允许您编辑python脚本并运行它。
单击此处在在线模拟器上进行实验这个是基于micropython 的js端口移植实现的,所以在模拟器上跑的py代码我们也可以移植到板子上来运行,只需要更改驱动部分代码适配自己的板子即可。
unix端口上的开发
关于支持lvgl的micropython固件编译可以参考我之前的文章:
支持LVGL的micropython固件编译(一)
支持LVGL的micropython固件编译(二)arm板移植
下面以芒果派麻雀板(全志D1s芯片,risc-v架构)为例来讲下如何在linux上使用mpy开发lvgl应用。
移植好的芒果派麻雀板的mpy解释器,以及相关例子都维护在了我的仓库中:https://gitee.com/l_y_r/micropython_lvgl_example/tree/master
可以参考仓库里的例子自行实践。micropython的命令行选项
要开发首先要熟悉下mpy解释器,先贴出官方的相关文档 UNIX 和 Windows 端口的快速参考
以下几个要点需要注意:- -i参数主要用来在运行脚本后调试使用,进本执行后会进入repl模式下,此时可以通过tab键补全查看到脚本中导入的所有对象,并可调用代码,动态更改运行。
- mpy固件默认是1M的内存堆栈大小,如果写的py程序内存占用过多,可以使用
-X heapsize=8M
指令来改到8M大小执行脚本,当然改成其他大小也可以。 - 同python一样mpy也有外部模组引用路径,默认的搜索路径为
~/.micropython/lib:/usr/lib/micropython
,我们可以通过设置MICROPYPATH环境变量来覆盖搜索路径。在linux端口上可能会遇到mpy固件内置的py模组无法import 问题,可以通过在脚本开头加以下代码解决:# Workaround for including frozen modules when running micropython with a script argument # https://github.com/micropython/micropython/issues/6419 import usys as sys sys.path.append('')
unix端口上lvgl显示以及输入设备驱动
linux上通常使用fb来驱动屏幕显示,另外也有drm,在ubuntu等发行版上会使用sdl库封装来提供给上层操作的接口。
我们的mpy解释器从https://github.com/lvgl/lv_micropython
移植而来,在该工程中也包含了驱动模组以及使用例程,路径如下:- lib/lv_bindings/driver/linux:
linux的驱动输入以及fb显示驱动(已经内置到解释器) - lib/lv_bindings/lib:
其他依赖库(按需选择) - lib/lv_bindings/examples:
使用例程
简单的例子
我的仓库中
https://gitee.com/l_y_r/micropython_lvgl_example/tree/master
写好了fb_test.py
可以参考实现。
其中同时注册了鼠标以及触摸输入驱动mouse = evdev.mouse_indev(scr) mouse = evdev.tp_indev(scr,device='/dev/input/event2')
两种输入设备可以同时工作。
lvgl的深入开发
基本的概念有了,想要实现更多调整怎么办呢?比如更改某个控件颜色,大小,位置等等。
如果你对c开发lvgl很熟悉,那么很简单,由于mpy版的lvgl模组就是通过lvgl的c代码自动化封装而来,所以在函数接口名称上格式基本一致,参数上也是一样的,区别在于c以面向对象模式开发,第一个参数为对象指针,而在对应的mpy接口中,这个参数省略,因为本身就携带了对象。c函数封装为mpy模组的中间文件在这里:lib/lv_bindings/gen/lv_mpy_example.c
,从这个文件里找到mpy函数接口所对应的c接口。
看下面一个例子:
控件对齐函数
c中接口为void lv_obj_align(lv_obj_t * obj, lv_align_t align, lv_coord_t x_ofs, lv_coord_t y_ofs) { lv_obj_set_style_align(obj, align, 0); lv_obj_set_pos(obj, x_ofs, y_ofs); }
mpy封装中间层c中接口为:
/* * lvgl extension definition for: * void lv_obj_align(struct _lv_obj_t *obj, lv_align_t align, lv_coord_t x_ofs, lv_coord_t y_ofs) */ STATIC mp_obj_t mp_lv_obj_align(size_t mp_n_args, const mp_obj_t *mp_args, void *lv_func_ptr) { struct _lv_obj_t *obj = mp_to_lv(mp_args[0]); lv_align_t align = (uint8_t)mp_obj_get_int(mp_args[1]); lv_coord_t x_ofs = (int16_t)mp_obj_get_int(mp_args[2]); lv_coord_t y_ofs = (int16_t)mp_obj_get_int(mp_args[3]); ((void (*)(struct _lv_obj_t *, lv_align_t, lv_coord_t, lv_coord_t))lv_func_ptr)(obj, align, x_ofs, y_ofs); return mp_const_none; } STATIC MP_DEFINE_CONST_LV_FUN_OBJ_VAR(mp_lv_obj_align_obj, 4, mp_lv_obj_align, lv_obj_align);
mpy应用层使用例子:
import lvgl as lv scr = lv.obj() btn = lv.btn(scr) btn.align(lv.ALIGN.CENTER, 0, 0)
scr与btn都是一个lvgl obj,align是基于这个对象实例去调用接口的,只需要传入3个参数:对齐方向,x偏移,y偏移。
所以说就api使用来看,看C接口文档同样适用于mpy开发。官方的api文档位于:https://docs.lvgl.io/master/widgets/index.html
如果你对开发lvgl毫无经验也没有关系,可以直接参考官方的例子实现,对于mpy使用各个部件基本都做了例子:
https://docs.lvgl.io/master/examples.html
。
另外进入mpy的repl模式下导入lvgl也可以使用tab补全的方式查看每个对象可以使用的函数接口
lvgl的设计器使用:EdgeLine,SquareLine
目前lvgl设计器(EdgeLine)还处在测试阶段v0.3版本,可以从这里下载体验:https://download.csdn.net/download/qq_34440409/21458254?spm=1001.2014.3001.5503
使用设计器布局完成后可以导出mpy代码文件,导出的代码是lvgl7版本。
然后增加显示,输入驱动代码即可。正式版本1.0已经在2022年2月8号发布,改名为SquareLine,目前释放了付费版本,预计免费版还要过段时间才会放出,不过这个付费版有30天的免费体验时间,没有限制,无需注册,安装包下载链接:
https://download.csdn.net/download/qq_34440409/79838814
该版本基于lvgl8.2,可以导出c或micropython代码。 -
这个太6了,有没有固件可以直接烧录测试呢?
-
@whycan 我的镜像固件所用的屏幕触摸都是另外适配的,所以就不放固件了,可以参考 https://gitee.com/l_y_r/micropython_lvgl_example/tree/master 里面的安装使用教程,集成到自己固件测试
-
-
Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号