本篇文章来自极术社区与聆思科技组织的CSK6 视觉AI开发套件活动,更多开发板试用活动请关注极术社区网站。作者:寒冰1988

感谢极术社区联合聆思组织的本次活动,很荣幸得到本次体验国产AI MCU的机会。官方的文档写的很详细,技术支持也很及时,使开发者能够快速上手板卡的开发。经过一段时间的学习,本文将结合聆思AI手势识别的能力结合8X8点阵实现一款剪子包袱锤的游戏,作为本次试用体验的一个阶段性总结。

一.开发环境搭建

1.1 硬件环境

如下图所示,本次产品有聆思的CSK6011-NanoKit视觉开发套件和8*8点阵组成,CSK6011-NanoKit负责手势的识别,点阵负责图形的显示,两者通过SPI总线连接在一起。

1.2 软件环境

软件开发环境搭建可以参考CSK6 环境搭建,聆思很贴心的提供了完整的打包开发环境,利用lisa工具可以完成项目的创建、编译和下载,此外厂商还基于VSCODE 插件的方式提供了完整的IDE开发环境。

二.点阵的使用

2.1 硬件连接

8x8点阵的主控是GC7219(完全兼容MAX7219),其典型的应用图如下所示:

芯片可以通过GPIO或者SPI来驱动,官方提供了SPI的参考demo,本次将基于其实现对点阵的控制。将GC7219(点阵)与CSK6011的SPI0连接,利用板载的3.3V管脚供电,相关管脚的连接示意图如下:

2.2 图标建模

由于CSK6011目前支持5种手势,分别为LIKE( )、OK( )、STOP( )、YES(✌️)、SIX( ),采用相似原则,取LIKE=锤,STOP=包袱,YES=剪刀。相关示图标建模(共阴)如下:

2.3 驱动开发

2.3.1 建立SPI开发工程

参见SPI参考工程的实现,搭建SPI驱动开发工程。

2.3.2 GC7219的适配

由GC7219的手册可知,其支持MSB模式,且最高频率只有10M,因此spi的Config需要做如下修改

/* spi master 8bit, LSB first*/spi_cfg.operation = SPI_WORD_SET(8) | SPI_OP_MODE_MASTER | SPI_TRANSFER_LSB;spi_cfg.frequency = 10 * 1000000UL;

改为

/* spi master 8bit, MSB first*/spi_cfg.operation = SPI_WORD_SET(8) | SPI_OP_MODE_MASTER | SPI_TRANSFER_MSB;spi_cfg.frequency = 5 * 1000000UL;

2.3.3 添加点阵驱动

如图2.2所示,GC7219支持共阴点阵,各图像的数组定义如下代码片段

unsigned char jiandao_table[8][2] = {{0x01,0x24},{0x02,0x24},{0x03,0x24},{0x04,0x7E},{0x05,0x7E},{0x06,0x7E},{0x07,0x7E},{0x08,0x00}
};unsigned char shitou_table[8][2] = {{0x01,0x00},{0x02,0x40},{0x03,0x40},{0x04,0x7C},{0x05,0x7C},{0x06,0x7C},{0x07,0x7C},{0x08,0x00}
};unsigned char bu_table[8][2] = {{0x01,0x08},{0x02,0x1C},{0x03,0x1E},{0x04,0x1E},{0x05,0x5E},{0x06,0x7E},{0x07,0x7E},{0x08,0x00}
};

由zephr的API调用可知,其发送函数spi_write需要传入一个数据链表,然后会按照列表逐一发送相关数据,完整的代码如下:

