学习日志(十)
基于Linux算时差——超声波测距原理及代码实现
测距原理基本说明
超声波测距模块:是用来测量距离的一种产品,通过发送和收超声波,利用时间差和声音传播速度,计算出模块到前方障碍物的距离。
选型:HC-SR04
接线参考:模块除了两个电源引脚外,还有Trig,Echo引脚。
怎么让它发波
Trig信号:给Trig端口至少10us的高电平
怎么知道开始发了
Echo信号:由低电平跳转到高电平,表示开始发送波(个人理解:这里看时序,好像是先发完波才由低电平跳到高电平,其实发波和低电平跳到高电平是同时进行的)
怎么知道接收了返回波
Echo信号:由高电平跳转回低电平,表示波回来了
怎么算时间
Echo引脚维持高电平的时间!
波发出去的那一下,开始启动定时器
波反回来的那一下,我们开始停止定时器,计算出中间经过多少时间
怎么算距离
距离=速度(340m/s)*时间/2
时序参考
直接撸代码
1 #include "sys/time.h"
2 #include "wiringPi.h"
3 #include "stdio.h"
4 #include "unistd.h"
5
6 #define Trig 0
7 #define Echo 1
8
9
10 double getDistance()
11 {
12 double dis;
13 struct timeval start;
14 struct timeval stop;
15
16 pinMode(Trig,OUTPUT);
17 pinMode(Echo,INPUT);
18
19 digitalWrite(Trig,LOW);
20 usleep(5);
21 digitalWrite(Trig,HIGH);
22 usleep(10);
23 digitalWrite(Trig,LOW); //以上是维持10微妙的高电平; 用来发波
24 /*above init CSB*/
25
26 while(!digitalRead(Echo));
27 gettimeofday(&start,NULL);//开始计时
28 while(digitalRead(Echo));// 接受到反回的波,电平由高变低
29 gettimeofday(&stop,NULL);//停止计时
30
31 long difftime = 1000000*(stop.tv_sec-start.tv_sec)+(stop.tv_usec-start.tv_usec);//计算时间
32 dis = (double)difftime /1000000 *34000/2;//计算距离 单位是cm
33
34 return dis;
35 }
36
37 int main()
38 {
39 double dis;
40
41 if(wiringPiSetup()==-1){
42 fprintf(stderr,"%s","init wiringpi error");
43 }
44 while(1){ // 每500ms测距一次
45 dis = getDistance();
46 printf("distance = %lf cm\n",dis);
47 usleep(500);
48 }
49
50 return 0;
51 }
注:获取距离的时候,各个变量类型的转换,距离的单位cm还是m
执行现象:
超声波此时距离天花板大概2.6 -2.7m ,数据没毛病。