找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 12440|回复: 2
打印 上一主题 下一主题
收起左侧

单片机+FDC2214手势识别装置设计论文 电赛资料

[复制链接]
跳转到指定楼层
楼主
FDC2214手势识别装置

摘要


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


本次设计实现手势识别装置,通过人手接近传感端引起电容的变化来判决手势代表含义。该项目基于FDC2214芯片以及KEIL5开发平台,利用18μH电感、22PF电容构成LC谐振电路,设计开发一套手势识别装置,该手势识别装置可实现的模式有:训练和判决。判决模式分别对划拳游戏、猜拳游戏的准确判决;训练模式下根据检测员在有限次的训练后能有效的在判决模式下指出相应手势。该项目灵活的运用电容检测传感器和 LC 谐振电路对频率的控制,为智能化的识别系统提供了全新的设计理念。



目录

第一章 系统方案3
11 系统总体构成3
12 系统总体实现方案3
13 方案理论分析与计算4

第二章 系统硬件设计5
21 系统总体硬件结构5
22 系统总体硬件设计5
   23 电容检测模块硬件设计6
   24 单片机模块硬件设计7

第三章 系统软件设计8
31 系统总体软件设计8
32 电容检测模块软件设计9
33 单片机模块软件设计9

第四章 测试方案与测试结果10
41 测试方案10
42 测试结果10
421 题目一的系统测试结果10
422 题目二的系统测试结果11
423 题目三的系统测试结果12
424 题目四的系统测试结果12
425 新增输赢模式测试结果13
第五章 总结14参考文献15
附录 手势识别主程序16   

第一章:系统方案


1.1 系统总体构成

本次手势识别装置设计主要由IAP15W4K58S4最小系统板、FDC2214模块、OLED显示屏、测试所需极板组成系统总体构成实物图如图1-1


图1-1 系统总体构成实物图

1.2 系统总体实现方案

手势识别装置可实现两种模式:判决模式和训练模式。判决模式下分为划拳游戏和猜拳游戏极,划拳游戏根据极板检测到不同的手势,然后由电容检测传感器和LC谐振电路产生相应的频率值,根据频率值计算出各个手势对应的电容值,最后在OLED显示屏上显示相应的比划“1”,“2”,“3”,“4”,“5”,同理在猜拳游戏下,根据不同的电容幅值判定出“石头”,“剪刀”,“布”三种结果。训练模式同样分为划拳训练和猜拳训练两种测试,在任意一种模式下进行不大于三次的训练后,切换到判决模式对刚才训练的结果进行判定,此上为本次设计总体设计方案。

1.3 方案理论分析与计算


根据电容和频率的有着密切的曲线关系,在LC谐振电路中当在谐振点之前

电容回随着频率的增加而减少,在谐振点之后电容回随着频率的增加而增加,根

           Z=(ESR+jwL-j/wC)                   (1-1)

据公式(1-1)计算各个手势所对应的容抗,相应的一些干扰是不能避免的由电容计算公式 C=εS/4πkd 得出电容不只是受外界磁场的干扰,而且受极板的面积、直径、极板间的电阻、电感同时受引线中的电阻等等一系列不可避免的干扰,在此我们忽略这些干扰利用公式(1-2),因为利用FDC2214四个通道同时进行测值,可以减少误差达到目标预期效果,进行的计算实现判决、训练和输赢模式。

                            F=1/C                          (1-2)                              

第二章:系统硬件设计

2.1 总体硬件框图

设计硬件主要由测试者在测试版上测试不同手势,经FDC2214模块检测传送给主控芯片IAP15W4K58S4单片机,最后通信给OLED显示结果,以此重复测试,框图如2-1

图2-1 总体框图
2.2 硬件设计  
手势识别系统主要采用 IAP15W4K58S4 单片机为主控芯片,其原理图如图2-2、PCB图如图2-3


图2-2 原理图


图2-3 PCB图
2.3 电容检测模块硬件设计

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


图2-4 FDC2214模块电路图
2.4  单片机模块硬件设计

方案一:AT89S52单片机。AT89S52 是一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程Flash存储器。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。但是架构太简单,片上外设少,不适合本次使用。

方案二:STM32单片机。STM32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M3内核。STM32单片机程序都是模块化的,接口相对简单些,有一定的不足,比如串口中断标志位缺陷。

方案三:IAP15W4K58S4单片机(图2-5)。IAP15W4K58S4系列基于专为要求高性能、高速A/D转换、低成本、低功耗、片内有高达4KB的RAM数据存储空间、采用了增强型8051内核,比传统的8051速度快5~12倍。IAP15W4K58S4单片机程序都是模块化的,几乎包含了数据采集和控制中所需的所有单元模块,适合本次设计所需。

