板級適配
得益于官方團隊對 RA8D1-Vision Board 的 SDK 貼心地維護,對于板級配置文件 configuration.xml 板載的攝像頭、SDRAM、LCD、TOUCH 等眾多外設都已經配置好了
LVGL 適配到 OpenMV 工程
menuconfig 配置
LVGL 配置
在 SDK 中的 openmv 工程的基礎上進行修改,添加 LVGL V8 的 packages 包,使用 scons --menuconfig 命令進入配置窗口,直接鍵入 / 來查找 PKG_USING_LVGL 這個宏
然后按 1 跳轉到 LVGL 的設置界面,修改版本為 V8.3.5 版本,因為之后使用 GUI Guider 設計界面,我用的 GUI Guider 的 LVGL 版本是 V8.3.5,當然也可以用別的版本,porting 的代碼可能有些許不一樣
還需要在 > Hardware Drivers Config > On-chip Peripheral Drivers 中使能 LVGL for LCD
觸摸配置
在官方 SDK 的 openmv 例程中觸摸是沒有被使能的,這里需要使能一下,在 > RT-Thread online packages > peripheral libraries and drivers > touch drivers 中使能 cst812t 的驅動
然后在 > RT-Thread Components > Device Drivers 中使能觸摸中斷管腳的驅動
最后把 packages 包下載下來
porting 配置
這時 lvgl 的完整代碼已經自動添加到編譯環(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,下面運行個 demo 試一下,在 LVGL 的設置中,將 Enable built-in demos 使能
board/Kconfig 中關于 LVGL 的配置是 V9 版本的,所以需要改一下
修改為
然后使能 widgets 的 demo
在 hal_entry.c 中添加代碼,lv_user_gui_init 會自動被調用
Overflow修改
Surprise,此時,最關鍵的一步來了,這個時候直接編譯的話,會 overflow,region `FLASH\’ overflowed by 165240 bytes,足足超了100多KB的Flash,這就需要縮減一些配置了
因為開發(fā)板上的攝像頭是 OV5640,所以把其他的攝像頭驅動都刪掉
將 openmv 的 buffer 從默認的 512000 改成 384000,或者改到 256000
編譯燒錄到開發(fā)板,可以看到 openmv 運行 hello world 例程的時候同時運行著 LVGL V8 的 widgets 的 demo
觸摸也可以正常使用
至此,實現了 openmv 和 LVGL 的共存,實現了同時運行,當然這還不夠,下面開始介紹 GUI guider 設計界面和如何在 openmv IDE 上使用 micropython 調用 LVGL
界面設計
GUI Guider
使用 GUI Guider 來進行 LVGL 的拖拽式設計一個簡單界面,左邊用來顯示攝像頭內容,右邊用來顯示識別結果和 logo
生成代碼后添加到工程當中,然后在 custom 和 generated 文件夾中添加兩個 SConscript 文件,內容如下
目錄樹如下
然后把剛剛的 demo 代碼修改為如下內容,載入 GUI Guider 生成的界面
編譯燒錄到開發(fā)板,可以看到剛剛設計的這個界面,左邊的因為是 canvas 控件,為了節(jié)省 RAM 空間,把生成的代碼刪除了一部分,所以是透明的
效果如下
LVGL 和 GUI Guider 界面完成,下面就開始接入到 mpy 了
添加 mpy 自定義庫
解釋型語言本質上都是詞法解析、解釋執(zhí)行,或者直接點講就是腳本,mpy 就屬于解釋型語言,添加一個自定義的庫和方法也是十分容易的,在 mpy 的模塊和方法的定義中,大量使用了宏的方式來對 C API 進行添加,當然這些宏的種類也有很多
添加模塊與方法
模塊的添加
模塊的定義程序范式如下,需要定義一個表放入模塊的名字,然后使用 MP_DEFINE_CONST_DICT 宏來定義一個字典,然后定義一個 mp_obj_module_t 變量
此時僅僅是定義了一個模塊,并沒有加入到 mpy 中,下一步 打開 packages/micropython-v1.13.0/port/mpconfigport.h 這個文件添加三行代碼
然后添加到 MICROPY_PORT_BUILTIN_MODULES 這個宏中,就會參與到編譯當中了
一般型方法
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 函數來獲取整數值、圖像指針等
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
添加一個 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 是模塊名字,下面兩個是模塊的方法
添加方法
這里定義一個名字為 guider 的模塊,帶有一個名為 lv_print 的方法
按照前文的方法加入到 built module 宏中然后編譯燒錄到開發(fā)板中
mpy 代碼如下。import guider 模塊然后調用 lv_print 方法
連接到開發(fā)板然后運行這個代碼,可以看到 RTT 的終端打印出了代碼中寫的 log
添加LVGL的自定義方法
定義一個 main 型的方法,代碼如下,實現傳參一個圖像類型的參數,獲取了參數后拷貝到緩沖區(qū),交由 canvas 控件來顯示,并且根據圖像大小自適應調節(jié)控件大小
添加到 guider 模塊中
此時就可以實現傳入攝像頭的圖像到 canvas 控件來顯示了,編譯燒錄到開發(fā)板,然后連接到 openmv IDE 運行如下 mpy 代碼
攝像頭,啟動!
再添加一個顯示識別結果的方法,實現對傳入的字符串顯示到 LVGL 界面的 label 控件上
編譯燒錄到開發(fā)板中,在 openmv IDE 中運行如下代碼
將 $ 顯示到了界面的 label 控件上
運行tflite
對于怎么完成對于 tflite 模型的訓練這里就不再重復介紹,可以參考這位大佬的文章 https://club.rt-thread.org/ask/article/69ef73018d63deef.html ,跟著一步步操作即可
下載生成的可以部署到 openmv 的代模型和代碼
得到一個如下文件
將 edge impulse 中生成的代碼稍作修改,加入 guider 模塊
在 openmv IDE 上運行識別
在開發(fā)板屏幕上顯示 LVGL 界面、識別結果與攝像頭畫面
-
SDK
+關注
關注
3文章
1006瀏覽量
45420 -
openMV
+關注
關注
3文章
39瀏覽量
9763 -
LVGL
+關注
關注
0文章
79瀏覽量
2737
發(fā)布評論請先 登錄
相關推薦
評論