基于EV54Y39A PIC-IOT WA的手指数量检测功能开发(MPLAB+ADC)

目录

  • 项目介绍
  • 硬件介绍
  • 项目设计
    • 开发环境及工程参考
    • 总体流程图
    • 硬件基本配置
      • 光照传感器读取
      • 定时器
      • 检测逻辑
  • 功能展示
  • 项目总结

👉 【Funpack3-2】基于EV54Y39A PIC-IOT WA的手指数量检测功能开发
👉 Github: EmbeddedCamerata/PIC-IOT_finger_recognition

项目介绍

基于 Microchip 的 EV54Y39A PIC-IOT WA 开发板,通过板卡上集成的光照传感器,将板卡平放后,每秒对挥动的手指数量进行检测。在较强光源下,可准确识别挥动的手指数量。

👉 MPLAB X IDE

硬件介绍

PIC-IoT WA硬件概述:

  • 控制器包含两个主要组件:PIC微控制器(PIC24FJ128GA705)和Wi-Fi模块(WINC1510)。PIC24F是一款低功耗的16位微控制器,时钟频率为32MHz,具有集成的12位ADC。Wi-Fi模块采用Microchip的ATWINC1510,是低功耗认证的IoT网络控制器。
  • 板载ATECC608的密码协处理器。用于生成私钥和公钥,私钥用于加密发送的每条消息,而公钥可与服务提供商(如Google IoT cloud或AWS)共享。
  • 板载传感器包括TEMT6000X01光传感器和MCP9808温度传感器。光传感器连接到PIC控制器的10位ADC,温度传感器通过I2C接口测量-20℃至100℃之间的温度,典型精度为0.25℃。
  • PIC IoT WA开发板可通过微型USB端口或4.2V锂电池供电,同时具有板上编程仿真器和调试器(PKOB)支持一路串口和一个IO的逻辑分析功能。

PIC-IOT WA

项目设计

开发环境及工程参考

本项目使用 Microchip 官方的 MPLAB X IDE 开发。项目所用到的工具链、库或 packs 如下:

  1. 编译器:xc16 v1.50,这个版本的编译器确保编译通过
  2. Packs: PIC24F-GA-GB_DFP 1.9.336、PKOB nano 1.13.715
  3. MCC Content Libraries:
    1. MCC core 5.7.1
    2. PIC24 / dsPIC33 MCUs 1.171.4
    3. Board Support Library 1.12.0

总体流程图

工程总体流程
进行系统初始化以后,先启动周期为1s的定时器,该定时器自动重载,在其回调函数中打印识别的手指数目 count,之后清零并进入 IDLE 态。工程主体为一个 while(1) 循环的 FSM,用一个全局变量记录系统状态:

  • 每次都会先读取光照传感器的数据,并根据此次与上次读数的差值,进入其他的状态
  • 在 IDLE 态中,当差值小于一个负阈值时,进入 NEGA 态,此时识别到光照降低,这说明有手指遮挡。其余情况没有手指遮挡,状态不转移。当定时器触发时,打印出此时的识别数目并将 count 清零,系统重新进入 IDLE 态。
  • 在 NEGA 态中,当差值大于一个正阈值时,进入 POS 态,此时识别到光照增加,这说明手指移开了,count++。在 NEGA 态中,若保持光照读数相对稳定,这说明该手指还未完全经过传感器,状态不转移。当定时器触发时,打印出此时的识别数目并将 count 清零,系统重新进入 IDLE 态。
  • 在 POS 态中,只有当差值又一次小于负阈值时,进入 NEGA 态,此时识别到光照降低,这说明又有手指遮挡。若保持光照读数相对稳定或增加,这说明并没有新的手指遮挡。当定时器触发时,打印出此时的识别数目并将 count 清零,系统重新进入 IDLE 态。

由于测量周期是1s,即便测量状态没有变化,定时器回调也会将状态、变量全部重置。在 FSM 中,只需要处理有效的测量的统计逻辑即可。

硬件基本配置

根据手册可知,板载光照传感器与ADC AN8(RB12)相连。检测的周期设计为1秒,如此,需要一个定时器 TMR1。其次,还需要串口以供调试与结果显示。在MCC中,IO口设置如下图所示:

外设配置
RB10/11供调试使用。串口设置为9600 8N1,RC8 UITX 需要勾选“Start High”,勾选“Redirect printf to UART”。

