0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何优雅的在OpenMV上使用LVGL

RT-Thread官方账号 2024-07-31 08:36 次阅读

板级适配

得益于官方团队对 RA8D1-Vision Board 的 SDK 贴心地维护,对于板级配置文件 configuration.xml 板载的摄像头、SDRAM、LCD、TOUCH 等众多外设都已经配置好了

dc409aac-4ed4-11ef-817b-92fbcf53809c.png

LVGL 适配到 OpenMV 工程

menuconfig 配置

LVGL 配置

在 SDK 中的 openmv 工程的基础上进行修改,添加 LVGL V8 的 packages 包,使用 scons --menuconfig 命令进入配置窗口,直接键入 / 来查找 PKG_USING_LVGL 这个宏

dc589fda-4ed4-11ef-817b-92fbcf53809c.png

然后按 1 跳转到 LVGL 的设置界面,修改版本为 V8.3.5 版本,因为之后使用 GUI Guider 设计界面,我用的 GUI Guider 的 LVGL 版本是 V8.3.5,当然也可以用别的版本,porting 的代码可能有些许不一样

dc7bd7e8-4ed4-11ef-817b-92fbcf53809c.png

还需要在 > Hardware Drivers Config > On-chip Peripheral Drivers 中使能 LVGL for LCD

dcac9680-4ed4-11ef-817b-92fbcf53809c.png

触摸配置

在官方 SDK 的 openmv 例程中触摸是没有被使能的,这里需要使能一下,在 > RT-Thread online packages > peripheral libraries and drivers > touch drivers 中使能 cst812t 的驱动

dcc5652a-4ed4-11ef-817b-92fbcf53809c.png

然后在 > RT-Thread Components > Device Drivers 中使能触摸中断管脚的驱动

dcd89c62-4ed4-11ef-817b-92fbcf53809c.png

最后把 packages 包下载下来

dcf3f48a-4ed4-11ef-817b-92fbcf53809c.png

porting 配置

这时 lvgl 的完整代码已经自动添加到编译环境中,下一步就是在 board 文件夹中适配 porting,和之前的文章类似,依然是 lv_conf.h、lv_port_disp.c、lv_port_indev.c 这些文件,这里就不再赘述,直接上代码

lv_port_disp.c 和之前文章的代码不太一样,修改成了全屏刷新的方式

lv_port_disp.c

dd0105b2-4ed4-11ef-817b-92fbcf53809c.pngdd1f8aaa-4ed4-11ef-817b-92fbcf53809c.png

lv_port_indev.c

dd2c2fb2-4ed4-11ef-817b-92fbcf53809c.pngdd448738-4ed4-11ef-817b-92fbcf53809c.pngdd9cfaf8-4ed4-11ef-817b-92fbcf53809c.png

lv_conf.h

ddbf9a7c-4ed4-11ef-817b-92fbcf53809c.pngddd70f68-4ed4-11ef-817b-92fbcf53809c.png

demo 测试

适配好了 LVGL,下面运行个 demo 试一下,在 LVGL 的设置中,将 Enable built-in demos 使能

dc7bd7e8-4ed4-11ef-817b-92fbcf53809c.png

board/Kconfig 中关于 LVGL 的配置是 V9 版本的,所以需要改一下

de01b1f0-4ed4-11ef-817b-92fbcf53809c.png

修改为

de13bc88-4ed4-11ef-817b-92fbcf53809c.png

然后使能 widgets 的 demo

de60afde-4ed4-11ef-817b-92fbcf53809c.png

在 hal_entry.c 中添加代码,lv_user_gui_init 会自动被调用

e16a629c-4ed4-11ef-817b-92fbcf53809c.png

Overflow修改

