找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 15117|回復(fù): 6
收起左側(cè)

2018TI杯大學(xué)生電子設(shè)計(jì)競賽FDC2214手勢識(shí)別設(shè)計(jì)報(bào)告

  [復(fù)制鏈接]
ID:240626 發(fā)表于 2018-8-2 11:56 | 顯示全部樓層 |閱讀模式
拿了省賽2等獎(jiǎng)
2018年大學(xué)生電子實(shí)驗(yàn)競賽

手勢識(shí)別裝置(D題)


手勢識(shí)別裝置

摘   要


    隨著時(shí)代的發(fā)展與科學(xué)技術(shù)的廣泛應(yīng)用,現(xiàn)代化科技化的生活理念也越來越多的被人們所接受,高科技為人們帶來了很多方便,利用科技手段解決生活生產(chǎn)中的實(shí)際問題也就成了當(dāng)今科技開發(fā)者們的共同話題。

    本項(xiàng)目利用傳感芯片 FDC2214 設(shè)計(jì)制作一個(gè)手勢識(shí)別裝置, 實(shí)現(xiàn)對猜拳游

戲和劃拳游戲的判決, 裝置具有訓(xùn)練和判決兩種工作模式。在判決模式下實(shí)驗(yàn)裝置能對指定人員進(jìn)行猜拳游戲和劃拳游戲的判決,主要是對手勢比劃“石頭”、

“剪刀”和“布”的判定,劃拳游戲的判定是指手勢比劃“1”、“2”、“3”、“4”和“5”的判定;而在訓(xùn)練模式下能對任意人員進(jìn)行猜拳游戲和劃拳游戲的手勢訓(xùn)練,經(jīng)過有限次訓(xùn)練后,能進(jìn)行正確的猜拳游戲和劃拳游戲的手勢判決。

目  錄
  • 系統(tǒng)方案.....................................................3
1.1 系統(tǒng)總體構(gòu)成...................................................3
1.2 系統(tǒng)總體實(shí)現(xiàn)方案...............................................3
1.3具體實(shí)現(xiàn)方案...................................................3
  • 電路與程序設(shè)計(jì)...............................................5
2.1 硬件實(shí)現(xiàn)原理...................................................5
2.1.1 整體原理.....................................................5
2.1.2 2214芯片.....................................................6
2.1.3 15單片機(jī).....................................................7
2.2 軟件設(shè)計(jì)流程圖.................................................8
  • 測試方法及結(jié)果...............................................8
3.1 題目一的系統(tǒng)測試...............................................8
3.2 題目二的系統(tǒng)測試...............................................8
附錄 文章組成程序................................,.................9
參考文獻(xiàn)..........................................................17



第一章  系統(tǒng)方案

1.1 系統(tǒng)總體構(gòu)成

本實(shí)驗(yàn)主要由傳感芯片 FDC2214,最小系統(tǒng)版,降壓模塊,OLED,銅板組成。系統(tǒng)總體構(gòu)成如圖1-1所示。

                       

                                        

                        

圖1-1  系統(tǒng)總體構(gòu)成圖

1.2 系統(tǒng)總體實(shí)現(xiàn)方

以銅板作為導(dǎo)體材質(zhì),由于DC2214 是基于 LC 諧振電路原理的一個(gè)電容檢測傳感器,所以利用 FDC2214 的工作原理可實(shí)現(xiàn)手勢接近和識(shí)別的功能。當(dāng)人手接近該導(dǎo)體傳感平面時(shí),傳感端的電容發(fā)生了變化,這就會(huì)導(dǎo)致 LC 電路振蕩頻率的變化,從而反映出手勢接近,以及手勢的判定。

1.3具體實(shí)現(xiàn)方

針對于主控芯片:可以實(shí)現(xiàn)數(shù)據(jù)檢測的單片機(jī)有多種,比如STM32,TI公司的MSP5229以及STC公司系列。結(jié)合數(shù)據(jù)處理情況以及芯片使用難度,我們選擇STC15F2K60S2芯片,其性能符合要求且編程簡單。

