基于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,之后清零并进入 STATE_IDLE。工程主体为一个 while(1) 循环的 FSM,用一个全局变量记录系统状态:

  • 每次都会先读取光照传感器的数据,并根据此次与上次读数的差值,进入其他的状态
  • 在 STATE_IDLE 中,当差值小于一个负阈值时,进入 STATE_NEGA,此时识别到光照降低,这说明有手指遮挡。其余情况没有手指遮挡,状态不转移。当定时器触发时,打印出此时的识别数目并将 count 清零,系统重新进入 STATE_IDLE。
  • 在 STATE_NEGA,当差值大于一个正阈值时,进入 STATE_POS,此时识别到光照增加,这说明手指移开了,count++。在 STATE_NEGA,若保持光照读数相对稳定,这说明该手指还未完全经过传感器,状态不转移。当定时器触发时,打印出此时的识别数目并将 count 清零,系统重新进入 STATE_IDLE。
  • 在 STATE_POS 中,只有当差值又一次小于负阈值时,进入 STATE_NEGA,此时识别到光照降低,这说明又有手指遮挡。若保持光照读数相对稳定或增加,这说明并没有新的手指遮挡。当定时器触发时,打印出此时的识别数目并将 count 清零,系统重新进入 STATE_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 Delay
    for(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 device
    SYSTEM_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 而不能是最新版的。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

图解 BERT 模型

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学. 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 汇总合集&…

PHP:集成Xunsearch生成前端搜索骨架

如果是安装宝塔&#xff0c;我们在集成xunsearch的时候就会比较简单&#xff0c;后面我们在介绍其他的接入方式&#xff1b; 首先我们进入到宝塔管理后台&#xff1a;【软件商店】-【输入xun】-【点击xunsearch】直接安装即可 安装成功之后&#xff0c;会自动在www/server中创…

Qt | QTabBar 类(选项卡栏)

01、上节回顾 Qt | QStackedLayout 类(分组布局或栈布局)、QStackedWidget02、简介 1、QTabBar类直接继承自 QWidget。该类提供了一个选项卡栏,该类仅提供了一个选项卡, 并没有为每个选项卡提供相应的页面,因此要使选项卡栏实际可用,需要自行为每个选项卡设置需要显示的页…

Android刮刮卡自定义控件

效果图 刮刮卡自定义控件 import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.graphics.PorterDuff; import …

基于SpringBoot设计模式之结构型设计模式·适配器模式

文章目录 介绍开始使用委托的适配器&#xff08;媒体播放器&#xff09;架构图定义被适配者定义需求接口定义适配者 使用继承的适配器&#xff08;手机充电接口&#xff09;架构图定义被适配者定义需求接口定义适配者 测试样例 总结优点缺点 介绍 在程序世界中&#xff0c;经常…

4,八种GPIO模式

资料来源:【STM32基础学习】八种GPIO模式总结-云社区-华为云 (huaweicloud.com) 【STM32基础学习】八种GPIO模式总结-云社区-华为云 (huaweicloud.com) 【STM32基础学习】八种GPIO模式总结-云社区-华为云 (huaweicloud.com) 仅作个人自学笔记&#xff0c;如有冒犯&#xf…

版本匹配指南:PyTorch版本、Python版本和pytorch_lightning版本的对应关系

版本匹配指南&#xff1a;PyTorch版本、Python版本和pytorch_lightning版本的对应关系 &#x1f308; 欢迎莅临我的个人主页&#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xff1a; 我是高斯…

《征服数据结构》双向链表

摘要&#xff1a; 1&#xff0c;双链表的介绍 2&#xff0c;双链表的用途 3&#xff0c;双链表的节点插入和删除 1&#xff0c;双链表的介绍 前面我们讲过单链表&#xff0c;单链表的特点就是只能往后访问不能往前访问。单链表一般在面试中用的比较多&#xff0c;比如删除倒数第…

Ovid医学库文献如何在家查找下载

今天讲的数据库是一个知名医学库——Ovid Ovid隶属于威科集团的健康出版事业集团&#xff0c;与LWW、Adis等公司属于姊妹公司。Ovid数据库在医学外文文献数据库方面占据绝对地位&#xff0c;目前已有包涵人文、科技等多领域数据库300个&#xff0c;其中80多个是生物医学数据库…

Web组态可视化编辑器 快速绘制组态图

演示地址&#xff1a;by组态[web组态插件] 随着工业智能制造的发展&#xff0c;工业企业对设备可视化、远程运维的需求日趋强烈&#xff0c;传统的单机版组态软件已经不能满足越来越复杂的控制需求&#xff0c;那么实现Web组态可视化界面成为了主要的技术路径。 行业痛点 对于…

Ps 滤镜:消失点

Ps菜单&#xff1a;滤镜/消失点 Filter/Vanishing Point 快捷键&#xff1a;Ctrl Alt V 两条平行的铁轨或两排树木连线相交于很远很远的某一点&#xff0c;这点在透视图中叫做“消失点”&#xff0c;也称为“灭点”。 消失点 Vanishing Point滤镜主要用于在图像中处理具有透视…

NSS题目练习4

[LitCTF 2023]1zjs 打开后是一个游戏&#xff0c;用dirsearch扫描&#xff0c;什么都没发现 查看源代码搜索flag&#xff0c;发现没有什么用 搜索php&#xff0c;访问 出现一堆符号&#xff0c;看样子像是jother编码 解码得到flag&#xff0c;要删掉[] [LitCTF 2023]Http pro …

【StableDiffusion】SD1.4、1.5、2.0、2.1 和 SDXL0.9-1.0、SDXL turbo 等的区别

总览 1.基础sd base model家族&#xff1a;SD1.4、SD1.5、SD1.5-LCM、SD2.0、SD2.0-768、SD2.1、SD2.1-768、SD2.1-UNCLIP 2.升级sdxl base model家族&#xff1a;SDXL0.9、SDXL1.0、SDXL1.0-LCM、SDXL-DISTILLED、SDXL-TURBO 3.专门用于视频生成的 SVD 家族&#xff1a;SVD、…

备战秋招c++ 【持续更新】

T1 牛牛的快递 原题链接&#xff1a;牛牛的快递_牛客题霸_牛客网 (nowcoder.com) 题目类型&#xff1a;模拟 审题&确定思路&#xff1a; 1、超过1kg和不足1kg有两种不同收费方案 ---- 起步价问题 2、超出部分不足1kg的按1kg计算 ----- 向上取整 3、向上取整的实现思路…

卷出新高度,直呼太强!时隔三月,YOLO再度进化升级:《YOLOv10—实时端到端目标检测》重磅来袭

真的是不止一次感叹&#xff0c;学习的速度都跟不上发论文出新品的速度。。。。。 继前文YOLOv9发布以来也就不到三个月的时间&#xff0c;YOLOv10就来了&#xff01; 《太卷了&#xff0c;目标检测新成员——YOLOv9: Learning What You Want to LearnUsing Programmable Gra…

城市空气质量数据爬取分析可视化

城市空气质量数据爬取分析可视化 一、效果展示二、完整代码2.1 数据爬取代码2.2 数据分析代码一、效果展示 先来看一下数据情况以及可视化效果,本项目使用了pyecharts绘制了日历图、雷达图、折线图、柱状图、饼图和平行坐标系。完整代码附后: 数据如下: 日历图: 饼图: …

拿捏数据结构-top_k问题

top_k问题时间复杂度的计算 这里提前说明&#xff0c;时间复杂度的计算的目的是来计算向上调整的更优还是向下调整更优&#xff0c;从肉眼看的话向下调整优于向上调整&#xff0c;接下来我们进行时间复杂度的计算。 此时我们会用到等比数列求和以及裂项相消 如图 首先我们假设求…

Github Actions/workflow的使用

背景 Github提供了免费的Actions执行workflows工作流&#xff0c;在CI/CD场景下可用于跑测试用例、构建、打包、部署/发版等操作。 使用介绍 工作流简介 1个project可以配置多个workflow&#xff0c;每个workflow使用一个yaml文件配置&#xff1b;单个workflow可以配置多个…

身份认证页面该怎么设计更加合理?

一、认证页面的作用 认证页面在应用程序中具有以下几个重要的作用&#xff1a; 验证用户身份&#xff1a;认证页面的主要作用是验证用户的身份。通过要求用户提供正确的凭据&#xff08;如用户名和密码、生物特征、验证码等&#xff09;&#xff0c;认证页面可以确认用户是合法…

使用华为快传同步文件至电脑

使用华为快传同步文件至电脑&#xff0c;电脑端未发现设备解决办法 1、手机和电脑连同一网络 2、打开手机华为分享&#xff0c;打开电脑网络 3、网络中找到设备&#xff0c;输入账户密码进行连接&#xff08;未找到设备往下继续看&#xff09; 未找到设备解决办法&#xff1…