总结:综合比较上述几种方案,发现IAP15W4K58S4的性能最符合我们的题目控制要求,并且我们对IAP15W4K58S4单片机使用的经验,故决定采用方案三。

图2-5 IAP15W4K58S4单片机
  •    系统软件设计

3.1 软件总体设计


本次设计从大的角度观看分为两种模式:①判决模式、②训练模式;在电路接通后初始化成功,开始模式选择,对模式进行判决,假如选择一模式,进行判决模式,随机进入判决模式下的子模式:划拳和猜拳模式,在猜拳模式下判决“石头”、“剪刀”、“布”三种情况判决,在划拳模式下进行“1”、“2”、“3”、“4”、“5”五种情况判决,以上是选择模式一的环节;接下来选择模式二对系统进行训练,在训练模式下对其进行猜拳训练和划拳训练,对于猜拳训练不超过三次训练后进入判决模式下的猜拳验证,同理在划拳训练下对其进行不超过三次的训练,后回到模式一的划拳判别。以上就是本次手势识别装置总流程,具体流程图如图3-1

图3-1 流程图
3.2 电容检测模块软件设计

利用 FDC2214 的工作原理可实现手势接近和识别的功能,当人手接近该导体传感平面时,传感端的电容发生了变化,这就会导致 LC电路振荡频率的变化,从而反映出手势接近,以及手势的判定。如图3-2FDC2214核心程序


         
图3-2  FDC2214模块核心程序
3.3 单片机模块软件设计
IAP15W4K58S4单片机包含中央处理器、程序存储器、数据存储器、定时器I/O口、高速A/D转换、看门狗、超高速通信口1、2,1组高速同步串行口片内高精度R/C时钟和高可靠复位,拥有数据采集和控制中所需模块,在本次设计中运用此单片机再好不过。            
第四章:测试方案与测试结果
4.1测试方案

本次设计共实现四种功能猜拳判决、划拳判决、猜拳训练、划拳训练,在训练模式下对其进行不大于三次的手势训练,后跳入判决模式,进行对训练结果的检测。

对模式输出结果的判决,我们运用了 FDC2214 芯片四个通道,根据每种手势面积大小的不同,在 OLED 显示屏上将显示出面积换算后的值,进行多次实验测试(取不同大小的手掌和握拳方式)后取最大值、最小值的平均值,然后对每个通道取得的数值进行汇总,此时所得到一定的区间范围,这个范围代表一个手势的数值,测试时运用这个范围值对照测试员在 FDC2214 芯片四通道下输出的结果值来判断手势,由此可以准确测出测试人所展现的手势。

4.2 测试结果
4.2.1 题目一的系统测试结果

装置选择模式一工作在判决模式下,能对实验人员进行猜拳判决,给出不同的手势“石头”、“剪刀”和“布”检测出相应的频率值,计算出对应的电容范围对其进行准确的判别,对此每一次判决时间不超过 1 秒。测试结果如表4-1

表4-1 测试结果表

判决模式

猜拳游戏



测试项目

数据

时间(s)


通道1

通道2

通道3

通道4


石头

0~1

0~1

8~12

0~1

< 1

剪刀

1~3

1~3

8~12

0~1

< 1

4~6

4~6

9~13

1~3

< 1


4.2.2 题目二的系统测试结果

在题目一的测试结束后,需要将电路复位,重新选择装置模式一工作在判决模式下,对实验人员进行划拳判决,划拳包括“1”、“2”、“3”、“4”和“5”五种手势,每一次判决时间不超过1秒。测试结果如表4-2

表4-2 测试结果表

判决模式

划拳模式




测试项目

电容值

时间(s)


通道1

通道2

通道3

通道4


1

1~2

0~1

8~12

0~1

< 1

2

3~5

0~1

7~12

0~1

< 1

3

3~5

2~4

8~12

0~1

< 1

4

3~5

5~6

7~10

0~1

< 1

5

4~6

4~6

8~12

0~1

< 1






4.2.3 题目三的系统测试结果

经过模式一的测试,接下来装置选择模式二对其进行训练模式,在训练模式下首先选择猜拳训练,对任意测试者进行猜拳的手势训练,每种动作训练次数不大于 3 次,总的训练时间不大于 1 分钟;然后切换工作模式到模式一判决模式的猜拳游戏,对被训练的人员进行猜拳判决,要求每一次判决的时间不大于 1 秒。测试结果如表4-3

表4-3 测试结果表


训练项目

猜拳训练( <= 3次 )




测试项目

电容值

时间(s)

测试次数

石头

8~12

< 1

2

剪刀

3~12

< 1

2

9~13

< 1

2


4.2.4 题目四的系统测试结果