從手勢識(shí)別方面講:關(guān)于手勢動(dòng)作捕捉主要是通過光學(xué)和傳感器兩種方式來實(shí)現(xiàn)。手勢識(shí)別推測的算法,包括模板匹配技術(shù)(二維手勢識(shí)別技術(shù)使用的)、通過統(tǒng)計(jì)樣本特征以及深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)。而常見的紅外識(shí)別解析度低,易受干擾,成本高,維護(hù)困難,而2214可以在任意環(huán)境下實(shí)現(xiàn)接近度感測,成本低,在波動(dòng)的條件下,可以穩(wěn)定的顯示預(yù)期效果。故而我們選擇使用2214芯片。

從數(shù)據(jù)通信方面來講:芯片間的通信只能使用I2C協(xié)議,可以采用有限傳輸和無線傳輸兩種方式?紤]到FDC2214芯片靈敏度極高,無線協(xié)議會(huì)產(chǎn)生較大干擾使結(jié)果不準(zhǔn)確,因此采用有線傳輸?shù)腎2C協(xié)議傳輸。

最后,通過修改試驗(yàn)程序進(jìn)一步對實(shí)驗(yàn)數(shù)據(jù)進(jìn)行調(diào)試,從而達(dá)到完美的數(shù)據(jù)范圍結(jié)果,完成訓(xùn)練部分。再通過最初將手的大致輪廓畫在銅板上,再將寫好的程序下載到指定位置,通過比出的手勢在對數(shù)據(jù)進(jìn)一步精準(zhǔn)化,進(jìn)而完成實(shí)驗(yàn)。


電路與程序設(shè)計(jì)

2.1 硬件實(shí)現(xiàn)原理

2.1.1 整體原理

手勢識(shí)別裝置采用15單片機(jī)做為主控制器,其整體原理圖如圖2-1所示。PCB圖如圖如圖2-2 。

圖2-1 整體原理圖

圖2-2  PCB圖

2.1.2   2214芯片

FDC2214 是基于 LC 諧振電路原理的一個(gè)電容檢測傳感器。在芯片每個(gè)檢測通道的輸入端連接一個(gè)電感和電容,組成LC電路,被測電容傳感端與 LC 電路相連接,將產(chǎn)生一個(gè)振蕩頻率,根據(jù)該頻率值可計(jì)算出被測電容值。



圖2-3

2.1.3  15單片機(jī)

主控采用STC15系列單片機(jī)最小系統(tǒng),原理圖如3-1所示.

圖 3-1

2.2軟件設(shè)計(jì)流程圖








第三章 系統(tǒng)測試





    • 題目一的系統(tǒng)測試

裝置工作在判決模式下,能對參賽者指定人員進(jìn)行猜拳判決,給出手勢“石頭”、“剪刀”和“布”的準(zhǔn)確判決,要求每一次判決的時(shí)間不大于 1 秒。測試結(jié)果見表3-1。

試驗(yàn)項(xiàng)目

數(shù)據(jù)范圍

完成情況

石頭

[9-12] [0-1] [0-1] [0-1]

剪刀

[7-11] [0-1] [0-2] [2-3]

[11-14] [1-2] [1-2] [5-8]

表3-1 測試結(jié)果表

3.2 題目二的系統(tǒng)測試

裝置工作在判決模式下,能對參賽者指定人員進(jìn)行劃拳判決,給出手勢“1”、“2”、“3”、“4”和“5”的準(zhǔn)確判決,要求每一次判決的時(shí)間不大于 1秒。測試結(jié)果見表3-2。

試驗(yàn)項(xiàng)目

數(shù)據(jù)范圍

完成情況

1

[10-11] [0-1] [0-1] [1-2]

2

[7-9] [-1-1] [-1-1] [2-3]

3

[8-9] [0-1] [1-2] [3-4]

4

[9-11] [0-1] [1-2] [5-6]

5

[11-14] [1-2] [1-2] [6-8]

表3-2 測試結(jié)果表

附錄