/** SPDX-License-Identifier: Apache-2.0*/#include <kernel.h>
#include <string.h>
#include <errno.h>
#include <zephyr.h>
#include <sys/printk.h>
#include <device.h>
#include <drivers/spi.h>unsigned char work_state[2]={0x0C, 0x1};  // normal work mode
unsigned char test_state[2]={0x0F, 0x0};  // no test mode
unsigned char decode_cfg[2]={0x09, 0x0};  // no decode
unsigned char scan_range[2]={0x0B, 0x7};  // scan 0-7unsigned char jiandao_table[8][2] = {{0x01,0x24},{0x02,0x24},{0x03,0x24},{0x04,0x7E},{0x05,0x7E},{0x06,0x7E},{0x07,0x7E},{0x08,0x00}
};unsigned char shitou_table[8][2] = {{0x01,0x00},{0x02,0x40},{0x03,0x40},{0x04,0x7C},{0x05,0x7C},{0x06,0x7C},{0x07,0x7C},{0x08,0x00}
};unsigned char bu_table[8][2] = {{0x01,0x08},{0x02,0x1C},{0x03,0x1E},{0x04,0x1E},{0x05,0x5E},{0x06,0x7E},{0x07,0x7E},{0x08,0x00}
};#define TX_PACKAGE_MAX_CNT    8void main(void)
{int idx=0;const struct device *spi;struct spi_config spi_cfg = {0};struct spi_buf_set tx_set;unsigned char digit[2]={0};printk("spi master example\n");spi = DEVICE_DT_GET(DT_NODELABEL(spi0));if (!device_is_ready(spi)) {printk("SPI device %s is not ready\n", spi->name);return;}/* spi master 8bit, LSB first*/spi_cfg.operation = SPI_WORD_SET(8) | SPI_OP_MODE_MASTER | SPI_TRANSFER_MSB;spi_cfg.frequency = 5 * 1000000UL;/* Make spi transaction package buffers */struct spi_buf *tx_package = k_calloc(TX_PACKAGE_MAX_CNT, sizeof(struct spi_buf));if (tx_package == NULL) {printk("tx_package calloc failed\n");return;}/* Init 7219 */tx_package[0].buf = work_state;tx_package[0].len = 2;tx_package[1].buf = test_state;tx_package[1].len = 2;tx_package[2].buf = decode_cfg;tx_package[2].len = 2;tx_package[3].buf = scan_range;tx_package[3].len = 2;tx_set.buffers = tx_package;tx_set.count   = 4;printk("Init 7219 ...\n");spi_write(spi, &spi_cfg, &tx_set);do {k_msleep(1000);printk("spi master sending jiandao_table data ...\n");for (idx=0; idx<8; idx++) {digit[0]=jiandao_table[idx][0];digit[1]=jiandao_table[idx][1];tx_package[0].buf = digit;tx_package[0].len = 2;tx_set.buffers    = tx_package;tx_set.count      = 1;spi_write(spi, &spi_cfg, &tx_set);}k_msleep(1000);printk("spi master sending shitou_table data ...\n");for (idx=0; idx<8; idx++) {digit[0]=shitou_table[idx][0];digit[1]=shitou_table[idx][1];tx_package[0].buf = digit;tx_package[0].len = 2;tx_set.buffers    = tx_package;tx_set.count      = 1;spi_write(spi, &spi_cfg, &tx_set);}k_msleep(1000);printk("spi master sending bu_table data ...\n");for (idx=0; idx<8; idx++) {digit[0]=bu_table[idx][0];digit[1]=bu_table[idx][1];tx_package[0].buf = digit;tx_package[0].len = 2;tx_set.buffers    = tx_package;tx_set.count      = 1;spi_write(spi, &spi_cfg, &tx_set);}} while (1);
}

2.3.4 搭建AI工程

参考文档AI能力-视觉的相关步骤搭建AI工程,这里主要说明一下遇到的几个问题和注意事项。
1)因为此处使用的是最新git工程,所以打印可能与文档有出入,git版本和打印对应如下:

2)如果直接下载git工程编译升级,PC端工具无法正常使用,需要执行如下两条命令,参考连接一键拉取-sample-和-sdk-异常解决方法,然后再执行编译烧写操作。

lisa zep init-app
lisa zep update

3)基于Edge浏览器如果直接打开在线PC工具,点击"Windows系统"会出现404错误,所以建议直接下载pc工具工程到本地离线使用。

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

4)执行"lisa zep flash"后如果立即执行如下资源下载命令可能会失败,这时候建议拔插一下DAP口或者检查一下串口是否被占用。

经过上述步骤以后,通过PC端工具查看效果如下

2.3.5 识别和显示

将SPI-GC7219的工程和AI手势识别的工程融合在一起,程序流程如下:

三.效果展示

效果如下,机器会根据人类的出拳来出拳,用来给做简单的演示还是挺有意思的。

https://www.bilibili.com/video/BV1dg411n7wj​www.bilibili.com/video/BV1dg411n7wj

四.总结

整体体验下来,感觉聆思在SOM的易用性、接口的完整性、文档的丰富度、和支持的及时性上做的都不错,按照文档一步步做下来,很快就可以入门做一些简单的产品。美中不足的是目前聆思的AI训练和调参工具还没有面向大众开放,可能是因为技术性比较强,但因此少了一部分趣味性,在手势AI识别的demo中也能够感觉到光照和距离对识别的准确性影响很大,但是在如此低的功耗和性能下做到这样的程度已经很棒了。最后祝聆思科技的产品越做越棒,极术社区越做越大带给广大开发兴趣人员更多丰富的活动。