装置继续工作在模式二训练模式下,对任意测试者进行划拳的手势训练,每种动作训练次数同样不大于 3 次,总的训练时间不大于 2分钟;然后切换工作模式到模式一判决模式的划拳游戏,对被训练的人员进行划拳判决,要求每一次判决的时间不大于 1 秒。测试结果如表4-4

表4-4 测试结果表

训练项目

划拳游戏( <= 3次 )



测试项目

电容值

时间(s)

测试次数


1

2~12

< 1

3


2

7~12

< 1

3


3

4~12

< 1

3


4

3~10

< 1

3


5

9~13

< 1

3


4.2.5 输赢模式

在实现赛方指定要求功能后,我们外扩了一个输赢模式,在系统随机生成的一种手势与测试者的手势进行比较,比较结果有平局、赢、输三种结果。如表4-5


表4-5测试结果表

随机手势

测试者手势

石头

剪刀

石头

平局

剪刀

平局

平局




第五章:设计总结
在学校里我们学习到的知识和简单的动手实践,要转化成为社会的生产力还需要一个平台。全国大学生电子设计竞赛给我们提供了一个培养创新、协作和钻研精神的平台,是大学生展现自己、积累经验的舞台。            
培训到竞赛是一个漫长的过程,期间心态很重要,会遇到很多问题,比如:做训练时不懂的知识,硬件、软件调不出来,队员之间的矛盾,外界压力等,都需要我们去克服。队员多交流!交流不仅能促进队员们的学习,还能及时发现问题处理问题,利用一切可以提高自己能力的资源。
  对我们而言,知识上的收获重要,精神上的丰收更加可喜。挫折是一份财富,经历是一份拥有。这次电子设计大赛必将成为人生旅途上一个非常美好的回忆!

