Navigation

    全志在线开发者论坛

    • Register
    • Login
    • Search
    • Categories
    • Tags
    • 在线文档
    • 社区主页

    麻雀板使用micropython开发lvgl

    MR Series
    2
    3
    2601
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • L
      lyr2021 LV 3 last edited by

      前言

      为什么要使用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 端口的快速参考
      以下几个要点需要注意:

      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补全的方式查看每个对象可以使用的函数接口
      在这里插入图片描述

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

      1 Reply Last reply Reply Quote Share 2
      • whycan
        whycan晕哥 LV 9 last edited by

        这个太6了,有没有固件可以直接烧录测试呢?

        L 1 Reply Last reply Reply Quote Share 0
        • L
          lyr2021 LV 3 @whycan last edited by lyr2021

          @whycan 我的镜像固件所用的屏幕触摸都是另外适配的,所以就不放固件了,可以参考 https://gitee.com/l_y_r/micropython_lvgl_example/tree/master 里面的安装使用教程,集成到自己固件测试
          203967d8-a7a8-4088-9e18-fd214a290587-image.png
          5329260e-e084-4068-a6ab-dafea2583ef9-image.png

          1 Reply Last reply Reply Quote Share 0
          • Referenced by  q1215200171 q1215200171 
          • Referenced by  q1215200171 q1215200171 
          • 1 / 1
          • First post
            Last post

          Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号

          行为准则 | 用户协议 | 隐私权政策