基于FDC2214的手势识别
基于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的手势识别的更多相关文章
- 基于ssd的手势识别模型(object detection api方式)
[Tensorflow]Object Detection API-训练自己的手势识别模型 1. 安装tensorflow以及下载object detection api 1.安装tensorflow: ...
- 模式识别开发之项目---基于opencv的手势识别
我使用OpenCV2.4.4的windows版本+Qt4.8.3+VS2010的编译器做了一个手势识别的小程序. 本程序主要使到了Opencv的特征训练库和最基本的图像处理的知识,包括肤色检测等等. ...
- 手势识别(一)--手势基本概念和ChaLearn Gesture Challenge
以下转自: http://blog.csdn.net/qq1175421841/article/details/50312565 像点击(clicks)是GUI平台的核心,轻点(taps)是触摸平台的 ...
- Kinect 开发 —— 手势识别(上)
像点击(clicks)是GUI平台的核心,轻点(taps)是触摸平台的核心那样,手势(gestures)是Kinect应用程序的核心 关于手势的定义的中心在于手势能够用来交流,手势的意义在于讲述而不是 ...
- [转帖]gesture recognition
http://wenku.baidu.com/view/53c3331a6bd97f192279e9c9.html HSI与RGB的Matlab实现. http://wenku.baidu.com/v ...
- 时序分析:HMM模型(状态空间)
关于HMM模型:时序分析:隐马尔科夫模型 HMM用于手势识别: 训练时每一种手势对应一个HMM-Model,识别率取最大的一个HMM即可. 类似于一个封装的完成多类识别器功能单层网络. 优点: 尤其 ...
- OpenCV(Open Source Computer Vision Library)计算机视觉库
OpenCV(最基本的滤波到高级的物体检测皆有涵盖) 简介: OpenCV 是跨平台的,可以在 Windows.Linux.Mac OS.Android.iOS 等操作系统上运行. OpenCV 的 ...
- 基于Emgu CV 的手势识别实现PPT的控制放映
Emgu CV 简介 众所周知,Emgu CV是.NET平台下对OpenCV图像处理库的封装,也就是.NET版的OpenCV.开发者可以很方便的通过C#,VB等语言调用OpenCV函数 ...
- iOS开发系列--触摸事件、手势识别、摇晃事件、耳机线控
-- iOS事件全面解析 概览 iPhone的成功很大一部分得益于它多点触摸的强大功能,乔布斯让人们认识到手机其实是可以不用按键和手写笔直接操作的,这不愧为一项伟大的设计.今天我们就针对iOS的触摸事 ...
随机推荐
- Windows软件静默安装
Install Software in A Slient Way 一般来说,不同的软件的封装类型都有固定的静默安装命令. 查看软件的封装类型 双击setup.exe,在弹出窗口的左上角单击,选择&qu ...
- appium 获取app的应用包名package和activity
第一种,使用sdk自带的工具aapt,在sdk\builds-tools\目录下,切换到aapt所在目录 命令:aapt dump badging app的路径,运行后的结果中以下两行分别是应用包名p ...
- ZT Abstract Factory
实际上,Abstract Factory 模式是为创建一组(有多类)相关或依赖的对象提供创建接口,而 Factory 模式正如我在相应的文档中分析的是为一类对象提供创建接口或延迟对象的创建到子类中实现 ...
- poj 3414 Pots 【BFS+记录路径 】
//yy:昨天看着这题突然有点懵,不知道怎么记录路径,然后交给房教了,,,然后默默去写另一个bfs,想清楚思路后花了半小时写了120+行的代码然后出现奇葩的CE,看完FAQ改了之后又WA了.然后第一次 ...
- Swift编程语言学习1.1——常量与变量
常量和变量把一个名字(比方maximumNumberOfLoginAttempts或者welcomeMessage)和一个指定类型的值(比方数字10或者字符串"Hello")关联起 ...
- 「hihocoder1413 Rikka with String」
题目 哈哈哈哈哈哈哈哈哈哈我还没自闭 好像前后调了两天了 哈哈哈哈哈哈哈哈哈哈我还没自闭 这道题就是给定一个小写字母串,回答分别把每个位置上的字符替换为\(#\)后的本质不同的子串数 首先就是跨过这个 ...
- 19、配置嵌入式servlet容器(下)
使用外置的Servlet 嵌入式Servlet容器:应用打成可执行的j ar 优点:简单.便携: 缺点:默认不支持JSP.优化定制比较复杂 使用定制器[ServerProperti ...
- 3springboot:springboot配置文件(配置文件占位符、Profile、配置文件的加载位置)
1.配置文件占位符 RaandomValuePropertySourcr:配置文件可以使用随机数 ${random.value} ${random.int} ${random.long ...
- PAT——1055. 集体照 (比较comparable和comparator的区别)
拍集体照时队形很重要,这里对给定的N个人K排的队形设计排队规则如下: 每排人数为N/K(向下取整),多出来的人全部站在最后一排: 后排所有人的个子都不比前排任何人矮: 每排中最高者站中间(中间位置为m ...
- 手机端app开发初识
1.所需软件说明 百度云下载链接: https://pan.baidu.com/s/1-TEQZP9QbJSlGSYedyAUFw密码: 2z8l 或者官方链接: Hbuilder:http://ww ...