基于FDC2214的手势识别

1、本次题目来源于2018年全国电子设计大赛D题,要求实现对石头、剪刀、布以及数字12345的识别;同时在上述基础上实现对手势的学习。

2、硬件实现:

硬件主要采用STM32F103以及TI公司的FDC2214芯片,同时FDC2214芯片按照官方文档进行接线,其接线原理图如下:

其中CLKIN引脚为接地引脚;ADDR引脚需要外接上拉电阻;SD引脚需要外接下拉电阻;右侧为芯片外接测量数据输入端口。

同时SCL、SDA、VDD以及GND进行了接线处理,其具体接线如下:

实现对接线的VDD和GND之间的处理,实现和STM32f103之间的连接,实现对FDC2214芯片的供电和接地处理以及I2C通信的接口。

另外,对数据输入端子进行数据读入,加入LC稳定滤波,其接线原理如下:

3、软件实现,不多说,先贴上FDC2214配置代码:

#include "fdc2214.h"

#include "delay.h"

#include "led.h"

void FDC_IIC_Delay(void)

{

delay_us(2);

}

void FDC_GPIO_Init(void)

{

}

void FDC_IIC_Init(void)

{

GPIO_InitTypeDef  GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOC, &GPIO_InitStructure);

GPIO_SetBits(GPIOC,GPIO_Pin_4|GPIO_Pin_5);

}

void FDC_IIC_Start(void)

{

FDC_SDA_OUT();

FDC_IIC_SDA=1;

FDC_IIC_SCL=1;

FDC_IIC_Delay();

FDC_IIC_SDA=0;

FDC_IIC_Delay();

FDC_IIC_SCL=0;

}

void FDC_IIC_Stop(void)

{

FDC_SDA_OUT();

FDC_IIC_SCL=0;

FDC_IIC_SDA=0;

FDC_IIC_Delay();

FDC_IIC_SCL=1;

FDC_IIC_SDA=1;

FDC_IIC_Delay();

}

u8 FDC_IIC_Wait_Ack(void)

{

u8 ucErrTime=0;

FDC_SDA_IN();

FDC_IIC_SDA=1;FDC_IIC_Delay();

FDC_IIC_SCL=1;FDC_IIC_Delay();

while(FDC_READ_SDA)

{

ucErrTime++;

if(ucErrTime>250)

{

FDC_IIC_Stop();

return 1;

}

}

FDC_IIC_SCL=0;

return 0;

}

void FDC_IIC_Ack(void)

{

FDC_IIC_SCL=0;

FDC_SDA_OUT();

FDC_IIC_SDA=0;

FDC_IIC_Delay();

FDC_IIC_SCL=1;

FDC_IIC_Delay();

FDC_IIC_SCL=0;

}

void FDC_IIC_NAck(void)

{

FDC_IIC_SCL=0;

FDC_SDA_OUT();

FDC_IIC_SDA=1;

FDC_IIC_Delay();

FDC_IIC_SCL=1;

FDC_IIC_Delay();

FDC_IIC_SCL=0;

}

void FDC_IIC_Send_Byte(u8 txd)

{

u8 t;

FDC_SDA_OUT();

FDC_IIC_SCL=0;

for(t=0;t<8;t++)

{

FDC_IIC_SDA=(txd&0x80)>>7;

txd<<=1;

FDC_IIC_SCL=1;

FDC_IIC_Delay();

FDC_IIC_SCL=0;

FDC_IIC_Delay();

}

}

u8 FDC_IIC_Read_Byte(unsigned char ack)

{

unsigned char i,receive=0;

FDC_SDA_IN();

for(i=0;i<8;i++ )

{

FDC_IIC_SCL=0;

FDC_IIC_Delay();

FDC_IIC_SCL=1;

receive<<=1;

if(FDC_READ_SDA)receive++;

FDC_IIC_Delay();

}

if (!ack)

FDC_IIC_NAck();//·¢ËÍnACK

else

FDC_IIC_Ack(); //·¢ËÍACK

return receive;

}

u8 Set_FDC2214(u8 reg,u8 MSB,u8 LSB)

{

FDC_IIC_Start();

FDC_IIC_Send_Byte((FDC2214_ADDR<<1)|0);

if(FDC_IIC_Wait_Ack())

{

FDC_IIC_Stop();

return 1;

}

FDC_IIC_Send_Byte(reg);

FDC_IIC_Wait_Ack();

FDC_IIC_Send_Byte(MSB);

if(FDC_IIC_Wait_Ack())

{

FDC_IIC_Stop();

return 1;

}

FDC_IIC_Send_Byte(LSB);

if(FDC_IIC_Wait_Ack())

{

FDC_IIC_Stop();

return 1;

}

FDC_IIC_Stop();

return 0;

}

u16 FDC_Read(u8 reg)

