本文來自極術(shù)社區(qū)聆思CSK6視覺AI開發(fā)套件試用活動(dòng)文章。作者用聆思CSK6芯片支持的手勢(shì)識(shí)別能力結(jié)合8X8點(diǎn)陣實(shí)現(xiàn)一款剪子包袱錘的游戲。
一 開發(fā)環(huán)境搭建
1.1 硬件環(huán)境
如下圖所示,本次產(chǎn)品有聆思的CSK6011-NanoKit視覺開發(fā)套件和8*8點(diǎn)陣組成,CSK6011-NanoKit負(fù)責(zé)手勢(shì)的識(shí)別,點(diǎn)陣負(fù)責(zé)圖形的顯示,兩者通過SPI總線連接在一起。
1.2 軟件環(huán)境
軟件開發(fā)環(huán)境搭建可以參考CSK6環(huán)境搭建,聆思很貼心的提供了完整的打包開發(fā)環(huán)境,利用lisa工具可以完成項(xiàng)目的創(chuàng)建、編譯和下載,此外廠商還基于VSCODE插件的方式提供了完整的IDE開發(fā)環(huán)境。
二 點(diǎn)陣的使用
2.1 硬件連接
8x8點(diǎn)陣的主控是GC7219(完全兼容MAX7219),其典型的應(yīng)用圖如下所示:
芯片可以通過GPIO或者SPI來驅(qū)動(dòng),官方提供了SPI的參考demo,本次將基于其實(shí)現(xiàn)對(duì)點(diǎn)陣的控制。將GC7219(點(diǎn)陣)與CSK6011的SPI0連接,利用板載的3.3V管腳供電,相關(guān)管腳的連接示意圖如下:
2.2 圖標(biāo)建模
由于CSK6011目前支持5種手勢(shì),分別為L(zhǎng)IKE()、OK()、STOP()、YES()、SIX(),采用相似原則,取LIKE=錘,STOP=包袱,YES=剪刀。相關(guān)示圖標(biāo)建模(共陰)如下:
2.3 驅(qū)動(dòng)開發(fā)
2.3.1 建立SPI開發(fā)工程
參見SPI參考工程的實(shí)現(xiàn),搭建SPI驅(qū)動(dòng)開發(fā)工程。
2.3.2 GC7219的適配
由GC7219的手冊(cè)可知,其支持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 添加點(diǎn)陣驅(qū)動(dòng)
如圖2.2所示,GC7219支持共陰點(diǎn)陣,各圖像的數(shù)組定義如下代碼片段。
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調(diào)用可知,其發(fā)送函數(shù)spi_write需要傳入一個(gè)數(shù)據(jù)鏈表,然后會(huì)按照列表逐一發(fā)送相關(guān)數(shù)據(jù),完整的代碼如下:
/* * SPDX-License-Identifier: Apache-2.0 */ #include#include #include #include #include #include #include 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-7 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} }; #define TX_PACKAGE_MAX_CNT 8 void 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 "); spi = DEVICE_DT_GET(DT_NODELABEL(spi0)); if (!device_is_ready(spi)) { printk("SPI device %s is not ready ", 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 "); 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 ... "); spi_write(spi, &spi_cfg, &tx_set); do { k_msleep(1000); printk("spi master sending jiandao_table data ... "); 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 ... "); ? ? ? ?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 ... "); ? ? ? ?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能力-視覺的相關(guān)步驟搭建AI工程,這里主要說明一下遇到的幾個(gè)問題和注意事項(xiàng)。
1)因?yàn)榇颂幨褂玫氖?a href="http://m.hljzzgx.com/article/zt/" target="_blank">最新git工程,所以打印可能與文檔有出入,git版本和打印對(duì)應(yīng)如下:
2)如果直接下載git工程編譯升級(jí),PC端工具無法正常使用,需要執(zhí)行如下兩條命令,參考連接一鍵拉取-sample-和-sdk-異常解決方法,然后再執(zhí)行編譯燒寫操作。
lisa zep init-app lisa zep update
3)基于Edge瀏覽器如果直接打開在線PC工具,點(diǎn)擊"Windows系統(tǒng)"會(huì)出現(xiàn)404錯(cuò)誤,所以建議直接下載pc工具工程到本地離線使用。
git clone https://cloud.listenai.com/zephyr/applications/csk_view_finder_spd.git
4)執(zhí)行"lisa zep flash"后如果立即執(zhí)行如下資源下載命令可能會(huì)失敗,這時(shí)候建議拔插一下DAP口或者檢查一下串口是否被占用。
經(jīng)過上述步驟以后,通過PC端工具查看效果如下:
2.3.5 識(shí)別和顯示
將SPI-GC7219的工程和AI手勢(shì)識(shí)別的工程融合在一起,程序流程如下:
三 效果展示
效果如下,機(jī)器會(huì)根據(jù)人類的出拳來出拳,用來給做簡(jiǎn)單的演示還是挺有意思的。
四 總結(jié)
整體體驗(yàn)下來,感覺聆思在SOM的易用性、接口的完整性、文檔的豐富度、和支持的及時(shí)性上做的都不錯(cuò),按照文檔一步步做下來,很快就可以入門做一些簡(jiǎn)單的產(chǎn)品。美中不足的是目前聆思的AI訓(xùn)練和調(diào)參工具還沒有面向大眾開放,可能是因?yàn)榧夹g(shù)性比較強(qiáng),但因此少了一部分趣味性,在手勢(shì)AI識(shí)別的demo中也能夠感覺到光照和距離對(duì)識(shí)別的準(zhǔn)確性影響很大,但是在如此低的功耗和性能下做到這樣的程度已經(jīng)很棒了。最后祝聆思科技的產(chǎn)品越做越棒,極術(shù)社區(qū)越做越大帶給廣大開發(fā)興趣人員更多豐富的活動(dòng)。
轉(zhuǎn)自 | 安謀科技學(xué)堂
審核編輯:湯梓紅
-
手勢(shì)識(shí)別
+關(guān)注
關(guān)注
8文章
225瀏覽量
47784 -
AI
+關(guān)注
關(guān)注
87文章
30571瀏覽量
268777 -
開發(fā)環(huán)境
+關(guān)注
關(guān)注
1文章
223瀏覽量
16607 -
GPIO
+關(guān)注
關(guān)注
16文章
1200瀏覽量
52032 -
開發(fā)套件
+關(guān)注
關(guān)注
2文章
153瀏覽量
24271
原文標(biāo)題:【聆思CSK6視覺AI開發(fā)套件試用】基于AI手勢(shì)識(shí)別的剪子包袱錘游戲
文章出處:【微信號(hào):Ithingedu,微信公眾號(hào):安芯教育科技】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論