光照传感器读取

需要修改一下默认的 ADC1 配置。根据下方提示,修改“Conversion Clock”为2即可。

ADC1配置修改
根据生成的ADC示例,可以修改实现光照传感器数据的读取。

uint16_t get_light_sensor(void)
{int i;uint16_t conversion;ADC1_Enable();ADC1_ChannelSelect(LIGHT_SENSOR);ADC1_SoftwareTriggerEnable();//Provide Delayfor(i = 0; i < 1000; i++){}ADC1_SoftwareTriggerDisable();while(!ADC1_IsConversionComplete(LIGHT_SENSOR));conversion = ADC1_ConversionResultGet(LIGHT_SENSOR);ADC1_Disable();return conversion;
}

定时器

如下图所示配置,设置 TMR1 为1s周期定时器。

1s周期定时器设置
在定时器的回调函数 periodic_handler 中,打印 count 手指数目,而后清零并将状态设置为 APP_STATE_IDLE。在主循环之前创建定时器,定时器超时设置为 0xF423,在主循环内需要调用 timeout_callNextCallback() 以检查回调。

static uint32_t periodic_handler(void)
{printf("Finger count: %d\n", count);appState = APP_STATE_IDLE;count = 0;return 0xF423;
}int main(void)
{// initialize the deviceSYSTEM_Initialize();timerStruct_t periodic_timer = {periodic_handler, NULL};timeout_create(&periodic_timer, 0xF423);while (1){timeout_callNextCallback();main_app();}return 1;
}

检测逻辑

当手指遮挡时,光照减小,前后两次读数的差值为负数,反之为正数。因此,设置一个合适的阈值 LIGHT_TRIGGER_THRES,用于判断是否发生了这两种变化,同时也可以过滤掉读数不稳定的影响。该值需要根据实际环境进行调整。

#define LIGHT_TRIGGER_THRES     (50)

系统分为三个状态,用全局变量 appState 记录。同时,需要几个参数记录传感器的数值以及手指数目。

typedef enum {APP_STATE_IDLE,APP_STATE_DETECTED_NEGA,APP_STATE_DETECTED_POS
} appStates_e;static appStates_e appState = APP_STATE_IDLE;
static uint16_t light1 = 0;
static uint16_t light2 = 0;
static float light_prev1 = 0.;
static int count = 0;

反复读取光照传感器数据,读取最近的两次数据取平均值作为此次测量的结果,并与上次读数作差。根据该差值进行状态跳转:

  1. 处于 APP_STATE_IDLE 时,当差值 delta 小于负阈值 LIGHT_TRIGGER_THRES 时,进入 APP_STATE_DETECTED_NEGA,此时检测到有手指遮挡,光照降低。其余情况下,均不会有手指遮挡,状态不转移。
  2. 处于 APP_STATE_DETECTED_NEGA 时,当 delta 大于正阈值 LIGHT_TRIGGER_THRES 时,进入 APP_STATE_DETECTED_POS,此时说明手指移开了,计数+1。其余情况下,手指还未完全经过传感器,因此差值不够大(可以过滤毛刺情况)或者为负,状态均不转移。
  3. 处于 APP_STATE_DETECTED_POS 时,当 delta 又一次小于负阈值 LIGHT_TRIGGER_THRES 时,进入 APP_STATE_DETECTED_NEGA,此时又有手指遮挡。其余情况下,说明光照无较大变化或者光照变强,这说明没有手指遮挡或手指逐渐远离,状态均不跳转。
  4. 测量周期为1s,定时器超时后,将打印出计数结果 count 并清零,同时状态转移至 APP_STATE_IDLE,进行下一次测量。
void main_app(void)
{float delta;float light;light1 = get_light_sensor();light2 = get_light_sensor();light = (light1 + light2) / 2;delta = light - light_prev1;light_prev1 = light;switch(appState) {case APP_STATE_IDLE:{if (delta < -LIGHT_TRIGGER_THRES) {appState = APP_STATE_DETECTED_NEGA;}break;}case APP_STATE_DETECTED_NEGA:{if (delta > LIGHT_TRIGGER_THRES) {count++;appState = APP_STATE_DETECTED_POS;}break;}case APP_STATE_DETECTED_POS:{if (delta < -LIGHT_TRIGGER_THRES) {appState = APP_STATE_DETECTED_NEGA;}break;}}
}

