板級(jí)適配
得益于官方團(tuán)隊(duì)對(duì) RA8D1-Vision Board 的 SDK 貼心地維護(hù),對(duì)于板級(jí)配置文件 configuration.xml 板載的攝像頭、SDRAM、LCD、TOUCH 等眾多外設(shè)都已經(jīng)配置好了
LVGL 適配到 OpenMV 工程
menuconfig 配置
LVGL 配置
在 SDK 中的 openmv 工程的基礎(chǔ)上進(jìn)行修改,添加 LVGL V8 的 packages 包,使用 scons --menuconfig 命令進(jìn)入配置窗口,直接鍵入 / 來查找 PKG_USING_LVGL 這個(gè)宏
然后按 1 跳轉(zhuǎn)到 LVGL 的設(shè)置界面,修改版本為 V8.3.5 版本,因?yàn)橹笫褂?GUI Guider 設(shè)計(jì)界面,我用的 GUI Guider 的 LVGL 版本是 V8.3.5,當(dāng)然也可以用別的版本,porting 的代碼可能有些許不一樣
還需要在 > Hardware Drivers Config > On-chip Peripheral Drivers 中使能 LVGL for LCD
觸摸配置
在官方 SDK 的 openmv 例程中觸摸是沒有被使能的,這里需要使能一下,在 > RT-Thread online packages > peripheral libraries and drivers > touch drivers 中使能 cst812t 的驅(qū)動(dòng)
然后在 > RT-Thread Components > Device Drivers 中使能觸摸中斷管腳的驅(qū)動(dòng)
最后把 packages 包下載下來
porting 配置
這時(shí) lvgl 的完整代碼已經(jīng)自動(dòng)添加到編譯環(huán)境中,下一步就是在 board 文件夾中適配 porting,和之前的文章類似,依然是 lv_conf.h、lv_port_disp.c、lv_port_indev.c 這些文件,這里就不再贅述,直接上代碼
lv_port_disp.c 和之前文章的代碼不太一樣,修改成了全屏刷新的方式
lv_port_disp.c
lv_port_indev.c
lv_conf.h
demo 測試
適配好了 LVGL,下面運(yùn)行個(gè) demo 試一下,在 LVGL 的設(shè)置中,將 Enable built-in demos 使能
board/Kconfig 中關(guān)于 LVGL 的配置是 V9 版本的,所以需要改一下
修改為
然后使能 widgets 的 demo
在 hal_entry.c 中添加代碼,lv_user_gui_init 會(huì)自動(dòng)被調(diào)用
Overflow修改
Surprise,此時(shí),最關(guān)鍵的一步來了,這個(gè)時(shí)候直接編譯的話,會(huì) overflow,region `FLASH\’ overflowed by 165240 bytes,足足超了100多KB的Flash,這就需要縮減一些配置了
因?yàn)殚_發(fā)板上的攝像頭是 OV5640,所以把其他的攝像頭驅(qū)動(dòng)都刪掉
將 openmv 的 buffer 從默認(rèn)的 512000 改成 384000,或者改到 256000
編譯燒錄到開發(fā)板,可以看到 openmv 運(yùn)行 hello world 例程的時(shí)候同時(shí)運(yùn)行著 LVGL V8 的 widgets 的 demo
觸摸也可以正常使用
至此,實(shí)現(xiàn)了 openmv 和 LVGL 的共存,實(shí)現(xiàn)了同時(shí)運(yùn)行,當(dāng)然這還不夠,下面開始介紹 GUI guider 設(shè)計(jì)界面和如何在 openmv IDE 上使用 micropython 調(diào)用 LVGL
界面設(shè)計(jì)
GUI Guider
使用 GUI Guider 來進(jìn)行 LVGL 的拖拽式設(shè)計(jì)一個(gè)簡單界面,左邊用來顯示攝像頭內(nèi)容,右邊用來顯示識(shí)別結(jié)果和 logo
生成代碼后添加到工程當(dāng)中,然后在 custom 和 generated 文件夾中添加兩個(gè) SConscript 文件,內(nèi)容如下
目錄樹如下
然后把剛剛的 demo 代碼修改為如下內(nèi)容,載入 GUI Guider 生成的界面
編譯燒錄到開發(fā)板,可以看到剛剛設(shè)計(jì)的這個(gè)界面,左邊的因?yàn)槭?canvas 控件,為了節(jié)省 RAM 空間,把生成的代碼刪除了一部分,所以是透明的
效果如下
LVGL 和 GUI Guider 界面完成,下面就開始接入到 mpy 了
添加 mpy 自定義庫
解釋型語言本質(zhì)上都是詞法解析、解釋執(zhí)行,或者直接點(diǎn)講就是腳本,mpy 就屬于解釋型語言,添加一個(gè)自定義的庫和方法也是十分容易的,在 mpy 的模塊和方法的定義中,大量使用了宏的方式來對(duì) C API 進(jìn)行添加,當(dāng)然這些宏的種類也有很多
添加模塊與方法
模塊的添加
模塊的定義程序范式如下,需要定義一個(gè)表放入模塊的名字,然后使用 MP_DEFINE_CONST_DICT 宏來定義一個(gè)字典,然后定義一個(gè) mp_obj_module_t 變量
此時(shí)僅僅是定義了一個(gè)模塊,并沒有加入到 mpy 中,下一步 打開 packages/micropython-v1.13.0/port/mpconfigport.h 這個(gè)文件添加三行代碼
然后添加到 MICROPY_PORT_BUILTIN_MODULES 這個(gè)宏中,就會(huì)參與到編譯當(dāng)中了
一般型方法
RT-Thread 也提供了一個(gè)生成器,倉庫地址:https://github.com/SummerGift/RT-MicroPython-Generator,或者點(diǎn)開即用可以訪問我的網(wǎng)站上面放的https://docs.pomin.top/codetools/RT-MicroPython-Generator
使用這個(gè)生成器,傳入參數(shù)設(shè)置為 1 的時(shí)候,生成代碼如下,使用的宏是 MP_DEFINE_CONST_FUN_OBJ_1,傳入一個(gè)泛型指針 arg_1_obj,使用 mp_obj_is_true 來獲取布爾類型的傳入?yún)?shù)
mpy 對(duì)于參數(shù)使用泛型指針的 typedef 類型 mp_obj_t 來傳參,然后使用一些 C 函數(shù)來獲取對(duì)應(yīng)的類型以及值,例如 mp_obj_get_int、py_image_cobj 等 C 函數(shù)來獲取整數(shù)值、圖像指針等
main 型方法
以此類推也有 MP_DEFINE_CONST_FUN_OBJ_0、MP_DEFINE_CONST_FUN_OBJ_2、MP_DEFINE_CONST_FUN_OBJ_3,但是參數(shù)過多的時(shí)候就不適合這樣定義了,因?yàn)樵?ARM 中需要控制參數(shù)的數(shù)量,這時(shí)就引出了 main 形式的定義宏,類似與 main 函數(shù)的 argc 和 argv,輸入?yún)?shù)有 n_args 和泛型指針的指針 args
添加一個(gè) log 方法
QSTR的生成
QSTR 宏定義也可以用前文的生成器來生成
QSTR 的內(nèi)容存放在 packages/micropython-v1.13.0/port/genhdr/qstrdefs.generated.h 中,可以使用 packages/micropython-v1.13.0/port/genhdr/gen_qstr.py 來生成,這里生成了三個(gè)后面需要用到的字符串,其中 guider 是模塊名字,下面兩個(gè)是模塊的方法
添加方法
這里定義一個(gè)名字為 guider 的模塊,帶有一個(gè)名為 lv_print 的方法
按照前文的方法加入到 built module 宏中然后編譯燒錄到開發(fā)板中
mpy 代碼如下。import guider 模塊然后調(diào)用 lv_print 方法
連接到開發(fā)板然后運(yùn)行這個(gè)代碼,可以看到 RTT 的終端打印出了代碼中寫的 log
添加LVGL的自定義方法
定義一個(gè) main 型的方法,代碼如下,實(shí)現(xiàn)傳參一個(gè)圖像類型的參數(shù),獲取了參數(shù)后拷貝到緩沖區(qū),交由 canvas 控件來顯示,并且根據(jù)圖像大小自適應(yīng)調(diào)節(jié)控件大小
添加到 guider 模塊中
此時(shí)就可以實(shí)現(xiàn)傳入攝像頭的圖像到 canvas 控件來顯示了,編譯燒錄到開發(fā)板,然后連接到 openmv IDE 運(yùn)行如下 mpy 代碼
攝像頭,啟動(dòng)!
再添加一個(gè)顯示識(shí)別結(jié)果的方法,實(shí)現(xiàn)對(duì)傳入的字符串顯示到 LVGL 界面的 label 控件上
編譯燒錄到開發(fā)板中,在 openmv IDE 中運(yùn)行如下代碼
將 $ 顯示到了界面的 label 控件上
運(yùn)行tflite
對(duì)于怎么完成對(duì)于 tflite 模型的訓(xùn)練這里就不再重復(fù)介紹,可以參考這位大佬的文章 https://club.rt-thread.org/ask/article/69ef73018d63deef.html ,跟著一步步操作即可
下載生成的可以部署到 openmv 的代模型和代碼
得到一個(gè)如下文件
將 edge impulse 中生成的代碼稍作修改,加入 guider 模塊
在 openmv IDE 上運(yùn)行識(shí)別
在開發(fā)板屏幕上顯示 LVGL 界面、識(shí)別結(jié)果與攝像頭畫面
-
SDK
+關(guān)注
關(guān)注
3文章
1020瀏覽量
45693 -
openMV
+關(guān)注
關(guān)注
3文章
39瀏覽量
9782 -
LVGL
+關(guān)注
關(guān)注
1文章
79瀏覽量
2887
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論