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

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

3天内不再提示

LVGL适配到OpenMV工程的实现方法

RTThread物联网操作系统 来源:RTThread物联网操作系统 2024-08-09 16:51 次阅读

板级适配

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

1ec9f756-4e62-11ef-b8af-92fbcf53809c.png

LVGL 适配到 OpenMV 工程

menuconfig 配置

LVGL 配置

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

1ef3510a-4e62-11ef-b8af-92fbcf53809c.png

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

1f0329b8-4e62-11ef-b8af-92fbcf53809c.png

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

1f188baa-4e62-11ef-b8af-92fbcf53809c.png

触摸配置

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

1f41ac92-4e62-11ef-b8af-92fbcf53809c.png

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

1f6ac2bc-4e62-11ef-b8af-92fbcf53809c.png

最后把 packages 包下载下来

1f8aec36-4e62-11ef-b8af-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

1f98b7bc-4e62-11ef-b8af-92fbcf53809c.png1fa73ef4-4e62-11ef-b8af-92fbcf53809c.png

lv_port_indev.c

1fbe6f98-4e62-11ef-b8af-92fbcf53809c.png1fd8737a-4e62-11ef-b8af-92fbcf53809c.png20350324-4e62-11ef-b8af-92fbcf53809c.png

lv_conf.h

20585b12-4e62-11ef-b8af-92fbcf53809c.png207ef36c-4e62-11ef-b8af-92fbcf53809c.png

demo 测试

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

1f0329b8-4e62-11ef-b8af-92fbcf53809c.png

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

209efa40-4e62-11ef-b8af-92fbcf53809c.png

修改为

20b3f670-4e62-11ef-b8af-92fbcf53809c.png

然后使能 widgets 的 demo

20c79e0a-4e62-11ef-b8af-92fbcf53809c.png

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

20eacace-4e62-11ef-b8af-92fbcf53809c.png

Overflow修改

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

2107023e-4e62-11ef-b8af-92fbcf53809c.png

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

1f41ac92-4e62-11ef-b8af-92fbcf53809c.png

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

21396ecc-4e62-11ef-b8af-92fbcf53809c.png

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

2147c6c0-4e62-11ef-b8af-92fbcf53809c.png

触摸也可以正常使用

21720f66-4e62-11ef-b8af-92fbcf53809c.png

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

界面设计

GUI Guider

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

219dc110-4e62-11ef-b8af-92fbcf53809c.png

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

21c762c2-4e62-11ef-b8af-92fbcf53809c.png21e0c5aa-4e62-11ef-b8af-92fbcf53809c.png

目录树如下

21fdfada-4e62-11ef-b8af-92fbcf53809c.png

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

220fbf68-4e62-11ef-b8af-92fbcf53809c.png

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

22201c82-4e62-11ef-b8af-92fbcf53809c.png

效果如下

2235f246-4e62-11ef-b8af-92fbcf53809c.png

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

添加 mpy 自定义库

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

添加模块与方法

模块的添加

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

2274ea00-4e62-11ef-b8af-92fbcf53809c.png

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

2293ad3c-4e62-11ef-b8af-92fbcf53809c.png

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

22aef826-4e62-11ef-b8af-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_int、py_image_cobj 等 C 函数来获取整数值、图像指针等

22d2c80a-4e62-11ef-b8af-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

22ecc14c-4e62-11ef-b8af-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 是模块名字,下面两个是模块的方法

22fd6f88-4e62-11ef-b8af-92fbcf53809c.png

添加方法

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

230994f2-4e62-11ef-b8af-92fbcf53809c.png

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

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

23203680-4e62-11ef-b8af-92fbcf53809c.png233be146-4e62-11ef-b8af-92fbcf53809c.png

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

2356c8d0-4e62-11ef-b8af-92fbcf53809c.png

添加LVGL的自定义方法

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

23c730ca-4e62-11ef-b8af-92fbcf53809c.png

添加到 guider 模块中

23d4c8e8-4e62-11ef-b8af-92fbcf53809c.png

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

23e2ff94-4e62-11ef-b8af-92fbcf53809c.png

摄像头,启动!

23f0a536-4e62-11ef-b8af-92fbcf53809c.png

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

24347522-4e62-11ef-b8af-92fbcf53809c.png

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

24488a30-4e62-11ef-b8af-92fbcf53809c.png

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

24673e94-4e62-11ef-b8af-92fbcf53809c.png

运行tflite

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

24a5a8a0-4e62-11ef-b8af-92fbcf53809c.png

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

24bd3592-4e62-11ef-b8af-92fbcf53809c.png

得到一个如下文件

24d04c18-4e62-11ef-b8af-92fbcf53809c.png

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

24deeb74-4e62-11ef-b8af-92fbcf53809c.png

在 openmv IDE 上运行识别

24f30e42-4e62-11ef-b8af-92fbcf53809c.png252366f0-4e62-11ef-b8af-92fbcf53809c.png

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

