(十)基于Linux算时差——超声波测距原理及代码实现

学习日志(十)

基于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 ,数据没毛病。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小爪.exe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值