手势识别FDC2214的单片机源程序:

  1. #ifndef __stc15f2k60s2_H__
  2. #define __stc15f2k60s2_H__
  3. #endif
  4. #ifndef uint8
  5. #define uint8    unsigned char
  6. #endif
  7. #ifndef uint16
  8. #define uint16   unsigned int
  9. #endif
  10. #include <stc15f2k60s2.h>
  11. #include <string.h>
  12. #include <intrins.h>            
  13. #include <math.h>
  14. #include <stdio.h>
  15. sbit SCL=P1^3;                           
  16. sbit SDA=P1^4;                           
  17. float xdata temp1,temp2,temp3,temp4,aemp1,aemp2,aemp3,aemp4;
  18.               unsigned char xdata buf1[2]="00";
  19.               unsigned char xdata buf2[2]="00";
  20.               unsigned char xdata buf3[2]="00";
  21.               unsigned char xdata  buf4[2]="00";
  22. uint8 dis[6];            
  23. void Delay5us(void)
  24. {
  25.               _nop_();_nop_();_nop_();_nop_();
  26.               _nop_();_nop_();_nop_();_nop_();
  27.               _nop_();_nop_();_nop_();_nop_();
  28.               _nop_();_nop_();_nop_();_nop_();
  29.               _nop_();_nop_();_nop_();_nop_();
  30.               _nop_();_nop_();_nop_();_nop_();
  31. }
  32. void delay_ms(unsigned int ms)
  33. {                        
  34.               unsigned int a;
  35.               while(ms)
  36.               {
  37.                             a=1800;
  38.                             while(a--);
  39.                             ms--;
  40.               }
  41.               return;
  42. }
  43. void lcd_printf(uint8 *s,int temp_data)
  44. {
  45.               if(temp_data<0)
  46.               {
  47.                             temp_data=-temp_data;
  48.                             *s='-';
  49.               }
  50.               else *s=' ';
  51.               *++s =temp_data/10+0x30;
  52.               temp_data=temp_data%10;     
  53.               *++s =temp_data+0x30;              
  54. }
  55. void I2C_Start()
  56. {
  57.     SDA = 1;                  
  58.     SCL = 1;                  
  59.     Delay5us();              
  60.     SDA = 0;                  
  61.     Delay5us();               
  62.     SCL = 0;                  
  63. }
  64. void I2C_Stop()
  65. {
  66.     SDA = 0;              
  67.               SCL = 0;
  68.               Delay5us();
  69.     SCL = 1;                  
  70.     Delay5us();               
  71.     SDA = 1;                  
  72.     //Delay5us();               
  73. }
  74. void I2C_SendACK(bit ack)
  75. {
  76.     SDA = ack;                 
  77.     SCL = 1;                 
  78.     Delay5us();               
  79.     SCL = 0;                  
  80.     Delay5us();              
  81. }
  82. bit I2C_RecvACK()
  83. {
  84.     SCL = 1;                  
  85.     Delay5us();               
  86.     CY = SDA;                  
  87.     SCL = 0;                 
  88.     Delay5us();               
  89.     return CY;
  90. }
  91. void I2C_SendByte(uint8 dat)
  92. {
  93.     uint8 i;
  94.     for (i=0; i<8; i++)      
  95.     {
  96.         dat <<= 1;            
  97.         SDA = CY;            
  98.         SCL = 1;               
  99.         Delay5us();           
  100.         SCL = 0;            
  101.         Delay5us();            
  102.     }
  103.       I2C_RecvACK();
  104. }
  105. uint8 I2C_RecvByte()
  106. {
  107.     uint8 i;
  108.     uint8 dat = 0;
  109.     SDA = 1;               
  110.     for (i=0; i<8; i++)      
  111.     {
  112.         dat <<= 1;
  113.         SCL = 1;               
  114.         Delay5us();         
  115.         dat |= SDA;                        
  116.         SCL = 0;               
  117.         Delay5us();            
  118.     }
  119.     return dat;
  120. }
  121. void WriteRegfdc2214(unsigned char add,unsigned int value)
  122. {
  123.     I2C_Start();
  124.     I2C_SendByte(0X54);            
  125.     I2C_SendByte(add);     
  126.     I2C_SendByte(value>>8);
  127.     I2C_SendByte(value&0xff);
  128.     I2C_Stop();              
  129.     delay_ms(10);            
  130. }
  131. unsigned int ReadRegfdc2214(unsigned char add)
  132. {
  133.     unsigned int status;
  134.     unsigned int a,b;
  135.     I2C_Start();
  136.     I2C_SendByte(0X54);               
  137.     I2C_SendByte(add);   
  138.     I2C_Start();           
  139.     I2C_SendByte(0X55);               

  140.     a=I2C_RecvByte();   
  141.               I2C_SendACK(0);
  142.     b=I2C_RecvByte();                           
  143.               I2C_SendACK(1);
  144.     status=(a<<8)+b;
  145.     I2C_Stop();

  146.     return (status);
  147. }
  148. void InitSinglefdc2214(void)
  149. {
  150.     WriteRegfdc2214(0x08,0x0000);

  151.     WriteRegfdc2214(0x10,0x0064);


  152.     WriteRegfdc2214(0x14,0x2001);
  153.     //    LDC_Write_Reg(0x0C,0x0F00);
  154.     WriteRegfdc2214(0x19,0x0000);
  155.             
  156.     WriteRegfdc2214(0x1B,0x020D);
  157.     WriteRegfdc2214(0x1E,0xF800);
  158.     WriteRegfdc2214(0x1A,0x1C81);
  159. }
  160. void InitMultifdc2214(void)
  161. {
  162.     WriteRegfdc2214(0x08,0x34FB);
  163.                 WriteRegfdc2214(0x09,0x34FB);
  164.               WriteRegfdc2214(0x0A,0x34ff);
  165.                 WriteRegfdc2214(0x0B,0x34ff);
  166.             
  167.               WriteRegfdc2214(0x10,0x001B);
  168.                 WriteRegfdc2214(0x11,0x001B);
  169.               WriteRegfdc2214(0x12,0x001B);
  170.               WriteRegfdc2214(0x13,0x001B);

  171.    WriteRegfdc2214(0x14,0x2002);
  172.    WriteRegfdc2214(0x15,0x2002);
  173.    WriteRegfdc2214(0x16,0x2002);
  174.    WriteRegfdc2214(0x17,0x2002);            
  175.             
  176.               WriteRegfdc2214(0x1E,0x7800);
  177.                 WriteRegfdc2214(0x1F,0x7800);
  178.               WriteRegfdc2214(0x20,0x7800);
  179.                 WriteRegfdc2214(0x21,0x7800);
  180.             
  181.                 WriteRegfdc2214(0x0C,0x0000);
  182.               WriteRegfdc2214(0x0D,0x0000);
  183.               WriteRegfdc2214(0x0E,0x0000);
  184. WriteRegfdc2214(0x0F,0x0000);
  185.                

  186.                 WriteRegfdc2214(0x19,0x0000);
  187.                 WriteRegfdc2214(0x1B,0xC20D);
  188.                
  189. //  LDC_Write_Reg(0x1A,0x1401);
  190.               WriteRegfdc2214(0x1A,0x1401);
  191. }
复制代码

完整的Word格式完整论文51黑下载地址(里面有51单片机和stm32 2个实现方案):
http://www.51hei.com/bbs/dpj-130703-1.html


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:290141 发表于 2020-1-3 12:51 | 只看该作者
好东西
回复

使用道具 举报

板凳
ID:816909 发表于 2020-9-6 15:47 | 只看该作者
想要完整代码参考
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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