255ecb46-4e62-11ef-b8af-92fbcf53809c.png258b17e6-4e62-11ef-b8af-92fbcf53809c.png

最终工程可见 Github 仓库 https://github.com/POMIN-163/RA8D1-Vision-Board-OpenMV-with-LVGL-V8

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

    关注

    59

    文章

    4806

    浏览量

    95389
  • 命令
    +关注

    关注

    5

    文章

    678

    浏览量

    21981
  • SDK
    SDK
    +关注

    关注

    3

    文章

    1025

    浏览量

    45762
  • openMV
    +关注

    关注

    3

    文章

    39

    浏览量

    9794

原文标题:如何优雅的在OpenMV上使用LVGL

文章出处:【微信号:RTThread,微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    RT-Thread Studio上移植GUI-Guider-1.4开发LVGL8.2工程

    创建一个rttthread工程,选择出厂带好LVGL配置的demo,或者自己已经搭建好了LVGL环境的工程
    的头像 发表于 11-03 12:52 2080次阅读
    RT-Thread Studio上移植GUI-Guider-1.4开发<b class='flag-5'>LVGL</b>8.2<b class='flag-5'>工程</b>

    如何优雅的在OpenMV上使用LVGL

    LVGL适配到OpenMV工程menuconfig配置LVGL配置在SDK中的openmv
    的头像 发表于 07-31 08:36 972次阅读
    如何优雅的在<b class='flag-5'>OpenMV</b>上使用<b class='flag-5'>LVGL</b>

    如何在openmv实现图传功能?

    Vision board的openmv固件wifi只能实现连接,一些通信和物联网也用不了。如果我要实现openmv中的图传功能该怎么做呢,求助各位大佬
    发表于 07-09 06:36

    如何实现openmv和STM32之间的UART通讯?

    我已经尝试过,用OPENMV直接发送一给串口助手,串口助手可以接受到,用STM32自己的TX给RX写信息,改变某一引脚的电平,可以实现(就是STM32的读没问题)。但是openmv给STM32送数据
    发表于 07-19 19:36

    OpenMv和STM32如何实现通信?

    OpenMv和STM32如何实现通信?
    发表于 11-17 06:14

    OpenMV简单实现物体追踪

    简单实现物体追踪OpenMV简介材料准备OpenMV实现脱机运行1.将OpenMV与电脑连接2.使用IDE把软件内自带的代码烧录到OpenM
    发表于 11-30 06:59

    如何实现Openmv与stm32之间的通信?

    如何实现Openmv与stm32之间的通信?
    发表于 02-18 07:39

    基于OPENMV和STM32的识别追踪小车设计实现

    OPENMV和STM32的识别追踪小车(详细版)实现:通过OPENMV识别Apriltags标签,STM32驱动小车追踪标签博主通过一段时间的学习,做了这个比较简单的以OPENMV为摄
    发表于 02-25 06:21

    OPENMV和STM32的识别追踪小车(详细版)之OPENMV

    OPENMV和STM32的识别追踪小车(详细版)实现:通过OPENMV识别Apriltags标签,STM32驱动小车追踪标签博主通过一段时间的学习,做了这个比较简单的以OPENMV为摄
    发表于 01-13 12:05 0次下载
    <b class='flag-5'>OPENMV</b>和STM32的识别追踪小车(详细版)之<b class='flag-5'>OPENMV</b>端

    RISC-V SIG成功将Chromium等桌面软件适配到openEuler RISC-V

    近日,RISC-V SIG 成功将 Chromium 等桌面软件适配到 openEuler RISC-V,这是继 openSUSE 之后第二个跑起来 Chromium 的 RISC-V 发行版。
    的头像 发表于 08-26 14:07 2134次阅读

    LVGL Simulation工程

    最近在玩一个开源项目,用到ESP32,玩着玩着感觉开源项目的UI太枯燥了,于是了解到了LVGL,网上很多关于ESP32跑LVGL的现有工程
    的头像 发表于 05-11 09:12 1075次阅读
    <b class='flag-5'>LVGL</b> Simulation<b class='flag-5'>工程</b>

    Hi3861移植LVGL教程

    给 Hi3861 适配了硬件 spi ,master 模式下最高 spi 速率可以达到 40M,用来驱动 oled 屏幕。适配过程遇到了一个芯片bug,困扰了很久,clk 管脚驱动能力差,需要外接一个上拉电阻才能正常运行。适配
    的头像 发表于 05-18 09:23 2146次阅读
    Hi3861移植<b class='flag-5'>LVGL</b>教程

    OpenMV初识

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

    基于OpenMV实现演示与导出

    从原图到实现,不用写一行OpenCV代码,借助OpenMV工具轻松导出流程,可以整合到C++,支持各种上位机集成,让你用OpenCV开发的速度成倍提升。大大降低OpenCV开发难度,提升开发效率。
    发表于 09-01 15:23 763次阅读
    基于<b class='flag-5'>OpenMV</b><b class='flag-5'>实现</b>演示与导出

    基于Vision Board上的openMV垃圾分类

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