15

酷电玩家 · 2022年11月12日 · 湖南

【聆思CSK6 视觉AI开发套件试用】头肩、手势识别体验与PWM舵机控制

环境搭建

官方文档详细环境搭建教程:环境搭建

1、下载 Git 进行安装。

2、安装 lisa zep 工具,并初始化 CSK6 SDK 所需的开发环境。

3、检查开发环境

lisa info zep

开发环境的安装情况,如图:
image.png

获取源码

1、执行以下命令后,将拉取 Sample 项目 和SDK到本地并自动完成初始化:

lisa zep create --from-git https://cloud.listenai.com/zephyr/applications/app_algo_hsd_sample_for_csk6.git

AI案例体验

1、使用VSCODE打开,项目结构如下图左侧:
image.png
其中, prj.conf 文件为工程配置文件

2、打开PC端图像预览功能
打开 prj.conf 文件,将 CONFIG_WEBUSB=n 改为CONFIG_WEBUSB=y ,如下图:image.png

3、编译固件

lisa zep build -b csk6011a_nano

4、烧录应用程序

lisa zep flash

5、使用串口烧录算法运行所需的资源
使用 USB 线接上 DAPLink USB 口进行烧录,依次执行以下命令,完成资源的烧录。

lisa zep exec cskburn -s \\.\COMx -C 6 0x400000 .\resource\cp.bin -b 748800
lisa zep exec cskburn -s \\.\COMx -C 6 0x500000 .\resource\res.bin -b 748800

6、PC 工具获取
拉取 PC 工具项目到本地:

git clone https://cloud.listenai.com/zephyr/applications/csk_view_finder_spd.git

7、打开工具
使用 Edge 浏览器打开项目 csk_view_finder_spd/src 目录下的 index.html 文件:
image.png

8、安装驱动
Windows 系统点击网页上的【 Windows 系统,使用必读】按钮,按照步骤安装驱动,在安装驱动的过程,需保持 CSK6 USB 接口与电脑的连接。

9、使用工具查看
使用TypeC数据线连接 CSK6 USB 接口至电脑,若在PC端可看到如下图提示,说明设备已被识别成功:
1.png

10、点击“选择设备”按钮,选择“CSK View Finder”选项,点击“连接”,即可看到预览图和识别结果:

PWM舵机控制

1、查看引脚定义以及修改设备树

①在 .sdk\zephyr\dts\arm\csk\csk6.dtsi 设备树文件中有如下定义:
image.png
可以看出 PWM 是由 通用定时器gpt0 产生的,共有 0~7 八路 PWM 通道

②打开 引脚功能定义 表格,每个引脚的 Function11 为 PWM 复用功能:
左面.png

③在 boards\csk6011a_nano.overlay 设备树文件中的 csk6011ananopinctrl节点 里定义了一些引脚的复用功能,如摄像头引脚等:
image.png
在选择 PWM 输出引脚时需特别注意,不要与这里所使用到的引脚相同,否则可能会导致摄像头等无法正常工作

.sdk\zephyr\boards\arm\csk6011a_nano\csk6011a_nano_pinctrl.dtsi 设备树文件开头定义了一个宏,如下图:
image.png

csk6011ananopinctrl节点 就是 pinctrl节点,在 csk6011a_nano_pinctrl 里定义的是摄像头的引脚,不要随意改动,在 pinctrl 里追加了串口、SPI、IIC、PWM的一些引脚复用,如下图:
image.png

.sdk\zephyr\boards\arm\csk6011a_nano\csk6011a_nano_pinctrl.dtsi 设备树文件中默认定义了四个PWM,其使用的引脚如下:
image.png
使用到了GPIOB 02、GPIOB 06、GPIOA 04、GPIOA 05四个引脚,上面定义的 PWM 默认处于关闭状态,开启 PWM 方法后面再说,先回到 boards\csk6011a_nano.overlay 设备树文件中,其中定义的是摄像头所使用的的引脚,有如图所示引脚定义:
image.png
其中也使用到了GPIOA 04、GPIOA 05 ,所以要使用摄像头功能,就不能开启 PWM4 和 PWM5 ,除非修改 PWM4 和 PWM5 的复用引脚

⑤因此我们可以选择 GPIOB 06(PWM2) 和 GPIOB 02(PWM6),当然也可以使用 PWM0 PWM1 PWM3 和 PWM7,不过需要在设备树文件里添加对应的 设备节点。

2、PWM使用

在开发板原理图中可以看到,GPIOB 06上接的是 LED 灯,可以验证呼吸灯,下面以 GPIOB 02(PWM6) 为例来控制舵机:

.sdk\zephyr\boards\arm\csk6011a_nano\csk6011a_nano.dts 设备树文件中开启相应的 PWM,如下图:
image.png
其中 status = "okay"; 即表示开启

.sdk\zephyr\boards\arm\csk6011a_nano\csk6011a_nano.dts 设备树文件中添加舵机节点,如下图:
1.png
其中 pwm-servo1 即为该节点的别名,可以在程序中通过该别名获取该节点的信息

在prj.conf文件中添加 PWM 组件配置:

#打开pwm配置
CONFIG_PWM=y

在 main.c 中添加如下代码:

/* PWM */
//uint32_t period = PWM_SEC(50U);  //50Hz-即20ms
/* 获取设备树配置 */
static const struct pwm_dt_spec pwm_servo1 = PWM_DT_SPEC_GET(DT_ALIAS(pwm_servo1));
//static const struct pwm_dt_spec pwm_servo2 = PWM_DT_SPEC_GET(DT_ALIAS(pwm_servo1));

void ServoControl()
{
  int ret;

  printk("PWM-based Servo\n");

  if (!device_is_ready(pwm_servo1.dev)) {
    printk("Error: PWM device %s is not ready\n",
            pwm_servo1.dev->name);
    return;
  }

  /* 设置pwm参数,通道、频率(max_period=125000HZ)、脉宽(50%)、标志(PWM_POLARITY_NORMAL) */
  ret = pwm_set_dt(&pwm_servo1, 20000000, 2000000);
  if (ret) {
    printk("Error %d: failed to set pulse width\n", ret);
    return;
  }
}

其中 pwm_servo1 = PWM_DT_SPEC_GET(DT_ALIAS(pwm_servo1)); 就是通过节点别名获取节点信息,函数 ServoControl() 即舵机控制函数,其中调用了 pwm_set_dt(&pwm_servo1, 20000000, 2000000); 来设置 PWM 的周期和占空比,第一个参数就是从设备树中获取的节点信息结构体,第二个参数就是周期(单位ns,也就是20000000ns = 20ms),第三个参数就是占空比(单位ns,即2ms),对于舵机而言,周期为20ms,占空比为2ms的脉冲信号就是使舵机转到最大角度。

3、总结:以上只说明了舵机控制的基本方法,基于上述方法,结合头肩识别获取到的坐标信息,就可以实现一个简单的头肩跟踪舵机云台了,篇幅有限就不再细说了,关于头肩坐标相关内容看官方文档有说明:接口说明

推荐阅读
关注数
5165
内容数
99
聆思科技官方专栏,专注AIOT芯片,持续分享有趣的解决方案。商务合作微信:listenai-csk 技术交流QQ群:825206462
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息