該實(shí)驗(yàn)所涉及的主要程序

  1. #include<FDC2214.C>

  2. #include<oled7.c>

  3.               unsigned char str1[1];

  4.                             unsigned char q[9]="0       ",k=0,w=0,l=0;

  5. float te0,te1;

  6. float xdata shitou1,shitou2,shitou3,shitou4,shitou5,shitou6,shitou7,shitou8;

  7. float xdata jian1,jian2,jian3,jian4,jian5,jian6,jian7,jian8;

  8. float xdata bu1,bu2,bu3,bu4,bu5,bu6,bu7,bu8;

  9. float xdata one1,one2,one3,one4,one5,one6,one7,one8,one9,one10,one11,one12;

  10. float xdata tw1,tw2,tw3,tw4,tw5,tw6,tw7,tw8,tw9,tw10,tw11,tw12;

  11. float xdata th1,th2,th3,th4,th5,th6,th7,th8,th9,th10,th11,th12;

  12. float xdata fo1,fo2,fo3,fo4,fo5,fo6,fo7,fo8,fo9,fo10,fo11,fo12;

  13. float xdata fi1,fi2,fi3,fi4,fi5,fi6,fi7,fi8,fi9,fi10,fi11,fi12;

  14. void dushu()

  15. {

  16.               temp1 = ReadRegfdc2214(0x00);

  17. temp2 = ReadRegfdc2214(0x02);

  18. temp3 = ReadRegfdc2214(0x04);

  19. temp4 = ReadRegfdc2214(0x06);

  20.                                           DelayMS(100);

  21.                             temp1= (aemp1-temp1);

  22.                             temp2= (aemp2-temp2);

  23.                             temp3= (aemp3-temp3);

  24.                             temp4= (aemp4-temp4);

  25. }

  26. void keyscan()

  27. {

  28.                                           if(P20==0)

  29.                             {

  30.                                           DelayMS(2);

  31.                                           if(P20==0)

  32.                                           {

  33.                                                                       k+=1;

  34.                                                         if(k>=3)

  35.                                                         {k=0;}

  36.                                                         while(P20==0);

  37.                                           }

  38.                             }

  39.                             if(k==3)

  40.                             {

  41.                                           if(P24==0)

  42.                             {

  43.                                           DelayMS(2);

  44.                                           if(P24==0)

  45.                                           {

  46.                                                                       w+=1;

  47.                                                         if(w>=4)

  48.                                                         {w=0;}

  49.                                                         while(P24==0);

  50.                                           }

  51.                             }

  52.               }

  53.                             if(P26==0)

  54.               {              DelayMS(2);

  55.                             if(P26==0)

  56.                             {l=1;}

  57.               }

  58. }

  59. void main()

  60. {

  61.                             P4M0=0X00;

  62.               P4M1=0X00;

  63.                                           P1M0=0X00;

  64.               P1M1=0X00;

  65.                                                         P5M0=0X00;

  66.               P5M1=0X00;

  67.                                                                       P2M0=0X00;

  68.               P2M1=0X00;

  69.                 LCD_CS= 0;

  70. LCD_Init();

  71.                 LCD_Fill(0xff);

  72.               DelayMS(100);

  73.   LCD_Fill(0x00);

  74.               DelayMS(100);   

  75.   LCD_CLS();

  76.                             delay_ms(500);

  77.               InitMultifdc2214();

  78.                             delay_ms(150);

  79.                 aemp1= ReadRegfdc2214(0x00);            

  80.     aemp2= ReadRegfdc2214(0x02);            

  81.                 aemp3= ReadRegfdc2214(0x04);            

  82.                 aemp4= ReadRegfdc2214(0x06);            

  83. while(1)

  84.               {

  85. dushu();

  86. lcd_printf(buf1, (int)temp1);

  87. lcd_printf(buf2, (int)temp2);

  88. lcd_printf(buf3, (int)temp3);                           

  89. lcd_printf(buf4, (int)temp4);

  90.               /*              LCD_P6x8Str(6,1,"CH1:");

  91.                             LCD_P6x8Str(40,1,buf1);

  92.                  LCD_P6x8Str(6,2,"CH2:");

  93.                 LCD_P6x8Str(40,2,buf2);

  94.                  LCD_P6x8Str(6,3,"CH3:");

  95.                 LCD_P6x8Str(40,3,buf3);

  96.                             LCD_P6x8Str(6,4,"CH4:");

  97.                 LCD_P6x8Str(40,4,buf4);*/

  98.                             delay_ms(100);

  99.                             q[0]=k+0x30;//q[2]=w+0x30;

  100.                                           keyscan();

  101.                             if(l==1)

  102.                             {LCD_Fill(0x00);

  103.                                           DelayMS(100);

  104.                             l=0;}

  105.                             if(k==0)

  106.                             {LCD_P6x8Str(6,0,"Please start!");

  107.                             LCD_P6x8Str(6,1,"CH1:");

  108.                             LCD_P6x8Str(40,1,buf1);

  109.                  LCD_P6x8Str(6,2,"CH2:");

  110.                 LCD_P6x8Str(40,2,buf2);

  111.                  LCD_P6x8Str(6,3,"CH3:");

  112.                 LCD_P6x8Str(40,3,buf3);

  113.                             LCD_P6x8Str(6,4,"CH4:");

  114.                 LCD_P6x8Str(40,4,buf4);}

  115.                             //else

  116.               /* {LCD_P6x8Str(6,1,"        ");

  117.                             LCD_P6x8Str(40,1,"        " );

  118.                  LCD_P6x8Str(6,2,"        ");

  119.                 LCD_P6x8Str(40,2,"        ");

  120.                  LCD_P6x8Str(6,3,"         ");

  121.                 LCD_P6x8Str(40,3,"        ");

  122.                             LCD_P6x8Str(6,4,"         ");

  123.                 LCD_P6x8Str(40,4,"        ");

  124.                             LCD_P6x8Str(6,0,"Type:  ");//6,4

  125.                             LCD_P6x8Str(40,0,q);//40,4

  126.     }*/

  127.               keyscan();

  128.                             if(l==1)

  129.                             {LCD_Fill(0x00);

  130.                                           DelayMS(100);

  131.                             l=0;}

  132.               if(k==1)

  133.               {            

  134.                             LCD_P14x16Ch(0,0,6);

  135.                             LCD_P14x16Ch(18,0,7);

  136.                             if((temp1)>=10&&(temp1)<=14&&(temp2)>=1&&(temp2)<=2&&(temp3)>=1&&(temp3)<=2&&(temp4)>=5&&(temp4)<=8)

  137.                             {

  138.                                           //LCD_P8x16Str(6,5,"bu      ");

  139.                                           LCD_P14x16Ch(6,5,0);

  140.                                           LCD_P14x16Ch(24,5,5);

  141.                                           LCD_P14x16Ch(24,12,5);

  142.                             }

  143.                             if((temp1)>=9&&(temp1)<=12&&(temp2)>=0&&(temp2)<=1&&(temp3)>=0&&(temp3)<=1&&(temp4)>=0&&(temp4)<=1)

  144.                             {

  145.                                           //LCD_P8x16Str(6,5,"shitou  ");

  146.                                           LCD_P14x16Ch(6,5,1);

  147.                                           LCD_P14x16Ch(25,5,2);

  148.                             }

  149.                             if((temp1)>=7&&(temp1)<=11&&(temp2)>=0&&(temp2)<=1&&(temp3)>=0&&(temp3)<=2&&(temp4)>=2&&(temp4)<=3)

  150.                             {

  151.                                           //LCD_P8x16Str(6,5,"jiandao");

  152.                                           LCD_P14x16Ch(6,5,3);

  153.                                           LCD_P14x16Ch(25,5,4);

  154.                             }

  155.                             if((temp1)>=-1&&(temp1)<=1&&(temp2)>=-1&&(temp2)<=1&&(temp3)>=-1&&(temp3)<=1&&(temp4)>=-1&&(temp4)<=1)

  156.                             {

  157.                                           LCD_P8x16Str(6,5,"          ");

  158.                             }

  159.               }

  160. //********************************************************

  161.                             keyscan();

  162.                             if(l==1)

  163.                             {LCD_Fill(0x00);

  164.                                           DelayMS(100);

  165.                             l=0;}

  166.               if(k==2)

  167.               {

  168.                             LCD_P14x16Ch(0,0,8);

  169.                             LCD_P14x16Ch(18,0,7);

  170.                             if((temp1)>=11&&(temp1)<=14&&(temp2)>=1&&(temp2)<=2&&(temp3)>=1&&(temp3)<=2&&(temp4)>=6&&(temp4)<=8)

  171.                             {

  172.                                           LCD_P8x16Str(13,6,"5");

  173.                             }

  174.                             if((temp1)>=9&&(temp1)<=11&&(temp2)>=0&&(temp2)<=1&&(temp3)>=1&&(temp3)<=2&&(temp4)>=5&&(temp4)<=6)

  175.                             {

  176.                                           LCD_P8x16Str(13,6,"4");

  177.                             }

  178.                             if((temp1)>=8&&(temp1)<=9&&(temp2)>=0&&(temp2)<=1&&(temp3)>=1&&(temp3)<=2&&(temp4)>=3&&(temp4)<=4)

  179.                             {

  180.                                           LCD_P8x16Str(13,6,"3");

  181.                             }

  182.                             if((temp1)>=7&&(temp1)<=9&&(temp2)>=-1&&(temp2)<=1&&(temp3)>=-1&&(temp3)<=1&&(temp4)>=2&&(temp4)<=3)

  183.                             {

  184.                                           LCD_P8x16Str(13,6,"2");

  185.                             }

  186.                             if((temp1)>=10&&(temp1)<=11&&(temp2)>=0&&(temp2)<=1&&(temp3)>=0&&(temp3)<=1&&(temp4)>=1&&(temp4)<=2)

  187.                             {

  188.                                           LCD_P8x16Str(13,6,"1");

  189.                             }

  190.                                           if((temp1)>=-1&&(temp1)<=1&&(temp2)>=-1&&(temp2)<=1&&(temp3)>=-1&&(temp3)<=1&&(temp4)>=-1&&(temp4)<=1)

  191.                             {

  192.                                           LCD_P8x16Str(6,5,"                          ");

  193.                             }

  194.               }


  195. }

  196.               }
