1.引言
之前一直想玩AI,一直没找到机会,正好在极术社区看见这次AI活动,非常Nice,也非常感谢社区给这次机会。这里先放结果:
2.芯片简介
CSK6 是聆思科技新一代的 AI 芯片 SoC 产品系列,采用多核异构架构,集成了 ARM Star MCU,HiFi4 DSP,以及聆思全新设计的 AI 神经网络处理内核 NPU,算力达到 128 GOPS。
- 1MB SRAM
- 最高 8MB PSRAM
- 内置最高支持8MB Flash,可选外置
- 多达33个可灵活配置的GPIO
- USB、UART、SDIO、I2C、I2S、SPI、PWM等外设接口
- 2个定时器,8个独立通道
- 支持4路LEDC与8路PWM输出
- 内置6路触控按钮检测
SWD、JTAG调试接口
3.开发准备
环境搭建挺简单的,离线安装包+Git。
https://docs.listenai.com/chi...
接下来参考AI这个小节,拉取SDK,用VSCODE打开代码,编译,下载
接下来根据官方有个浏览器插件,用于查看摄像头的输出以及检测结果,但是在我这里就没能成功的显示。于是就想着为何不用屏幕显示出来呢?
根据官方例子中有屏幕显示,支持ST7789,ili9488,ST7735,于是我就买了几块。
尝试用官方的例子点亮屏幕,失败了,不知为何使用lisa zep create 创建的程序编译会报错,可能是刚接触这个系统,出了问题还不知道怎么解决,其中把报错最多的就是这个。
后面修修改改终于点亮了,同时也多谢技术支持,非常热心,帮助解决了不少问题。
接下来找到头肩识别分支,使用git branch -a ,也可以用浏览器
https://cloud.listenai.com/ze...
4.代码
在头肩识别的基础上需要添加LVGL的部分代码,分别是以下几个文件
需要打开LVGL模拟器
主函数中直接删掉使用USB的部分,不实用,使用屏幕更方便
#include <stdio.h>
#include <stdlib.h>
#include <zephyr/device.h>
#include <zephyr/drivers/video.h>
#include <zephyr/kernel.h>
#include <zephyr/zephyr.h>
#include <csk_malloc.h>
#include <licak/licak.h>
#include <lvgl.h>
#define LOG_LEVEL CONFIG_LOG_DEFAULT_LEVEL
#include <logging/log.h>
LOG_MODULE_REGISTER(main);
#define VIDEO_DEV DT_LABEL(DT_NODELABEL(dvp))
// 240p
// #define IMAGE_HEIGHT 240
// #define IMAGE_WIDTH 320
// 480p
#define IMAGE_HEIGHT 480
#define IMAGE_WIDTH 640
#define IMAGE_SIZE (IMAGE_WIDTH * IMAGE_HEIGHT * 3)
const struct device *video;
extern int lv_render_init(void);
extern void lvgl_invalidate_canvas(void);
extern void lvgl_handle_hs_data(hsd_head_shoulder_detect *result);
extern void lvgl_handle_gesture_data(head_shoulder_detect *result);
int64_t time;
#define PRINT_HEAP_INFO() \
{ \
extern struct k_heap _system_heap; \
sys_heap_print_info(&_system_heap.heap, 0); \
}
void on_receive_hsd_result(hsd_t *hsd, hsd_event event, void *data, void *user_data)
{
if (event == HSD_EVENT_HEAD_SHOULDER) {
hsd_head_shoulder_detect *result = (hsd_head_shoulder_detect *)data;
// LOG_INF("head shoulder cnt: %d", result->track_count);
lvgl_handle_hs_data(result);
} else if (event == HSD_EVENT_GESTURE_RECOGNIZE) {
head_shoulder_detect *result = (head_shoulder_detect *)data;
// LOG_INF("gesture result id: %d ,state: %d", result->id, result->gesture_state);
lvgl_handle_gesture_data(result);
}
}
void main(void)
{
if (0 != licak_init()) {
LOG_ERR("LICAK init failed,exit.\n");
return;
}
video = device_get_binding(VIDEO_DEV);
if (video == NULL) {
LOG_ERR("Video device %s not found, "
"fallback to software generator.",
VIDEO_DEV);
return;
}
struct video_format fmt;
fmt.pixelformat = VIDEO_PIX_FMT_VYUY;
fmt.width = IMAGE_WIDTH;
fmt.height = IMAGE_HEIGHT;
fmt.pitch = fmt.width * 2;
if (video_set_format(video, VIDEO_EP_OUT, &fmt)) {
LOG_ERR("Unable to set video format");
return;
}
if (0 != lv_render_init()) {
LOG_ERR("LVGL Init failed.");
return;
}
hsd_t *hsd = hsd_create(HSD_FLAG_HEAD_SHOULDER | HSD_FLAG_GESTURE_RECOGNIZE);
if (hsd == NULL) {
LOG_ERR("Create HSD instance failed.");
return;
}
hsd_event_register(hsd, HSD_EVENT_HEAD_SHOULDER, on_receive_hsd_result, NULL);
hsd_event_register(hsd, HSD_EVENT_GESTURE_RECOGNIZE, on_receive_hsd_result, NULL);
printk("- Device name: %s\n", VIDEO_DEV);
hsd_start(hsd, video);
while (1)
{
k_msleep(10);
lv_task_handler();
lvgl_invalidate_canvas();
}
hsd_stop(hsd);
LOG_DBG("AP EXEC END\n");
}
5.总结
系统不错,但是需要花时间去学一下,官方的FAQ可以更新一下,使用到现在不可能就那几个问题吧,让接下来的人少花一下时间,同时也能减少你们的工作量,同时期待语音识别的DEMO。