找回密码
 立即注册

QQ登录

只需一步,快速开始

帖子
查看: 15182|回复: 6
收起左侧

2018TI杯大学生电子设计竞赛FDC2214手势识别设计报告

  [复制链接]
ID:240626 发表于 2018-8-2 11:56 | 显示全部楼层 |阅读模式
拿了省赛2等奖
2018年大学生电子实验竞赛

手势识别装置(D题)


手势识别装置

摘   要


    随着时代的发展与科学技术的广泛应用,现代化科技化的生活理念也越来越多的被人们所接受,高科技为人们带来了很多方便,利用科技手段解决生活生产中的实际问题也就成了当今科技开发者们的共同话题。

    本项目利用传感芯片 FDC2214 设计制作一个手势识别装置, 实现对猜拳游

戏和划拳游戏的判决, 装置具有训练和判决两种工作模式。在判决模式下实验装置能对指定人员进行猜拳游戏和划拳游戏的判决,主要是对手势比划“石头”、

“剪刀”和“布”的判定,划拳游戏的判定是指手势比划“1”、“2”、“3”、“4”和“5”的判定;而在训练模式下能对任意人员进行猜拳游戏和划拳游戏的手势训练,经过有限次训练后,能进行正确的猜拳游戏和划拳游戏的手势判决。

目  录
  • 系统方案.....................................................3
1.1 系统总体构成...................................................3
1.2 系统总体实现方案...............................................3
1.3具体实现方案...................................................3
  • 电路与程序设计...............................................5
2.1 硬件实现原理...................................................5
2.1.1 整体原理.....................................................5
2.1.2 2214芯片.....................................................6
2.1.3 15单片机.....................................................7
2.2 软件设计流程图.................................................8
  • 测试方法及结果...............................................8
3.1 题目一的系统测试...............................................8
3.2 题目二的系统测试...............................................8
附录 文章组成程序................................,.................9
参考文献..........................................................17



第一章  系统方案

1.1 系统总体构成

本实验主要由传感芯片 FDC2214,最小系统版,降压模块,OLED,铜板组成。系统总体构成如图1-1所示。

                       

                                        

                        

图1-1  系统总体构成图

1.2 系统总体实现方

以铜板作为导体材质,由于DC2214 是基于 LC 谐振电路原理的一个电容检测传感器,所以利用 FDC2214 的工作原理可实现手势接近和识别的功能。当人手接近该导体传感平面时,传感端的电容发生了变化,这就会导致 LC 电路振荡频率的变化,从而反映出手势接近,以及手势的判定。

1.3具体实现方

针对于主控芯片:可以实现数据检测的单片机有多种,比如STM32,TI公司的MSP5229以及STC公司系列。结合数据处理情况以及芯片使用难度,我们选择STC15F2K60S2芯片,其性能符合要求且编程简单。

从手势识别方面讲:关于手势动作捕捉主要是通过光学和传感器两种方式来实现。手势识别推测的算法,包括模板匹配技术(二维手势识别技术使用的)、通过统计样本特征以及深度学习神经网络。而常见的红外识别解析度低,易受干扰,成本高,维护困难,而2214可以在任意环境下实现接近度感测,成本低,在波动的条件下,可以稳定的显示预期效果。故而我们选择使用2214芯片。

从数据通信方面来讲:芯片间的通信只能使用I2C协议,可以采用有限传输和无线传输两种方式。考虑到FDC2214芯片灵敏度极高,无线协议会产生较大干扰使结果不准确,因此采用有线传输的I2C协议传输。

最后,通过修改试验程序进一步对实验数据进行调试,从而达到完美的数据范围结果,完成训练部分。再通过最初将手的大致轮廓画在铜板上,再将写好的程序下载到指定位置,通过比出的手势在对数据进一步精准化,进而完成实验。


电路与程序设计

2.1 硬件实现原理

2.1.1 整体原理

手势识别装置采用15单片机做为主控制器,其整体原理图如图2-1所示。PCB图如图如图2-2 。

图2-1 整体原理图

图2-2  PCB图

2.1.2   2214芯片

FDC2214 是基于 LC 谐振电路原理的一个电容检测传感器。在芯片每个检测通道的输入端连接一个电感和电容,组成LC电路,被测电容传感端与 LC 电路相连接,将产生一个振荡频率,根据该频率值可计算出被测电容值。



图2-3

2.1.3  15单片机

主控采用STC15系列单片机最小系统,原理图如3-1所示.

图 3-1

2.2软件设计流程图








第三章 系统测试





    • 题目一的系统测试

装置工作在判决模式下,能对参赛者指定人员进行猜拳判决,给出手势“石头”、“剪刀”和“布”的准确判决,要求每一次判决的时间不大于 1 秒。测试结果见表3-1。

试验项目

数据范围

完成情况

石头

[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 测试结果表

3.2 题目二的系统测试

装置工作在判决模式下,能对参赛者指定人员进行划拳判决,给出手势“1”、“2”、“3”、“4”和“5”的准确判决,要求每一次判决的时间不大于 1秒。测试结果见表3-2。

试验项目

数据范围

完成情况

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 测试结果表

附录

该实验所涉及的主要程序

  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.               }
复制代码

参考文献

[1]黄智伟,全国大学生电子设计竞赛训练教程【M】,北京:电子工业出版社,2010。

[2]王成智,邹旭东,许赟,等.采用改进重复控制的大功率电力电子负载.中国电机工程学报,2009,29(12):1~9
[3]Madawala U K,Thrimawithana D J,Nihal K.An ICPT-supercapacitor Eletronics,2007,54(6):3287~3297
[4]戴忠达.自动控制理论基础[M].北京:清华大学出版社,2001
[5]刘豹.现代控制理论[M].北京:机械工业出版社,1992
[6]李建林,王立乔,李彩霞,等.基于现场可编程门阵列的多路PWM波形发生器.中国电机工程学报,2005,25(10):55~59
[7]马彧.数字电路与系统实验教程[M].北京:北京邮电大学出版社,2008

[8]杨光祥,梁华,朱军. STM32单片机原理与工程实践[M].武汉:武汉理工大学出版社,2013



完整的Word格式文档51黑下载地址:
CIDUT--09.doc (14.79 MB, 下载次数: 213)
CIDUT--05.doc (3.29 MB, 下载次数: 122)


评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

举报

ID:396406 发表于 2018-9-24 12:52 | 显示全部楼层
就不能把代码分享出来吗?楼主
回复

举报

ID:410674 发表于 2018-11-19 22:18 | 显示全部楼层
来学习一下
回复

举报

ID:23397 发表于 2019-8-7 14:39 | 显示全部楼层
学习学习,资料全吗
回复

举报

ID:596698 发表于 2019-8-8 22:09 | 显示全部楼层
感谢分享
回复

举报

ID:508119 发表于 2019-9-19 11:08 | 显示全部楼层
大佬还在吗,初学者有几个疑问想咨询一下可以吗?
回复

举报

ID:511461 发表于 2019-10-12 19:00 | 显示全部楼层
大佬,可不可以分享一下源程序
回复

举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表