{

u16 res;

FDC_IIC_Start();

FDC_IIC_Send_Byte((FDC2214_ADDR<<1)|0);

FDC_IIC_Wait_Ack();

FDC_IIC_Send_Byte(reg);

FDC_IIC_Wait_Ack();

FDC_IIC_Start();

FDC_IIC_Send_Byte((FDC2214_ADDR<<1)|1);

FDC_IIC_Wait_Ack();

res=FDC_IIC_Read_Byte(1)<<8;

res|=FDC_IIC_Read_Byte(0);

FDC_IIC_Stop();

return res;

}

u32 FCD2214_ReadCH(u8 index)

{

u32 result;

switch(index)

{

case 0:

result = FDC_Read(DATA_CH0)&0x0FFF;

result = (result<<16)|(FDC_Read(DATA_LSB_CH0));

break;

case 1:

result = FDC_Read(DATA_CH1)&0x0FFF;

result = (result<<16)|(FDC_Read(DATA_LSB_CH1));

break;

case 2:

result = FDC_Read(DATA_CH2)&0x0FFF;

result = (result<<16)|(FDC_Read(DATA_LSB_CH2));

break;

case 3:

result = FDC_Read(DATA_CH3)&0x0FFF;

result = (result<<16)|(FDC_Read(DATA_LSB_CH3));

break;

default:break;

}

result =result&0x0FFFFFFF;

return result;

}

u8 FDC2214_Init(void)

{

u16 res;

FDC_GPIO_Init();

FDC_IIC_Init();

res=FDC_Read(MANUFACTURER_ID);

if(res==0x5449)

{

Set_FDC2214(RCOUNT_CH0,0x34,0xFB);                  Set_FDC2214(RCOUNT_CH1,0x34,0xFB);

Set_FDC2214(RCOUNT_CH2,0x34,0xFB);

Set_FDC2214(RCOUNT_CH3,0x34,0xFB);

Set_FDC2214(SETTLECOUNT_CH0,0x00,0x1B);                               Set_FDC2214(SETTLECOUNT_CH1,0x00,0x1B);

Set_FDC2214(SETTLECOUNT_CH2,0x00,0x1B);

Set_FDC2214(SETTLECOUNT_CH3,0x00,0x1B);

Set_FDC2214(CLOCK_DIVIDERS_C_CH0,0x10,0x01);        Set_FDC2214(CLOCK_DIVIDERS_C_CH1,0x10,0x01);        Set_FDC2214(CLOCK_DIVIDERS_C_CH2,0x10,0x01);        Set_FDC2214(CLOCK_DIVIDERS_C_CH3,0x10,0x01);

Set_FDC2214(DRIVE_CURRENT_CH0,0x78,0x00);                            Set_FDC2214(DRIVE_CURRENT_CH1,0x78,0x00);

Set_FDC2214(DRIVE_CURRENT_CH2,0x78,0x00);

Set_FDC2214(DRIVE_CURRENT_CH3,0x78,0x00);

Set_FDC2214(ERROR_CONFIG,0x00,0x00);

Set_FDC2214(MUX_CONFIG,0xC2,0x0D);

Set_FDC2214(CONFIG,0x14,0x01);

}

else return 1;

return 0;

}

float Cap_Calculate(u8 index)

{

u32 Data_FDC;

Data_FDC = FCD2214_ReadCH(index);

return (Data_FDC);

}

上述为本次设计中较为核心的FDC2214传感器芯片用到的配置代码,其中包括对I2C通信的代码引脚配置、时序配置、数据读入读出、读取FDC2214对应通道数值的程序编写。

4、其中,自学习功能,本人使用每三次采集数据均值周边的正负20作为数据参考基准,,实现对手势的学习,增强自学习性的可以自己编写相关算法程序。

if(page_fl==22&&posi==6)

{

if( (data>n1_data[0]-20)&&(data<n1_data[0]+20) )

{

POINT_COLOR=BLACK;

LCD_ShowNum(190,400,1,1,24);

}

if( (data>n2_data[0]-20)&&(data<n2_data[0]+20) )

{

POINT_COLOR=BLACK;

LCD_ShowNum(190,400,2,1,24);

}

if( (data>n3_data[0]-20)&&(data<n3_data[0]+20) )

{

POINT_COLOR=BLACK;

LCD_ShowNum(190,400,3,1,24);

}

if( (data>n4_data[0]-20)&&(data<n4_data[0]+20) )

{

POINT_COLOR=BLACK;

LCD_ShowNum(190,400,4,1,24);

}

if( (data>n5_data[0]-20)&&(data<n5_data[0]+20) )

{

POINT_COLOR=BLACK;

LCD_ShowNum(190,400,5,1,24);

}

}

5、综上,为本次D题,此外还做了2018年E题方案和程序,有兴趣后续可了解学习,诸多不足,诸位见谅

­