【聆思CSK6视觉AI开发套件试用】基于AI手势识别的剪子包袱锤游戏相关推荐

  1. 【聆思CSK6视觉AI开发套件试用】AI手势检测识别+编译Helloworld示例

    本篇文章来自极术社区与聆思科技组织的CSK6 视觉AI开发套件活动,更多开发板试用活动请关注极术社区网站.作者:Zeee 前言: 首先,感谢极术社区联合聆思科技给予宝贵的试用机会.借助本次对CSK6视 ...

  2. 【聆思CSK6 视觉AI开发套件试用】AI控制直流电机转速接口打通

    本篇文章来自极术社区与聆思科技组织的CSK6 视觉AI开发套件活动,更多开发板试用活动请关注极术社区网站.作者:oxlm 背景 在访问极术社区时,偶然发现聆思科技的CSK6开发板的评估活动,看CSK6 ...

  3. 【聆思CSK6 视觉AI开发套件试用】AI Demo试用

    本篇文章来自极术社区与聆思科技组织的CSK6 视觉AI开发套件活动,更多开发板试用活动请关注极术社区网站.作者:kings669669 AI套件外观 环境搭建 按照官网手册,我在Windows环境下遇 ...

  4. 【聆思CSK6 视觉AI开发套件试用】基于CSK6011a_nano的虚拟打砖块交互系统

    本篇文章来自极术社区与聆思科技组织的CSK6 视觉AI开发套件活动,更多开发板试用活动请关注极术社区网站.作者:马博 非常感谢极术社区和聆思科技提供的机会,加之前做过其他视觉模块的测试项目,于是尝试申 ...

  5. 【聆思CSK6 视觉AI开发套件试用】-手把手教你控制电磁继电器

    本篇文章来自极术社区与聆思科技组织的CSK6 视觉AI开发套件活动,更多开发板试用活动请关注极术社区网站.作者:追梦的人(IT大叔一枚) 一.前言 首先感谢极术社区与聆思科技的信任和支持,有幸参与到C ...

  6. 【聆思CSK6视觉AI开发套件试用】从部署工程师和测试工程师角度体验CSK6

    本篇文章来自极术社区与聆思科技组织的CSK6 视觉AI开发套件活动,更多开发板试用活动请关注极术社区网站.作者:cfx 1.体验(baipiao)之前 作为一个精通多种移动端AI框架(TFLite.A ...

  7. 【聆思CSK6 视觉AI开发套件试用】人脸识别和 tflite-micro 语音识别推理实验

    本篇文章来自极术社区与聆思科技组织的CSK6 视觉AI开发套件活动,更多开发板试用活动请关注极术社区网站.作者:SunnyCase 1. 前言 非常幸运得到这次测评 CSK6 视觉AI开发套件的机会, ...

  8. 【聆思CSK6 视觉AI开发套件试用】基于CSK6的头肩手势检测控制会议相机进行数字变焦

    本篇文章来自极术社区与聆思科技组织的CSK6 视觉AI开发套件活动,更多开发板试用活动请关注极术社区网站.作者:海锋 基于CSK6的头肩手势检测控制会议相机实现变倍功能 首先感谢极术社区与聆思科技的信 ...

  9. 【聆思CSK6 视觉AI开发套件试用】CSK6011与STM32F469I 开发板对比

    本篇文章来自极术社区与聆思科技组织的CSK6 视觉AI开发套件活动,更多开发板试用活动请关注极术社区网站.作者:冷山 1. 引言 非常感谢极术社区和聆思科技提供的这次试用机会,让我再一次被幸运击中,因 ...

最新文章

  1. Mongodb数据分片的实现
  2. SAP 几款容易令初学者混淆的 HANA 解决方案
  3. Ubuntu使用VNC运行基于Docker的桌面系统
  4. 利用linux shell自己主动顶贴
  5. java 实现协方差_无监督数据降维技术-主成分分析(PCA)的Python实现
  6. scala之Akka的Actor模型(上)
  7. Docker安装宝塔没想到竟然如此之简单~
  8. 拜托,面试别再问我堆(排序)了!
  9. C/C++[codeup 1805]首字母大写
  10. head first JavaScript pdf 下载
  11. java中的类是什么_java中类是什么意思
  12. SSM+MySQL实现在线考试系统(含源码、MySQL、文档,包运行)
  13. 解决state_enabled=false 不起作用的
  14. linux清华源地址,pip清华镜像源使用方法总结
  15. 基于Java坦克大战小游戏设计(3)
  16. Power BI 字符串填充一些特定的字符补齐位数
  17. 请问?外包到腾讯工作是怎样一种体验?
  18. 正则化最小二乘法——神经网络与机器学习笔记2
  19. C# 将Base64转换为图片并保存到Image数组
  20. git-scm教程摘要

热门文章

  1. 查游戏台式计算机软件的工具,怎么查看电脑配置是否达到游戏要求
  2. Js jQuery Ajax 群成立了
  3. 犬夜叉手游觉醒服务器维护,《犬夜叉-觉醒》最详细最容易入门新手指导
  4. Rootkit原理——ROOTKIT ON LINUX X86 V2.6
  5. 我国经济最强的城市是哪个?北京、上海、还是深圳?
  6. idea 使用Maven 打包本地jar包及引用第三方jar包
  7. 乒乓球十一分制比赛规则_乒乓球比赛11 分制规定
  8. Autoit3 安装
  9. 【搬家】WebChat网络聊天室开发笔记
  10. jmeter - perfMon性能监控