环境搭建
官方文档详细环境搭建教程:环境搭建
1、下载 Git 进行安装。
2、安装 lisa zep 工具,并初始化 CSK6 SDK 所需的开发环境。
3、检查开发环境
lisa info zep
开发环境的安装情况,如图:
获取源码
1、执行以下命令后,将拉取 Sample 项目 和SDK到本地并自动完成初始化:
lisa zep create --from-git https://cloud.listenai.com/zephyr/applications/app_algo_hsd_sample_for_csk6.git
AI案例体验
1、使用VSCODE打开,项目结构如下图左侧:
其中, prj.conf 文件为工程配置文件
2、打开PC端图像预览功能
打开 prj.conf 文件,将 CONFIG_WEBUSB=n 改为CONFIG_WEBUSB=y ,如下图:
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 文件:
8、安装驱动
Windows 系统点击网页上的【 Windows 系统,使用必读】按钮,按照步骤安装驱动,在安装驱动的过程,需保持 CSK6 USB 接口与电脑的连接。
9、使用工具查看
使用TypeC数据线连接 CSK6 USB 接口至电脑,若在PC端可看到如下图提示,说明设备已被识别成功:
10、点击“选择设备”按钮,选择“CSK View Finder”选项,点击“连接”,即可看到预览图和识别结果:
PWM舵机控制
1、查看引脚定义以及修改设备树
①在 .sdk\zephyr\dts\arm\csk\csk6.dtsi
设备树文件中有如下定义:
可以看出 PWM 是由 通用定时器gpt0 产生的,共有 0~7 八路 PWM 通道
②打开 引脚功能定义 表格,每个引脚的 Function11 为 PWM 复用功能:
③在 boards\csk6011a_nano.overlay
设备树文件中的 csk6011ananopinctrl节点 里定义了一些引脚的复用功能,如摄像头引脚等:
在选择 PWM 输出引脚时需特别注意,不要与这里所使用到的引脚相同,否则可能会导致摄像头等无法正常工作
在 .sdk\zephyr\boards\arm\csk6011a_nano\csk6011a_nano_pinctrl.dtsi
设备树文件开头定义了一个宏,如下图:
即 csk6011ananopinctrl节点 就是 pinctrl节点,在 csk6011a_nano_pinctrl 里定义的是摄像头的引脚,不要随意改动,在 pinctrl 里追加了串口、SPI、IIC、PWM的一些引脚复用,如下图:
④.sdk\zephyr\boards\arm\csk6011a_nano\csk6011a_nano_pinctrl.dtsi
设备树文件中默认定义了四个PWM,其使用的引脚如下:
使用到了GPIOB 02、GPIOB 06、GPIOA 04、GPIOA 05四个引脚,上面定义的 PWM 默认处于关闭状态,开启 PWM 方法后面再说,先回到 boards\csk6011a_nano.overlay
设备树文件中,其中定义的是摄像头所使用的的引脚,有如图所示引脚定义:
其中也使用到了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,如下图:
其中 status = "okay";
即表示开启
在 .sdk\zephyr\boards\arm\csk6011a_nano\csk6011a_nano.dts
设备树文件中添加舵机节点,如下图:
其中 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、总结:以上只说明了舵机控制的基本方法,基于上述方法,结合头肩识别获取到的坐标信息,就可以实现一个简单的头肩跟踪舵机云台了,篇幅有限就不再细说了,关于头肩坐标相关内容看官方文档有说明:接口说明