目录
一,超声波模块说明
①模块参数
相关参数 |
模块型号:HC-SR04
|
工作电压 | DC 5V |
工作电流 | 15mA |
工作频率 | 40kHz |
最远射程 | 4m |
最近射程 | 2cm |
测量角度 | 15度 |
输入触发信号 | 10uS 的 TTL 脉冲 |
输出回响信号 | 输出TTL电平信号,与射程成比例 |
规格尺寸 | 45*20*15mm |
②测距实现原理
超声波测距模块是用来测量距离的一种产品,通过
发送和收超声波
,利用
时间差
和
声音传播速度
, 计算出模块到前方障碍物的距离。
③IO口接线说明
型号:
HC-SR04
接线参考:模块除了两个电源引脚外,还有
TRIG
,
ECHO
引脚
- Vcc:+5V电源供电
- Trig:输入触发信号0(可以触发测距)
- Echo:传出信号回响1(可以传回时间差)
- Gnd:接地
二,测距实现流程
①实现过程
①怎么让它发波:Trig,给Trig端口至少10us的高电平 ;
②怎么知道开始发了:Echo信号,由低电平跳转到高电平,表示开始发送波;
③怎么知道接收了返回波:Echo,由高电平跳转回低电平,表示波回来了;
④怎么算时间:Echo引脚维持高电平的时间! 波发出去的那一下,开始启动定时器,波回来的那一下,我们开始停止定时器,计算出中间经过多少时间。
⑤怎么算距离:距离=速度(340m/s)*时间/2 (注意速度单位和时间单位的换)
★实现过程可以结合时序图分析波的运动过程
②时序图
三,代码实现
①时间函数
#include<sys/time.h> int gettimeofday(struct timeval *tv,struct timezone *tz )
gettimeofday() 会把目前的时间用 tv 结构体返回,当地时区的信息则放到 tz 所指的结构中struct timeval { long tv_sec;/*秒*/ long tv_usec;/*微妙*/ };
②测试代码
计算程序在当前环境中数数10000次耗时多少微秒。 1 #include <stdio.h> 2 #include<sys/time.h> 3 4 //int gettimeofday(struct timeval *tv,struct timezone *tz ) 5 /*struct timeval 6 { 7 long tv_sec;//秒 8 long tv_usec;//微妙 9 }*/ 10 void cntTest()//数数10000次 11 { 12 int i,j; 13 for(i=0;i<100;i++) 14 for(j=0;j<100;j++); 15 } 16 int main() 17 { 18 struct timeval startTime; 19 struct timeval stopTime; 20 21 gettimeofday(&startTime,NULL);//起始时间 22 cntTest();//数10000次 23 gettimeofday(&stopTime,NULL);//结束时间 24 25 long diffTime = 1000000*(stopTime.tv_sec-startTime.tv_sec)+(stopTime.tv_usec-startTime.tv_usec); 26 //算出时间差值 //秒换算微秒 27 printf("全志h6在linux中数10000次需要时间%lduS\n",diffTime); 28 29 return 0; 30 }
运行结果:
orangepi@orangepizero2:~/hardwareSoft$ ./a.out 全志h6在linux中数10000次需要时间151uS orangepi@orangepizero2:~/hardwareSoft$ ./a.out 全志h6在linux中数10000次需要时间151uS orangepi@orangepizero2:~/hardwareSoft$ ./a.out 全志h6在linux中数10000次需要时间151uS orangepi@orangepizero2:~/hardwareSoft$
③测距代码实现和验证
1 #include <stdio.h> 2 #include <wiringPi.h> //IO 3 #include <sys/time.h> //时间 4 #include <stdlib.h> 5 #include <unistd.h> 6 7 #define Trig 0 //控制端/发送波 8 #define Echo 1 //接收波 9 10 double getDistance() 11 { 12 double dis; //定义距离 13 14 struct timeval start; //定义起始时间 15 struct timeval stop; //定义停止时间 16 17 //初始化IO口 18 pinMode(Trig,OUTPUT); //Trig口为输出口,放波 19 pinMode(Echo,INPUT); //Echo口为输入口,收波 20 21 22 digitalWrite(Trig,LOW); //触发信号。 23 usleep(5); //在低电平上维持5微秒后, 24 25 digitalWrite(Trig,HIGH);//上到高电平维持10微秒,放波10微秒 26 usleep(10); 27 28 digitalWrite(Trig,LOW); //最后拉到低电平,完成整个放波流程 29 30 31 while(!digitalRead(Echo)); //用digitalRead读Echo的值,维持在低电平,刚开始的值为0,用!取反值为1。进入高电平等待 32 gettimeofday(&start,NULL); //获取进入高电平后起始时间 33 while(digitalRead(Echo)); //维持高电平继续等待,等到高电平不成立后进入低电平后停止 34 gettimeofday(&stop,NULL); //获取停止时间 35 36 long diffTime = 1000000*(stop.tv_sec-start.tv_sec)+(stop.tv_usec-start.tv_usec);//计算波在空气中的时间 37 //秒的差值换算成微秒 38 dis = (double)diffTime/1000000 * 34000 / 2; // 距离=速度(340m/s)*时间/2。波在空气中有来回,需要除以2 39 //微秒换算成秒 //米换算厘米 40 return dis; 41 } 42 int main() 43 { 44 double dis; //定义距离 45 46 //初始化wiringPi库,并判断 47 if(wiringPiSetup() == -1){ 48 fprintf(stderr,"%s","initWiringPi error"); 49 exit(-1); 50 } 51 52 while(1){ 53 dis = getDistance(); 54 printf("dis = %lf\n",dis); 55 usleep(500000); 56 } 57 58 return 0; 59 }
编译结果:超声波模块距电脑显示器的距离由近到远的距离/cm
orangepi@orangepizero2:~/hardwareSoft$ sudo ./a.out dis = 4.012000 dis = 3.162000 dis = 2.822000 dis = 5.202000 dis = 5.083000 dis = 5.406000 dis = 7.021000 dis = 7.038000 dis = 10.166000 dis = 10.744000 dis = 10.761000
④视频演示链接