功能展示

下载程序后将板卡平放,注意需要保证环境光照较强,需要根据实际情况调整阈值 LIGHT_TRIGGER_THRES。本测试在室内,并用手机手电筒照射光照传感器的环境下进行。测试需要挥动手指,结果输出有延迟,测试效果参见视频更直观。

挥动两根手指测试结果
挥动三根手指测试结果
👉 详细展示参见:B站:基于EV54Y39A PIC-IOT WA的手指数量检测功能开发

项目总结

本次项目通过光照传感器、定时器与状态机,可在一定场景下准确识别挥动的手指数量,可以根据实际场景调整参数,以达到最佳效果。MPLAB IDE 一言难尽,打开 MCC 没个半天是不可能的,这个板卡的有些配置还有坑,例如,编译器需要选择 v1.50 而不能是最新版的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/332620.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ prime 第五版 第14章 重载运算与类型转换

一、基本概念 重载的运算符是具有特殊名字的函数&#xff1a;它们的名字由关键字operator和其后要定义的运算符号共同组成。和其他函数一样&#xff0c;重载的运算符也包含返回类型、参数列表以及函数体。 我们不能为内置类型的运算对象重定义运算符。对于一个运算符函数来说&…

【Linux】 虚拟机可以ping通主机 主机却ping不通虚拟机 解决方法

我当时初学linux&#xff0c;需要虚拟机联网&#xff0c;且虚拟机和windows需要能相互ping通&#xff0c;我当时就是虚拟机一切正常&#xff0c;虚拟机显示有网可以ping通百度&#xff0c;也可以ping通windows&#xff0c;但是windows就是ping不通虚拟机&#xff0c;这个问题困…

如何关闭或者减少屏蔽 CloudFlare 的真人检测

经常浏览境外网站的应该常碰到一个真人检测的提示(如下图所示)。最近,明月就收到了一个知乎上的付费咨询:问我如何去掉这个提示,由此明月也特别的研究了一下这个“真人检测”,这算是 CloudFlare 的一个特色了,基本上大家看到站点访问有这个提示的几乎都是用了 CloudFlar…

list的模拟实现(一)

嗨喽大家好&#xff0c;时隔许久阿鑫又给大家带来了新的博客&#xff0c;list的模拟实现&#xff08;一&#xff09;&#xff0c;下面让我们开始今天的学习吧&#xff01; list的模拟实现&#xff08;一&#xff09; 1.list splice接口的使用 2.list尾插的实现 3.list的迭代…

Elasticsearch集群和Logstash、Kibana部署

1、 Elasticsearch集群部署 服务器 安装软件主机名IP地址系统版本配置ElasticsearchElk10.3.145.14centos7.5.18042核4GElasticsearchEs110.3.145.56centos7.5.18042核3GElasticsearchEs210.3.145.57centos7.5.18042核3G 软件版本&#xff1a;elasticsearch-7.13.2.tar.gz 示…

【vue3+elementuiplus】el-select下拉框会自动触发校验规则

场景&#xff1a;编辑弹框省份字段下拉框必填&#xff0c;触发方式change&#xff0c;有值第一次打开不会触发校验提示&#xff0c;关闭弹框再次打开触发必填校验提示&#xff0c;但是该字段有值 问题的原因是&#xff1a;在关闭弹层事件中&#xff0c;我做了resetfileds&…

使用docker完整搭建前后端分离项目

1、docker的优势&#xff0c;为啥用docker 2、docker的核心概念 镜像【Image】- 只读模板 容器【Container】- 运行镜像的一个外壳&#xff0c;相当于一个独立的虚拟机 仓库【repository】- 镜像的管理工具&#xff0c;可公开&#xff0c;可私有&#xff1b;类似git仓库 3、c…

排序算法(二)

选择排序 &#xff1a; 思想&#xff1a; 每一轮把最小元素和未排序数组的第一个交换位置&#xff0c;直到全部排好序&#xff0c;最终为一个升序结果 代码展示&#xff1a; #include <stdio.h>int main(void) {int i, j; // 循环变量int MinIndex; // 保存最小的值的…

MySQL大表删除方案