Surprise,此时,最关键的一步来了,这个时候直接编译的话,会 overflow,region `FLASH\’ overflowed by 165240 bytes,足足超了100多KB的Flash,这就需要缩减一些配置了

e17cea34-4ed4-11ef-817b-92fbcf53809c.png

因为开发板上的摄像头是 OV5640,所以把其他的摄像头驱动都删掉

dcc5652a-4ed4-11ef-817b-92fbcf53809c.png

将 openmv 的 buffer 从默认的 512000 改成 384000,或者改到 256000

e1a08eee-4ed4-11ef-817b-92fbcf53809c.png

编译烧录到开发板,可以看到 openmv 运行 hello world 例程的时候同时运行着 LVGL V8 的 widgets 的 demo

e1b42a4e-4ed4-11ef-817b-92fbcf53809c.png

触摸也可以正常使用

e1e10b5e-4ed4-11ef-817b-92fbcf53809c.png

至此,实现了 openmv 和 LVGL 的共存,实现了同时运行,当然这还不够,下面开始介绍 GUI guider 设计界面和如何在 openmv IDE 上使用 micropython 调用 LVGL

界面设计

GUI Guider

使用 GUI Guider 来进行 LVGL 的拖拽式设计一个简单界面,左边用来显示摄像头内容,右边用来显示识别结果和 logo

e1f82f3c-4ed4-11ef-817b-92fbcf53809c.png

生成代码后添加到工程当中,然后在 custom 和 generated 文件夹中添加两个 SConscript 文件,内容如下

e2117b04-4ed4-11ef-817b-92fbcf53809c.pnge21b499a-4ed4-11ef-817b-92fbcf53809c.png

目录树如下

e22ff7aa-4ed4-11ef-817b-92fbcf53809c.png

然后把刚刚的 demo 代码修改为如下内容,载入 GUI Guider 生成的界面

e2476afc-4ed4-11ef-817b-92fbcf53809c.png

编译烧录到开发板,可以看到刚刚设计的这个界面,左边的因为是 canvas 控件,为了节省 RAM 空间,把生成的代码删除了一部分,所以是透明的

e2596cac-4ed4-11ef-817b-92fbcf53809c.png

效果如下

e285034e-4ed4-11ef-817b-92fbcf53809c.png

LVGL 和 GUI Guider 界面完成,下面就开始接入到 mpy 了

添加 mpy 自定义库

解释型语言本质上都是词法解析、解释执行,或者直接点讲就是脚本,mpy 就属于解释型语言,添加一个自定义的库和方法也是十分容易的,在 mpy 的模块和方法的定义中,大量使用了宏的方式来对 C API 进行添加,当然这些宏的种类也有很多

添加模块与方法

模块的添加

模块的定义程序范式如下,需要定义一个表放入模块的名字,然后使用 MP_DEFINE_CONST_DICT 宏来定义一个字典,然后定义一个 mp_obj_module_t 变量

e2a3c356-4ed4-11ef-817b-92fbcf53809c.png

此时仅仅是定义了一个模块,并没有加入到 mpy 中,下一步 打开 packages/micropython-v1.13.0/port/mpconfigport.h 这个文件添加三行代码

e2b17f78-4ed4-11ef-817b-92fbcf53809c.png

然后添加到 MICROPY_PORT_BUILTIN_MODULES 这个宏中,就会参与到编译当中了

e2beb4ae-4ed4-11ef-817b-92fbcf53809c.png

一般型方法

RT-Thread 也提供了一个生成器,仓库地址:https://github.com/SummerGift/RT-MicroPython-Generator,或者点开即用可以访问我的网站上面放的https://docs.pomin.top/codetools/RT-MicroPython-Generator

使用这个生成器,传入参数设置为 1 的时候,生成代码如下,使用的宏是 MP_DEFINE_CONST_FUN_OBJ_1,传入一个泛型指针 arg_1_obj,使用 mp_obj_is_true 来获取布尔类型的传入参数

mpy 对于参数使用泛型指针的 typedef 类型 mp_obj_t 来传参,然后使用一些 C 函数来获取对应的类型以及值,例如 mp_obj_get_intpy_image_cobj 等 C 函数来获取整数值、图像指针等

e2d85bb6-4ed4-11ef-817b-92fbcf53809c.png

main 型方法

以此类推也有 MP_DEFINE_CONST_FUN_OBJ_0、MP_DEFINE_CONST_FUN_OBJ_2、MP_DEFINE_CONST_FUN_OBJ_3,但是参数过多的时候就不适合这样定义了,因为在 ARM 中需要控制参数的数量,这时就引出了 main 形式的定义宏,类似与 main 函数的 argc 和 argv,输入参数有 n_args 和泛型指针的指针 args

e2ecd71c-4ed4-11ef-817b-92fbcf53809c.png

添加一个 log 方法

QSTR的生成

QSTR 宏定义也可以用前文的生成器来生成

QSTR 的内容存放在 packages/micropython-v1.13.0/port/genhdr/qstrdefs.generated.h 中,可以使用 packages/micropython-v1.13.0/port/genhdr/gen_qstr.py 来生成,这里生成了三个后面需要用到的字符串,其中 guider 是模块名字,下面两个是模块的方法

e2fd0204-4ed4-11ef-817b-92fbcf53809c.png

添加方法

这里定义一个名字为 guider 的模块,带有一个名为 lv_print 的方法

e309852e-4ed4-11ef-817b-92fbcf53809c.png

按照前文的方法加入到 built module 宏中然后编译烧录到开发板中

mpy 代码如下。import guider 模块然后调用 lv_print 方法

e31d647c-4ed4-11ef-817b-92fbcf53809c.pnge325f042-4ed4-11ef-817b-92fbcf53809c.png

连接到开发板然后运行这个代码,可以看到 RTT 的终端打印出了代码中写的 log

e331e12c-4ed4-11ef-817b-92fbcf53809c.png

添加LVGL的自定义方法

定义一个 main 型的方法,代码如下,实现传参一个图像类型的参数,获取了参数后拷贝到缓冲区,交由 canvas 控件来显示,并且根据图像大小自适应调节控件大小

e3473b8a-4ed4-11ef-817b-92fbcf53809c.png

添加到 guider 模块中

e354451e-4ed4-11ef-817b-92fbcf53809c.png

此时就可以实现传入摄像头的图像到 canvas 控件来显示了,编译烧录到开发板,然后连接到 openmv IDE 运行如下 mpy 代码

e364e52c-4ed4-11ef-817b-92fbcf53809c.png

摄像头,启动!

e3743f86-4ed4-11ef-817b-92fbcf53809c.png

再添加一个显示识别结果的方法,实现对传入的字符串显示到 LVGL 界面的 label 控件上

e39ca2dc-4ed4-11ef-817b-92fbcf53809c.png

编译烧录到开发板中,在 openmv IDE 中运行如下代码

e3abe6c0-4ed4-11ef-817b-92fbcf53809c.png

将 $ 显示到了界面的 label 控件上

e3b4b5c0-4ed4-11ef-817b-92fbcf53809c.png

运行tflite

对于怎么完成对于 tflite 模型的训练这里就不再重复介绍,可以参考这位大佬的文章 https://club.rt-thread.org/ask/article/69ef73018d63deef.html ,跟着一步步操作即可

e3c4fdc2-4ed4-11ef-817b-92fbcf53809c.png

下载生成的可以部署到 openmv 的代模型和代码

e3e9ba22-4ed4-11ef-817b-92fbcf53809c.png

得到一个如下文件

e3f5c646-4ed4-11ef-817b-92fbcf53809c.png

将 edge impulse 中生成的代码稍作修改,加入 guider 模块

e402fbc2-4ed4-11ef-817b-92fbcf53809c.png

在 openmv IDE 上运行识别

e418fbac-4ed4-11ef-817b-92fbcf53809c.pnge4a53fae-4ed4-11ef-817b-92fbcf53809c.png

在开发板屏幕上显示 LVGL 界面、识别结果与摄像头画面

e4b07540-4ed4-11ef-817b-92fbcf53809c.pnge4ecf18c-4ed4-11ef-817b-92fbcf53809c.png

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • SDK
    SDK
    +关注

    关注

    3

    文章

    1002

    浏览量

    45393
  • openMV
    +关注

    关注

    3

    文章

    39

    浏览量

    9756
  • LVGL
    +关注

    关注

    0

    文章

    79

    浏览量

    2731
收藏 人收藏

    评论

    相关推荐

    RT-Thread NUC97x 移植 LVGL

    不涉及 rt-thread 驱动,但是它是 LVGL 和 rt-thread 的接口。LVGL rt-thread 运行的基石。
    发表于 07-08 09:37 1417次阅读

    请问esp32使用lvgl的时候要怎么配置使用外部ROM?

    请问esp32 使用lvgl的时候要怎么配置使用外部ROM?我现在用的是git的的lv_port_esp32 https://github.com/lvgl/
    发表于 06-20 06:29

    嵌入式linux如何去运行LVGL

    GitHub - lvgl/lv_port_linux_frame_buffer: LVGL configured to work with a standard Linux framebuffer
    发表于 12-15 07:58

    怎样openmv编写nrf24l01的发送代码Python呢

    nrf24l01是如何完成通信的?怎样openmv编写nrf24l01的发送代码Python呢?
    发表于 12-17 06:54

    介绍lvglubuntu的vscode模拟环境的搭建

    前言本文的主要内容是,介绍lvglubuntu的vscode模拟环境的搭建,任务处理按钮label/text
    发表于 01-18 07:21

    rtt studio打开LVGL配置完成后报错,这个错误怎么解决

    rtt studio打开LVGL,配置完之后,就报这个错误了。我用的是rtt studio.rtt4.1.0,LVGL2.0。这个错误该怎么解决。另外
    发表于 04-14 09:29

    LuatOS之LVGL字体篇

    前言之前展示过Luatoswin32运行LVGL的效果,今天带来LVGL的字体篇介绍LVGL字体支持很全,支持 UTF-8 编码的 Un
    发表于 11-23 17:51 13次下载
    LuatOS之<b class='flag-5'>LVGL</b>字体篇

    esp8266 NodeMcu硬件环境下使用lvgl

    在arduinoIDE的库管理器添加lvgl图形库arduino发布的第三方库lv_arduino.(1)安装TFT_
    发表于 11-25 19:06 32次下载
    esp8266 NodeMcu硬件环境下使用<b class='flag-5'>lvgl</b>

    LVGL 优化帧率技巧

    这种性能以上,跑出来的效果才能让人满意,最常见的103芯片使用场景受限,总体不太好。F429平台尝试LVGL过程中,也总结出几种优化提高帧率的方法。这里我们还是直接用官方测试例程 benchmark做直观的帧率展示
    发表于 12-07 13:21 15次下载
    <b class='flag-5'>LVGL</b> 优化帧率技巧

    STM32与openmv通信(HAL库)

    最近需要用到openmv进行追踪物体,所以在此做个小结,其中这些文章给我很大的帮助,建议可以去看超详细OpenMV与STM32单片机通信 以及星瞳科技官网实验目的:openmv追踪物体颜色,将物体
    发表于 12-24 19:16 23次下载
    STM32与<b class='flag-5'>openmv</b>通信(HAL库)

    openmv4系列1----基本认知

    openmv4系列1----基本认知1.openmv的由来  OpenMV是一个开源,低成本,功能强大的机器视觉模块。以STM32F427CPU为核心,集成了OV7725摄像头芯片,
    发表于 12-29 18:51 8次下载
    <b class='flag-5'>openmv</b>4系列1----基本认知

    OpenMV Cam的RPC模块

    OpenMV Cam 的rpc模块允许您将 OpenMV Cam 连接到另一台微控制器或计算机,并在 OpenMV Cam 执行远程 P
    的头像 发表于 10-08 10:28 1307次阅读

    OpenMV初识

    嵌入式端进行python开发。OpenMV基于32位,ARM Cortex-M7内核的OpenMV-H7, 并结合各种摄像头,可以进行多种机器视觉应用的实现,比如人脸检测,物体分类等。
    的头像 发表于 06-12 11:23 3304次阅读
    <b class='flag-5'>OpenMV</b>初识

    如何在MDK中部署LVGL

    LVGL的刚刚完成了对LVGL8的维护更新,发布了v8.3.5版。相对master分支正在开发的LVGL9,该版本是一个吐血推荐的稳定版本。
    的头像 发表于 07-27 14:41 1097次阅读
    如何在MDK中部署<b class='flag-5'>LVGL</b>

    基于Vision BoardopenMV垃圾分类

    通过Vision Board部署openMV实现垃圾分类。
    的头像 发表于 06-17 10:49 420次阅读
    基于Vision Board<b class='flag-5'>上</b>的<b class='flag-5'>openMV</b>垃圾分类