超声波手势识别(STM32四路超声波获取)

       超声波手势识别在市场上已经有见实现,但研究其传感器发现并不是市场上随意可见的,如果暂且考虑成本,该如何入门实现简单的手势识别呢。聊天中老师给出一个很好的提议,就是固定四个超声波,分别为上下左右,然后进行程序上的对应编号,用单片机实现四路超声波的距离数据读取,然后程序分析读取的数据进而判断手势。stm32单片机有多个定时器,每个定时器接入一个超声波,分别接入四个,定时器分别开始工作以计数,将得到的距离信息一次性发送四个方向的值到串口,串口连接到PC机,PC机获取到四组值,然后进行分析解释。下面将实现第一步,STM32 实现四路超声波获取

实现效果:

Python的串口程序上每次从串口获取到上下左右四组值,并输出在控制台,相关的串口实现可以参考:Python的串口通信(pyserial)

超声波手势识别(STM32四路超声波获取)

 

超声波手势识别(STM32四路超声波获取)

超声波模块:HC-SR04

单片机:stm32f103c8t6

注意:程序正常工作的前提是必须按复位键

获取值【上,下,左,右】

对应echo的IO【PA0   ,   PA11   ,   PA7   ,   PB6】

对应trig 的IO【PB12   ,   PB13   ,   PB14   ,   PB15】

对应定时器【定时器2通道1,定时器1通道4,定时器3通道2,定时器4通道1】

串口1:A9为TX    A10为RX

超声波使用基本介绍:

(1)采用IO口TRIG触发测距,给至少10us的高电平信号;

(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;

(3)有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S)) (未实现)

 

超声波时序:

超声波手势识别(STM32四路超声波获取)

 

主函数代码:

1 #include "stm32f10x.h" //STM32头文件 2 #include "sys.h" 3 #include "delay.h" 4 #include "usart.h" 5 #include "timex.h" 6 #include "trig.h" 7 8 extern u8 TIM3CH1_CAPTURE_STA; //输入捕获状态 9 extern u16 TIM3CH1_CAPTURE_VAL; //输入捕获值 10 extern u8 TIM3CH2_CAPTURE_STA; //输入捕获状态 11 extern u16 TIM3CH2_CAPTURE_VAL; //输入捕获值 12 extern u8 TIM2CH1_CAPTURE_STA; //输入捕获状态 13 extern u16 TIM2CH1_CAPTURE_VAL; //输入捕获值 14 extern u8 TIM4CH1_CAPTURE_STA; //输入捕获状态 15 extern u16 TIM4CH1_CAPTURE_VAL; //输入捕获值 16 extern u8 TIM1CH4_CAPTURE_STA; //输入捕获状态 17 extern u16 TIM1CH4_CAPTURE_VAL; //输入捕获值 18 int main (void){//主程序 19 u32 temp1=0; 20 //u32 temp2=0; 21 u32 temp3=0; 22 u32 temp4=0; 23 u32 temp24=0; 24 RCC_Configuration(); //时钟设置 25 TR_Init(); //输出初始化 26 27 USART1_Init(115200); 28 29 TIM3_Cap_Init(0XFFFF,72-1); //以1Mhz的频率计数 //打印总的高点平时间 30 TIM2_Cap_Init(0XFFFF,72-1); //以1Mhz的频率计数 //打印总的高点平时间 31 TIM4_Cap_Init(0XFFFF,72-1); //以1Mhz的频率计数 //打印总的高点平时间 32 TIM1_Cap_Init(0XFFFF,72-1); //以1Mhz的频率计数 //打印总的高点平时间 33 delay_s(1); 34 printf("********** INIT ALL 11*********\r\n"); 35 PBout(12)=1; 36 delay_us(13); 37 PBout(12)=0; 38 39 PBout(14)=1; 40 delay_us(13); 41 PBout(14)=0; 42 43 PBout(15)=1; 44 delay_us(13); 45 PBout(15)=0; 46 47 PBout(13)=1; 48 delay_us(13); 49 PBout(13)=0; 50 51 while(1){ 52 //定时器2通道1 53 if(TIM2CH1_CAPTURE_STA&0X80)//成功捕获到了一次上升沿 54 { 55 temp1=TIM2CH1_CAPTURE_STA&0X3F; 56 temp1*=65536;//溢出时间总和 57 temp1+=TIM2CH1_CAPTURE_VAL;//得到总的高电平时间 58 printf("time2-----:%d \r\n",temp1);//打印总的高点平时间 59 TIM2CH1_CAPTURE_STA=0;//开启下一次捕获 60 PBout(12)=1; 61 delay_us(13); 62 PBout(12)=0; 63 } 64 65 //定时器1通道4 66 if(TIM1CH4_CAPTURE_STA&0X80)//成功捕获到了一次上升沿 67 { 68 temp24=TIM1CH4_CAPTURE_STA&0X3F; 69 temp24*=65536;//溢出时间总和 70 temp24+=TIM1CH4_CAPTURE_VAL;//得到总的高电平时间 71 printf("time14-----:%d \r\n",temp24);//打印总的高点平时间 72 TIM1CH4_CAPTURE_STA=0;//开启下一次捕获 73 PBout(13)=1; 74 delay_us(13); 75 PBout(13)=0; 76 } 77 //定时器3通道2 78 if(TIM3CH2_CAPTURE_STA&0X80)//成功捕获到了一次上升沿 79 { 80 temp3=TIM3CH2_CAPTURE_STA&0X3F; 81 temp3*=65536;//溢出时间总和 82 temp3+=TIM3CH2_CAPTURE_VAL;//得到总的高电平时间 83 printf("time32----:%d \r\n",temp3);//打印总的高点平时间 84 TIM3CH2_CAPTURE_STA=0;//开启下一次捕获 85 PBout(14)=1; 86 delay_us(13); 87 PBout(14)=0; 88 } 89 //定时器4通道1 90 if(TIM4CH1_CAPTURE_STA&0X80)//成功捕获到了一次上升沿 91 { 92 temp4=TIM4CH1_CAPTURE_STA&0X3F; 93 temp4*=65536;//溢出时间总和 94 temp4+=TIM4CH1_CAPTURE_VAL;//得到总的高电平时间 95 printf("time4-----:%d \r\n",temp4);//打印总的高点平时间 96 TIM4CH1_CAPTURE_STA=0;//开启下一次捕获 97 PBout(15)=1; 98 delay_us(13); 99 PBout(15)=0; 100 } 101 102 //发送最终结果------------------------------------ 103 if((temp1 >0)&&(temp24 >0)&&(temp3 >0)&&(temp4 >0)){ 104 105 printf("[%d,%d,%d,%d]",temp1,temp24,temp3,temp4); 106 temp1=temp24=temp3=temp4=0; 107 PBout(0)=1; 108 } 109 110 } 111 }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpzddd.html