1.问题 在生产环境中&#xff0c;执行大表删除操作时&#xff0c;很容易因为占用了大量io资源导致其他事务被阻塞&#xff0c;最终事务不断堆积导致MySQL挂掉。 2.drop命令 drop命令&#xff0c;MySQL主要干了两件事&#xff1a; 清除buffer pool缓冲&#xff08;内存&…

jmeter之MD5加密接口请求教程

前言&#xff1a; 有时候在项目中&#xff0c;需要使用MD5加密的方法才可以登录&#xff0c;或者在某一个接口中遇到 登录获取token后才可以进行关联&#xff0c;下面介绍下遇到的常见使用 一、第一种方法&#xff1a;使用jmeter自带的函数助手digest 选择工具&#xff0c;选择…

一文带你学会如何部署个人博客到云服务器,并进行域名备案与解析!

哈喽&#xff0c;大家好呀&#xff01;这里是码农后端。之前我给大家介绍了如何快速注册一个自己的域名&#xff0c;并创建一台自己的阿里云ECS云服务器。本篇将介绍如何将个人博客部署到云服务器&#xff0c;并进行域名备案与解析。 1、域名备案 注册了域名并购买了云服务器之…

识别鼠标绘制的数学公式网站

https://webdemo.myscript.com/views/math/index.html x n m x n x m x^{nm}x^{n}\times x^{m} xnmxnxm 使用"$$"进行包裹

unity开发Hololens,使用unity自带的UGUI

hololens 使用UGUI 新建画布&#xff0c;添加组件&#xff0c; 画布模式改成WorldSpace&#xff0c;这样在能在3D场景里 随意的移动位置&#xff0c; 添加NearIteractionTouchaBleUnityUI、CanvasUtility组件 EaventsToReceive改成Pointer&#xff0c; 这样&#xff0c;UGUI的…

Golang | Leetcode Golang题解之第113题路径总和II

题目&#xff1a; 题解&#xff1a; type pair struct {node *TreeNodeleft int }func pathSum(root *TreeNode, targetSum int) (ans [][]int) {if root nil {return}parent : map[*TreeNode]*TreeNode{}getPath : func(node *TreeNode) (path []int) {for ; node ! nil; no…

2024年中国电机工程学会杯数学建模思路 - 案例_ ID3-决策树分类算法

# 前言 2024电工杯(中国电机工程学会杯)数学建模思路解析 最新思路更新(看最新发布的文章即可): https://blog.csdn.net/dc_sinor?typebloghttps://blog.csdn.net/dc_sinor/article/details/128779911) 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法&#xff0c;就…

骑行 - 新区永旺出发的环太湖路线

环过好几次太湖&#xff0c;但对路线都没太在意&#xff0c;都是跟着别人走的。这次自己制定一个路书&#xff0c;方便下次自己一个人环太湖时使用。 开始是使用高德地图做路书&#xff0c;只能在PC上做。我用的是网页版&#xff0c;每次选点太麻烦了。要输入地址搜索&#xff…

Nginx代理配置(专业版)

写在前面提醒&#xff1a;使用代理&#xff0c;如果可以&#xff0c;请尽量支持双协议&#xff0c;http、https均要支持哈。 注意&#xff1a;监控系统只是运行代码&#xff0c;是否支持https&#xff0c;需要运维同学在你们的服务器上配置https证书&#xff0c;配置好证书&…

探索集合python(Set)的神秘面纱:它与字典有何不同?

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、集合&#xff08;Set&#xff09;与字典&#xff08;Dictionary&#xff09;的初识 1. …

Mysql函数

字符串函数 concat(s1,s2…sn)把传入的参数连接成一个字符串 注意&#xff1a;任何字符串与NULL进行连接的结果都将是NULL insert(str&#xff0c;x&#xff0c;y&#xff0c;instr)函数&#xff1a;将字符串str从第x位置开始&#xff0c;y个字符长度的字串替换为instr lower…

从“反超”到“引领”,中国卫浴品牌凭何遥遥领先?

作者 | 曾响铃 文 | 响铃说 前不久&#xff0c;第28届中国国际厨房、卫浴设施展览会(以下简称“中国国际厨卫展”)在上海如期举行&#xff0c;就结果来说真的让人大开眼界。 冲水声比蚊子声更小的马桶、能化身无感交互平台的魔镜柜、可以语音交互的淋浴器&#xff0c;这些“…