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网页翻译内容):
micropython开发lvgl教程_第1张图片
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 端口的快速参考
以下几个要点需要注意:

  1. -i参数主要用来在运行脚本后调试使用,进本执行后会进入repl模式下,此时可以通过tab键补全查看到脚本中导入的所有对象,并可调用代码,动态更改运行。
  2. mpy固件默认是1M的内存堆栈大小,如果写的py程序内存占用过多,可以使用-X heapsize=8M指令来改到8M大小执行脚本,当然改成其他大小也可以。
  3. 同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补全的方式查看每个对象可以使用的函数接口
micropython开发lvgl教程_第2张图片

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代码。

你可能感兴趣的:(micropython,lvgl,linux,单片机,嵌入式硬件)