復(fù)制代碼

參考文獻(xiàn)

[1]黃智偉,全國大學(xué)生電子設(shè)計(jì)競賽訓(xùn)練教程【M】,北京:電子工業(yè)出版社,2010。

[2]王成智,鄒旭東,許赟,等.采用改進(jìn)重復(fù)控制的大功率電力電子負(fù)載.中國電機(jī)工程學(xué)報(bào),2009,29(12):1~9
[3]Madawala U K,Thrimawithana D J,Nihal K.An ICPT-supercapacitor Eletronics,2007,54(6):3287~3297
[4]戴忠達(dá).自動(dòng)控制理論基礎(chǔ)[M].北京:清華大學(xué)出版社,2001
[5]劉豹.現(xiàn)代控制理論[M].北京:機(jī)械工業(yè)出版社,1992
[6]李建林,王立喬,李彩霞,等.基于現(xiàn)場可編程門陣列的多路PWM波形發(fā)生器.中國電機(jī)工程學(xué)報(bào),2005,25(10):55~59
[7]馬彧.數(shù)字電路與系統(tǒng)實(shí)驗(yàn)教程[M].北京:北京郵電大學(xué)出版社,2008

[8]楊光祥,梁華,朱軍. STM32單片機(jī)原理與工程實(shí)踐[M].武漢:武漢理工大學(xué)出版社,2013



