完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
|
|
相关推荐
1个回答
|
|
传感器简介
原相科技公司的 PAJ-7620U2 芯片内集成了光学数组式传感器单元,可以快速准确的对输入信号进行感应和输出处理。内置光源和环境光抑制滤波器,能在黑暗或低光环境下工作。它支持上、下、左、右、前、后、顺时针旋转、逆时针旋转和挥动的手势动作识别,以及支持物体接近检测等功能。可大致检测物体体积大小和亮度。使用IIC通信接口可达400KHz通信速率。 传感器内部自带 LED 驱动器,传感器感应阵列、目标信息提取阵列和手势识别阵列。传感器工作时通过内部 LED 驱动器,驱动红外 LED 向外发射红外线信号,当传感器阵列在有效的距离中探测到物体时,目标信息提取阵列会对探测目标进行特征原始数据的获取,获取的数据被保存在寄存器中,同时手势识别阵列会对原始数据进行识别处理,最后将手势结果存到寄存器中,用户可根据 I2C 接口对原始数据和手势识别的结果进行读取。 模块原理图 VIN供电输入3.3-5V,GND供电负极,SDA数据线,SCL时钟线,INT中断输出 手势方向定义 STM32F407ZGT6开发板与传感器连接 [tr]STM32开发板手势传感器模块[/tr]
代码片 手势传感器获取感应信息,将结果通过开发版 usart1 串口输给串口调试助手程序显示出来。 在 main 函数中,首先对 USART 串口与 KEY 按键进行初始化配置。然后对传感器paj7620u2 进行初始化配置。当对传感器初始化成功后则退出 while 循环,进入第 21 行paj7620u2 传感器功能测试阶段。 int main(void) { /*初始化USART 配置模式为 115200 8-N-1,中断接收*/ Debug_USART_Config(); EXTI_Key_Config(); printf(" 欢迎使用野火开发板rn"); printf(" 手势识别传感器实验rn"); while(!paj7620u2_init()) //PAJ7620U2传感器初始化 { printf("PAJ7620U2 初始化失败!!!rn"); delay_ms(600); } printf("PAJ7620U2 初始化成功rn"); while(1) { paj7620u2_sensor_test();//PAJ7620U2传感器测试 } } 在 test 函数中,第 12 行使用 scanf 函数,使开发板获取来自串口调试助手发出的控制指令。当开发板接收到的指令字符为“1”时,开发板控制传感器进入手势识别工作模式;当接收到的指令字符为“2”时,开发板控制传感器进入接近检测工作模式;当接收的字符既不是“1”也不是“2”时,则打印提示用户输入合法指令。 /** * @brief PAJ7620U2传感器测试 * @param 无 * @retval 无 */ void paj7620u2_sensor_test(void) { uint32_t ch; Show_Mode_Message();//显示普通测量模式UI while(1) { scanf("%d",&ch); printf("接收到字符:%drn",ch); switch(ch) { case 1: Gesrure_test(); break;//手势检测模式 case 2: Ps_test(); break;//接近检测模式 default: printf("请输入合法指令!rn"); break; } Show_Mode_Message(); } } 手势识别传感器可以工作在手势识别与接近检测 2 种模式状态下。为了进行工作模式 的切换,我们采用了 KEY 按钮外部中端的方式。 KEY 外部中断 当我们想退出当前的工作模式时,可通过按住 key1 按钮,激发产生 EXTI 中断响应。在 IRQHandler 中断处理函数中,(第 9 行)当接受到中断信号时,变量 flag 赋值为 1。 中断代码如下 void KEY1_IRQHandler(void) { //确保是否产生了EXTI Line中断 if(EXTI_GetITStatus(KEY1_INT_EXTI_LINE) != RESET) { flag=1; //清除中断标志位 EXTI_ClearITPendingBit(KEY1_INT_EXTI_LINE); } } 手势识别工作模式 在 Gesrure_test()函数中,首先对 PAJ7620U2 手势识别检测进行初始化,(第 14 行代码)配置其 gesture_arry 数组的参数值。该数组有使能 9 个手势识别的中断标志输出的配置,初始化完毕后,在 while 循环中一直读取手势中断标志寄存器(第 26 行代码),当识别到相应的手势,手势标志会置 1,读取寄存器标志会自动清 0。根据手势的标志手势结果将被打印到串口上。当按下 KEY 按键,在中断处理函数中标志变量 flag 被赋值 1(第 20 行代码),此时关闭 9 个手势识别的检测输出,退出当前的手势识别测试模式。 /** * @brief 手势识别测试 * @param 无 * @retval 无 */ void Gesrure_test(void) { uint8_t status,i; uint8_t data[2]={0x00}; uint16_t gesture_data; paj7620u2_selectBank(BANK0);//进入BANK0 for(i=0;i GS_Write_Byte(gesture_arry[0],gesture_arry[1]);//手势识别模式初始化 } paj7620u2_selectBank(BANK0);//切换回BANK0 printf("按KEY1键退出当前模式rn"); while(1) { if(flag) { flag=0; GS_Write_Byte(PAJ_SET_INT_FLAG1,0X00);//关闭手势识别中断输出 GS_Write_Byte(PAJ_SET_INT_FLAG2,0X00); break; } status = GS_Read_nByte(PAJ_GET_INT_FLAG1,2,&data[0]);//读取手势状态 if(!status) { gesture_data =(uint16_t)data[1]<<8 | data[0]; if(gesture_data) { switch(gesture_data) { case GES_UP: printf("Uprn"); break; //向上 case GES_DOWM: printf("Dowmrn"); break; //向下 case GES_LEFT: printf("Leftrn"); break; //向左 case GES_RIGHT: printf("Rightrn"); break; //向右 case GES_FORWARD: printf("Forwardrn"); break; //向前 case GES_BACKWARD: printf("Backwardrn"); break; //向后 case GES_CLOCKWISE: printf("Clockwisern"); break; //顺时针 case GES_COUNT_CLOCKWISE: printf("AntiClockwisern"); break; //逆时针 case GES_WAVE: printf("Wavern"); break; //挥动 default: break; } } } } } 接近检测测试 Ps_test()函数实现接近检测,获取接近物体的体积大小和亮度的数据。首先对PAJ7620U2 接近检测进行初始化,配置其 proximity_arry 的数组参数值(第 16 行代码),初始化完成后,在 while(1)循环中,读取获取体积大小和亮度的寄存器,并将读取结果打印到串口上。当按下 KEY 按键,在中断处理函数中标志变量 flag 被赋值 1(第 23 行代码),退出当前的接近检测测试模式。 /** * @brief 接近检测测试 * @param 无 * @retval 无 */ void Ps_test(void) { uint8_t i; uint8_t data[2]={0x00}; uint8_t obj_brightness=0; uint16_t obj_size=0; paj7620u2_selectBank(BANK0);//进入BANK0 for(i=0;i GS_Write_Byte(proximity_arry[0],proximity_arry[1]);//接近检测模式初始化 } paj7620u2_selectBank(BANK0);//切换回BANK0 printf("按KEY1键退出当前模式rn"); while(1) { if(flag) { flag=0; break; } obj_brightness = GS_Read_Byte(PAJ_GET_OBJECT_BRIGHTNESS);//读取物体亮度 data[0] = GS_Read_Byte(PAJ_GET_OBJECT_SIZE_1);//读取物体大小 data[1] = GS_Read_Byte(PAJ_GET_OBJECT_SIZE_2); obj_size = ((uint16_t)data[1] & 0x0f)<<8 | data[0]; printf("obj_brightness: %drn",obj_brightness); printf("obj_size: %drn",obj_size); delay_ms(500); } } 总结 本实验可以通过挥舞手势直观的了解传感器的手势识别的基本功能以及接近检测的功能。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1780 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1621 浏览 1 评论
1081 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
728 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1679 浏览 2 评论
1938浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
731浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
570浏览 3评论
596浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
556浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 17:42 , Processed in 0.732715 second(s), Total 76, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号