基于FDC2214的手势识别的更多相关文章

  1. 基于ssd的手势识别模型(object detection api方式)

    [Tensorflow]Object Detection API-训练自己的手势识别模型 1. 安装tensorflow以及下载object detection api 1.安装tensorflow: ...

  2. 模式识别开发之项目---基于opencv的手势识别

    我使用OpenCV2.4.4的windows版本+Qt4.8.3+VS2010的编译器做了一个手势识别的小程序. 本程序主要使到了Opencv的特征训练库和最基本的图像处理的知识,包括肤色检测等等. ...

  3. 手势识别(一)--手势基本概念和ChaLearn Gesture Challenge

    以下转自: http://blog.csdn.net/qq1175421841/article/details/50312565 像点击(clicks)是GUI平台的核心,轻点(taps)是触摸平台的 ...

  4. Kinect 开发 —— 手势识别(上)

    像点击(clicks)是GUI平台的核心,轻点(taps)是触摸平台的核心那样,手势(gestures)是Kinect应用程序的核心 关于手势的定义的中心在于手势能够用来交流,手势的意义在于讲述而不是 ...

  5. [转帖]gesture recognition

    http://wenku.baidu.com/view/53c3331a6bd97f192279e9c9.html HSI与RGB的Matlab实现. http://wenku.baidu.com/v ...

  6. 时序分析:HMM模型(状态空间)

    关于HMM模型:时序分析:隐马尔科夫模型 HMM用于手势识别: 训练时每一种手势对应一个HMM-Model,识别率取最大的一个HMM即可.  类似于一个封装的完成多类识别器功能单层网络. 优点: 尤其 ...

  7. OpenCV(Open Source Computer Vision Library)计算机视觉库

    OpenCV(最基本的滤波到高级的物体检测皆有涵盖) 简介: OpenCV 是跨平台的,可以在  Windows.Linux.Mac OS.Android.iOS 等操作系统上运行. OpenCV 的 ...

  8. 基于Emgu CV 的手势识别实现PPT的控制放映

    Emgu CV 简介         众所周知,Emgu CV是.NET平台下对OpenCV图像处理库的封装,也就是.NET版的OpenCV.开发者可以很方便的通过C#,VB等语言调用OpenCV函数 ...

  9. iOS开发系列--触摸事件、手势识别、摇晃事件、耳机线控

    -- iOS事件全面解析 概览 iPhone的成功很大一部分得益于它多点触摸的强大功能,乔布斯让人们认识到手机其实是可以不用按键和手写笔直接操作的,这不愧为一项伟大的设计.今天我们就针对iOS的触摸事 ...

随机推荐

  1. 面向对象编程——parent—this

    PHP5 中使用 parent::来引用父类的方法. parent:: 可用于调用父类中定义的成员方法. parent::的追溯不仅于直接父类. PHP5 中为解决变量的命名冲突和不确定性问题,引入关 ...

  2. 网络解析json

    public class myActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceSta ...

  3. 关于webstorm打开项目,文件下方出现了一个小锁的图标,修改文件出现“cannot modify a ready-only directory”的弹窗提示

    今天用webstorm打开项目,文件下方出现了一个小锁的图标,修改文件出现“cannot modify a ready-only directory”的弹窗提示 解决办法:运行 sudo chown ...

  4. 二十六、关于 IntelliJ IDEA 中 Schedule for Addition 的问题

    在我们使用 IntelliJ IDEA 的时候,经常会遇到这种情况,即: 从 SVN 检出项目之后,并用 IDEA 首次打开项目,IDEA 会弹出如下选择框: 如上图所示,让我们选择是否将XXX.im ...

  5. <a>标签跳转到Servelet页面并实现参数的传递

    <a>标签跳转到页面不能通过request.setAttribute()和getAttribute()方法获取参数. <a>标签只能通过request.getParameter ...

  6. Unity 游戏框架搭建 (十八) 静态扩展 + 泛型实现transform的链式编程

    本篇文章介绍如何实现如下代码的链式编程: C# this.Position(Vector3.one) .LocalScale(1.0f) .Rotation(Quaternion.identity); ...

  7. Oracle 缓存命中率问题一则(里面有个问题咨询大佬们)

    近日,核心数据库频繁抱出数据库缓存命中率过低,于是开始进行排查. 1.监控软件告警信息 2.抓取告警时间段内的awr报告进行分析 3.execute与parse命中率过低,说明分析(硬解析与软解析)的 ...

  8. 解决Windows10下小娜无法搜索本地应用的问题

    适用场景 小娜突然出现各种问题.比如突然无法搜索到本地应用...等其它问题 一般使用下面的方法,将小娜进行重新注册就ok了. 解决方案 1.用管理员权限打开 C:\Windows\System32\W ...

  9. OCR

    谷歌OCR光学字符识别窥探 - 简书 Tesseract OCR初探 利用Tesseract图片文字识别初探 _ TonyDeng's Blog Tesseract OCR(光学字符识别)教程 - C ...

  10. JavaScript面向对象(封装)

    阮一峰的网络日志 1.生成实例对象的原始模式 var People = { name : '', age : '' } 根据这个原型对象生成两个实例对象 var people1 = {}; peopl ...