完整的Word格式文檔51黑下載地址:
CIDUT--09.doc (14.79 MB, 下載次數(shù): 213)
CIDUT--05.doc (3.29 MB, 下載次數(shù): 122)


評(píng)分

參與人數(shù) 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:396406 發(fā)表于 2018-9-24 12:52 | 顯示全部樓層
就不能把代碼分享出來嗎?樓主
回復(fù)

使用道具 舉報(bào)

ID:410674 發(fā)表于 2018-11-19 22:18 | 顯示全部樓層
來學(xué)習(xí)一下
回復(fù)

使用道具 舉報(bào)

ID:23397 發(fā)表于 2019-8-7 14:39 | 顯示全部樓層
學(xué)習(xí)學(xué)習(xí),資料全嗎
回復(fù)

使用道具 舉報(bào)

ID:596698 發(fā)表于 2019-8-8 22:09 | 顯示全部樓層
感謝分享
回復(fù)

使用道具 舉報(bào)

ID:508119 發(fā)表于 2019-9-19 11:08 | 顯示全部樓層
大佬還在嗎,初學(xué)者有幾個(gè)疑問想咨詢一下可以嗎?
回復(fù)

使用道具 舉報(bào)

ID:511461 發(fā)表于 2019-10-12 19:00 | 顯示全部樓層
大佬,可不可以分享一下源程序
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表