Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RTThreaed
LittlevGL_LVGL
OPENMV
如何优雅的在OpenMV上使用LVGL
发布于 2024-08-01 19:06:41 浏览:722
订阅该版
[tocm] ## 板级适配 得益于官方团队对 RA8D1-Vision Board 的 SDK 贴心地维护,对于板级配置文件 configuration.xml 板载的摄像头、SDRAM、LCD、TOUCH 等众多外设都已经配置好了 ![1.png](https://oss-club.rt-thread.org/uploads/20240801/157b09f7b2a9e3d927ab3862b370c174.png.webp) ## LVGL 适配到 OpenMV 工程 ### menuconfig 配置 **LVGL 配置** 在 SDK 中的 openmv 工程的基础上进行修改,添加 LVGL V8 的 packages 包,使用 scons --menuconfig 命令进入配置窗口,直接键入 / 来查找 PKG_USING_LVGL 这个宏 ![2.png](https://oss-club.rt-thread.org/uploads/20240801/bac3ea88cf02cf7c4eac60c134afc863.png) 然后按 1 跳转到 LVGL 的设置界面,修改版本为 V8.3.5 版本,因为之后使用 GUI Guider 设计界面,我用的 GUI Guider 的 LVGL 版本是 V8.3.5,当然也可以用别的版本,porting 的代码可能有些许不一样 ![3.png](https://oss-club.rt-thread.org/uploads/20240801/3dbcfdd9e88064f51c1636dd08782ea2.png.webp) 还需要在 > Hardware Drivers Config > On-chip Peripheral Drivers 中使能 LVGL for LCD ![4.png](https://oss-club.rt-thread.org/uploads/20240801/99968a95164675338f54436634ac8602.png.webp) **触摸配置** 在官方 SDK 的 openmv 例程中触摸是没有被使能的,这里需要使能一下,在 > RT-Thread online packages > peripheral libraries and drivers > touch drivers 中使能 cst812t 的驱动 ![5.png](https://oss-club.rt-thread.org/uploads/20240801/88b520926bb55d16a70f2a132c5441b9.png.webp) 然后在 > RT-Thread Components > Device Drivers 中使能触摸中断管脚的驱动 ![6.png](https://oss-club.rt-thread.org/uploads/20240801/8f08306317fd20119a08fe2a70c086d3.png.webp) 最后把 packages 包下载下来 ![7.png](https://oss-club.rt-thread.org/uploads/20240801/b166f81587ba32a2b53119f1f95205f6.png) ### porting 配置 这时 lvgl 的完整代码已经自动添加到编译环境中,下一步就是在 board 文件夹中适配 porting,和之前的文章类似,依然是 lv_conf.h、lv_port_disp.c、lv_port_indev.c 这些文件,这里就不再赘述,直接上代码 lv_port_disp.c 和之前文章的代码不太一样,修改成了全屏刷新的方式 **lv_port_disp.c** ![8.png](https://oss-club.rt-thread.org/uploads/20240801/d0d2c4370f40d93a0190b62544fc7b33.png.webp) ![9.png](https://oss-club.rt-thread.org/uploads/20240801/249104158124f1a27a0b6a22c459514f.png) **lv_port_indev.c** ![11.png](https://oss-club.rt-thread.org/uploads/20240801/5c5da95c3cb24eab173b99d9fb6c72ec.png) ![12.png](https://oss-club.rt-thread.org/uploads/20240801/1fd6b915f6eb3268b0d768642d1f1346.png.webp) ![13.png](https://oss-club.rt-thread.org/uploads/20240801/03c0c730711fc49b4085e9794cd744f3.png) **lv_conf.h** ![14.png](https://oss-club.rt-thread.org/uploads/20240801/9a5b50d80d7b949dc0e3c7cb15dc3973.png.webp) ![15.png](https://oss-club.rt-thread.org/uploads/20240801/0e439409f4b531c5598377fd950cfc1d.png.webp) **demo 测试** 适配好了 LVGL,下面运行个 demo 试一下,在 LVGL 的设置中,将 Enable built-in demos 使能 ![16.png](https://oss-club.rt-thread.org/uploads/20240801/3dbcfdd9e88064f51c1636dd08782ea2.png.webp) board/Kconfig 中关于 LVGL 的配置是 V9 版本的,所以需要改一下 ![17.png](https://oss-club.rt-thread.org/uploads/20240801/5c52b0c58277a0f26878f430aaa6d21a.png) 修改为 ![18.png](https://oss-club.rt-thread.org/uploads/20240801/3abc214b4cdce165967c09ba790dddfd.png) 然后使能 widgets 的 demo ![19.png](https://oss-club.rt-thread.org/uploads/20240801/4b3e8a0f011687e749648f839dd001bb.png.webp) 在 hal_entry.c 中添加代码,lv_user_gui_init 会自动被调用 ![20.png](https://oss-club.rt-thread.org/uploads/20240801/87b51cbe9f724bd071463ce907c6d8ac.png) **Overflow修改** Surprise,此时,最关键的一步来了,这个时候直接编译的话,会 overflow,region `FLASH\’ overflowed by 165240 bytes,足足超了100多KB的Flash,这就需要缩减一些配置了 ![21.png](https://oss-club.rt-thread.org/uploads/20240801/dd5b1f91a514773b08fc367fc696bac6.png.webp) 因为开发板上的摄像头是 OV5640,所以把其他的摄像头驱动都删掉 ![22.png](https://oss-club.rt-thread.org/uploads/20240801/88b520926bb55d16a70f2a132c5441b9.png.webp) 将 openmv 的 buffer 从默认的 512000 改成 384000,或者改到 256000 ![23.png](https://oss-club.rt-thread.org/uploads/20240801/d7dffb1f18829bce7bdff124b622ea9f.png.webp) 编译烧录到开发板,可以看到 openmv 运行 hello world 例程的时候同时运行着 LVGL V8 的 widgets 的 demo ![24.png](https://oss-club.rt-thread.org/uploads/20240801/71fa7f271aee23bda7259d64d9537550.png.webp) 触摸也可以正常使用 ![25.png](https://oss-club.rt-thread.org/uploads/20240801/1f1aa880723332873070102379547945.png.webp) 至此,实现了 openmv 和 LVGL 的共存,实现了同时运行,当然这还不够,下面开始介绍 GUI guider 设计界面和如何在 openmv IDE 上使用 micropython 调用 LVGL ## 界面设计 ### GUI Guider 使用 GUI Guider 来进行 LVGL 的拖拽式设计一个简单界面,左边用来显示摄像头内容,右边用来显示识别结果和 logo ![26.png](https://oss-club.rt-thread.org/uploads/20240801/9320274bb68e605fdc4b800505ccfa0c.png.webp) 生成代码后添加到工程当中,然后在 custom 和 generated 文件夹中添加两个 SConscript 文件,内容如下 ![27.png](https://oss-club.rt-thread.org/uploads/20240801/e6e6627abe8b51322c598e3d154eec19.png) ![28.png](https://oss-club.rt-thread.org/uploads/20240801/262abfb76b21e26afde7e8f93251c974.png) 目录树如下 ![29.png](https://oss-club.rt-thread.org/uploads/20240801/78402307b5bb8309c7976c1906714c6a.png.webp) 然后把刚刚的 demo 代码修改为如下内容,载入 GUI Guider 生成的界面 ![30.png](https://oss-club.rt-thread.org/uploads/20240801/35c088384e1731a5ab1154a39d531370.png) 编译烧录到开发板,可以看到刚刚设计的这个界面,左边的因为是 canvas 控件,为了节省 RAM 空间,把生成的代码删除了一部分,所以是透明的 ![31.png](https://oss-club.rt-thread.org/uploads/20240801/35c088384e1731a5ab1154a39d531370.png) 效果如下 ![32.png](https://oss-club.rt-thread.org/uploads/20240801/dad430c669bde88f7d2ed6a562d22112.png.webp) LVGL 和 GUI Guider 界面完成,下面就开始接入到 mpy 了 ## 添加 mpy 自定义库 解释型语言本质上都是词法解析、解释执行,或者直接点讲就是脚本,mpy 就属于解释型语言,添加一个自定义的库和方法也是十分容易的,在 mpy 的模块和方法的定义中,大量使用了宏的方式来对 C API 进行添加,当然这些宏的种类也有很多 ### 添加模块与方法 **模块的添加** 模块的定义程序范式如下,需要定义一个表放入模块的名字,然后使用 MP_DEFINE_CONST_DICT 宏来定义一个字典,然后定义一个 mp_obj_module_t 变量 ![34.png](https://oss-club.rt-thread.org/uploads/20240801/2549c916f6104409b280fc59793bfcad.png) 此时仅仅是定义了一个模块,并没有加入到 mpy 中,下一步 打开 packages/micropython-v1.13.0/port/mpconfigport.h 这个文件添加三行代码 ![35.png](https://oss-club.rt-thread.org/uploads/20240801/abb9e5dba9e2d9fddc4c405078a2c63e.png) 然后添加到 MICROPY_PORT_BUILTIN_MODULES 这个宏中,就会参与到编译当中了 ![36.png](https://oss-club.rt-thread.org/uploads/20240801/d1a43b7d666c93d49887b8b58553cf79.png.webp) **一般型方法** 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 函数来获取整数值、图像指针等 ![37.png](https://oss-club.rt-thread.org/uploads/20240801/6266e56400887afc4e69f62d200c4b14.png.webp) **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 ![38.png](https://oss-club.rt-thread.org/uploads/20240801/b7cc0f678e7c75254716638ee46b5322.png.webp) ### 添加一个 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 是模块名字,下面两个是模块的方法 ![39.png](https://oss-club.rt-thread.org/uploads/20240801/afc556b26de46e473dcc4c12feca2722.png) **添加方法** 这里定义一个名字为 guider 的模块,带有一个名为 lv_print 的方法 ![40.png](https://oss-club.rt-thread.org/uploads/20240801/f0ac4f1e7f32b7a99b3c0960f755365e.png) 按照前文的方法加入到 built module 宏中然后编译烧录到开发板中 mpy 代码如下。import guider 模块然后调用 lv_print 方法 ![41.png](https://oss-club.rt-thread.org/uploads/20240801/557144fcea34697f207617fed39b91d2.png) ![42.png](https://oss-club.rt-thread.org/uploads/20240801/10ccf7b42951feccccea2fe132fa71f9.png) 连接到开发板然后运行这个代码,可以看到 RTT 的终端打印出了代码中写的 log ![43.png](https://oss-club.rt-thread.org/uploads/20240801/0d77f46be82c1e4569eec71171341539.png.webp) ## 添加LVGL的自定义方法 定义一个 main 型的方法,代码如下,实现传参一个图像类型的参数,获取了参数后拷贝到缓冲区,交由 canvas 控件来显示,并且根据图像大小自适应调节控件大小 ![44.png](https://oss-club.rt-thread.org/uploads/20240801/18e6ffd8fa695342a2cddb002b20305f.png) 添加到 guider 模块中 ![45.png](https://oss-club.rt-thread.org/uploads/20240801/149c0b2d0947b33e9acee4da17352d9b.png) 此时就可以实现传入摄像头的图像到 canvas 控件来显示了,编译烧录到开发板,然后连接到 openmv IDE 运行如下 mpy 代码 ![46.png](https://oss-club.rt-thread.org/uploads/20240801/cb1c6408011733186b9d06be15247924.png) 摄像头,启动! ![47.png](https://oss-club.rt-thread.org/uploads/20240801/3b1b7efaf799704711a552d3db59b0be.png.webp) 再添加一个显示识别结果的方法,实现对传入的字符串显示到 LVGL 界面的 label 控件上 ![48.png](https://oss-club.rt-thread.org/uploads/20240801/5855ea885d4b8cb1ccdc68e1005804b6.png) 编译烧录到开发板中,在 openmv IDE 中运行如下代码 ![49.png](https://oss-club.rt-thread.org/uploads/20240801/359e5ffc7ecfafa4f920ac58c9779242.png) 将 $ 显示到了界面的 label 控件上 ![50.png](https://oss-club.rt-thread.org/uploads/20240801/d1c8ea93f7832b80491921c1935f58b4.png.webp) **运行tflite** 对于怎么完成对于 tflite 模型的训练这里就不再重复介绍,可以参考这位大佬的文章 https://club.rt-thread.org/ask/article/69ef73018d63deef.html ,跟着一步步操作即可 ![51.png](https://oss-club.rt-thread.org/uploads/20240801/49d810e7eac9a3d171e6e51427746b63.png.webp) 下载生成的可以部署到 openmv 的代模型和代码 ![52.png](https://oss-club.rt-thread.org/uploads/20240801/8f83e3ae1f1a787957305f52010f8862.png.webp) 得到一个如下文件 ![53.png](https://oss-club.rt-thread.org/uploads/20240801/f16836e5c4edbe0a7eb0254074facf24.png.webp) 将 edge impulse 中生成的代码稍作修改,加入 guider 模块 ![54.png](https://oss-club.rt-thread.org/uploads/20240801/97841ded718cbf0d3f73ba4a03e0196f.png.webp) 在 openmv IDE 上运行识别 ![55.png](https://oss-club.rt-thread.org/uploads/20240801/3aa56bc260f4c4e9bf392c06c490a2eb.png.webp) ![56.png](https://oss-club.rt-thread.org/uploads/20240801/3769564aea6ed2a7292a237fba95f7f8.png.webp) 在开发板屏幕上显示 LVGL 界面、识别结果与摄像头画面 ![57.png](https://oss-club.rt-thread.org/uploads/20240801/1c5e45f2b63ac691bffb4c3c99d421af.png.webp) ![58.png](https://oss-club.rt-thread.org/uploads/20240801/9e6b8ec2b853adaec4bd4645fb2dcd8b.png.webp) 最终工程可见 Github 仓库 https://github.com/POMIN-163/RA8D1-Vision-Board-OpenMV-with-LVGL-V8 ### 购买链接 ![60.png](https://oss-club.rt-thread.org/uploads/20240801/5ec1be1df1b02a3dfea410b45f806c78.png.webp) https://m.tb.cn/h.g0TaaKTnfx6iM2W?tk=lI8TWrhauqR ——————End——————
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
RT-Thread小师弟
微信:rtthread2020
文章
293
回答
171
被采纳
33
关注TA
发私信
相关文章
1
LittlevGL + DMA2D 显示图案扭曲
2
LittleVGL2RTT软件包还有在维护吗,测试遇到一些问题求解
3
使用littlevgl2rtt软件包实例运行不成功,emwin正常
4
关于littlevgl2rtt软件包刷频慢的解决方案?
5
移植了littlevGUI之后,用动态 线程去跑例程会卡死
6
lvgl的字体、图片文件如何升级?
7
qemu-vexpress-a9bsp下的littvgl工程可以实现触屏操作吗?
8
LVGL控件刷新死机问题
9
在lvgl上设置一个时间显示的label,一段时间后所有控件消失。
10
littlevgl2rtt和littlevgl的pc模拟器源码不兼容吗?
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
I2C_IIC
ESP8266
UART
WIZnet_W5500
ota在线升级
cubemx
PWM
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
keil_MDK
SFUD
msh
ulog
C++_cpp
MicroPython
本月问答贡献
出出啊
1518
个答案
343
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
813
个答案
177
次被采纳
crystal266
549
个答案
161
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
出出啊
1
篇文章
3
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
3
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部