项目介绍
这里是我参加Funpack第三季第二期活动的任务总结报告,我所完成的是任务一,搭建一个手指数量辨识工具。板卡上集成了光照传感器,将板卡平放后,伸出不同数量的手指在板卡上挥动,识别出有几根手指。
我将按照以下步骤进行开发板的控制开发:
步骤 1: 初始化
- 启动系统,准备好光传感器模块和ADC(模数转换器)功能。
步骤 2: 获取ADC值
- 通过板载光传感器采集实时的光强数据,转换为相应的ADC值。
步骤 3: 实时数据采集和处理
- 连续检测ADC值,将数据存储在缓冲区中。
步骤 4: 数据分析和挥动规律检测
- 利用算法对采集的数据进行分析与处理,检测数据中的光强规律变化。
- 寻找光强值的高峰和低谷,代表光线变暗和变亮的时刻。
步骤 5: 手指挥动识别
- 通过规律检测算法确定挥手动作的特征,如从光线变暗到变亮的持续时间或幅度。
- 基于确切的规律及阈值,识别手指的挥动次数。
步骤 6: 提示与反馈
- 在识别出手指挥动次数后,输出结果
步骤 7: 循环检测
- 持续循环执行上述步骤,保持对光传感器数据的实时监测和手指挥动的识别。
通过这个流程,你可以持续监测光传感器的输出,利用适当的算法和规律检测技术来识别手指的挥动次数,从而实现对手指挥动的智能识别和监测。
主要硬件介绍
PIC24FJ128GA705 微控制器:
16位微控制器,低功耗设计。时钟频率为32MHz,提供强大的处理能力。集成了12位ADC,用于模拟信号转数字信号转换,如光传感器的数据采集。
Wi-Fi模块 WINC1510:
基于 Microchip 的 ATWINC1510 技术,是一款低功耗认证的 IoT 网络控制器。允许设备通过 Wi-Fi 连接到云服务(如 Google IoT Cloud 或 AWS),实现远程数据传输和控制。
ATECC608 密码协处理器:
集成在控制器板上,用于生成私钥和公钥,加密消息传输以确保通信安全。
传感器:
TEMT6000X01 光传感器:
连接到PIC控制器的10位ADC,用于检测环境光照强度变化。
MCP9808 温度传感器:
通过I2C接口连接,用于测量温度范围在-20℃至100℃之间,具有0.25℃的典型精度。
PIC IoT WA开发板:
可以通过微型USB端口或4.2V锂电池供电,提供灵活的供电方式。具有板上编程仿真器和调试器(PKOB),支持串口通信和逻辑分析功能。
这个系统结合了低功耗的 PIC 微控制器、Wi-Fi模块、安全密码协处理器和多种传感器,实现了智能控制和监测功能,适合用于物联网应用中。通过集成这些组件,可以实现实时数据采集、通信和安全加密等功能,为物联网设备提供稳定可靠的运行和通信环境。
主要软件介绍
在进行开发时,我使用官方的 MPLAB X IDE。在首次安装 IDE 后,需要安装适用于 16 位微控制器的编译器工具。安装完编译器后,可以通过点击右上角的 "MCC" 按钮,进入图形化配置界面。
我们需要配置串口外设
点击添加后,在此处界面进行更加具体的配置
而在此处,需要对串口所对应的引脚进行配置
光传感器我们是使用adc的引脚进行模拟量的测量,所以我们也需对adc外设开启,并设置使用。具体的配置参考串口的配置,也可以看视频里的介绍。
uint8_t start_flag=0;
#define normal_average_value 1111
#define invertal 150
uint8_t deep_num=0;
uint8_t normal_count=0;
uint8_t dir=0;
int main(void)
{
// initialize the device
SYSTEM_Initialize();
uint16_t i=0;
uint16_t data=0,last_data=0;
uint16_t total_count=0;
while (1)
{
//printf("%d: %d\r\n",i++,get_linght_adc_value());
//err_led_Toggle();
data=get_linght_adc_value();
if(!start_flag ){
if(abs(data-normal_average_value) > invertal){
start_flag=1;
last_data=data;
dir=0;
delay_ms(20);
printf("start\r\n");
}
}else{
total_count++;
if(abs(data-normal_average_value) > invertal){
if(!dir){//??
if(last_data > data){
printf("ccc: %d:%d\r\n",last_data,data);
}else{
printf("bbb +1: %d:%d\r\n",last_data,data);
deep_num++;
dir=1;
}
}else{//??
if(last_data > data){
printf("ddd: %d:%d\r\n",last_data,data);
dir=0;
}else{
printf("eeee: %d:%d\r\n",last_data,data);
}
}
}
last_data=data;
if(total_count>2000){
start_flag=0;
dir=0;
total_count=0;
printf("\r\nfinger_num => %d\r\n\r\n",deep_num);
deep_num=0;
}
}
// UART1_Write(0x03);
// UART1_Write(0xFC);
//
//
// UART1_Write(data);
// UART1_Write(data>>8);
//
// UART1_Write(0xFC);
// UART1_Write(0x03);
// delay_ms(5);
// Add your application code
}
return 1;
}
代码部分核心逻辑非常简单:首先:
设定环境下的 ADC 平均值。在主循环中持续监测 ADC 值
一旦检测到值显著低于设定值,表示周围有遮挡物通过,系统将进入检测状态,该状态大约持续 2 秒(可根据需要调整)
在检测状态下,系统将获取每个 ADC 值,并进行分析统计,以便确定数据流中存在的波谷数,每个波谷对应一根手指
尽管这种检测方式易于理解和实现,但当手指数量增多时,系统可能会出现不准确的情况
总结
在本次活动中,学习了如何pic家的相关芯片。在过程中遇到的问题,通过百度搜索都能找到适合的答案,使自我得到了提升,感谢硬禾学堂平台。