超声波测距

超声波测距

1.测距原理基本说明

超声波测距模块是用来测量距离的一种产品,通过发送和收超声波,利用时间差和声音传播速度,计算出模块到前方障碍物的距离

image-20240506154232911

型号:HC-SR04
接线参考:模块除了两个电源引脚外,还有TRIG,ECHO引脚

image-20240506154259102

2.接线:

vcc接5V

GND接GND

TRIG接0口

ECHO接1口

接线超声波

  • 怎么让它发波
    Trig,给Trig端口至少10us的高电平
  • 怎么知道开始发了
    Echo信号,由低电平跳转到高电平,表示开始发送波
  • 怎么知道接收了返回波
    Echo,由高电平跳转回低电平,表示波回来了
  • 怎么算时间
    Echo引脚维持高电平的时间!
    波发出去的那一下,开始启动定时器
    波回来的拿一下,我们开始停止定时器,计算出中间经过多少时间
  • 怎么算距离
    距离=速度(340m/s)*时间/2

3.时序

image-20240506154431547

4.时间函数

函数原型

#include<sys/time.h>
int gettimeofday(struct timeval *tv,struct timezone *tz )
gettimeofday()//会把目前的时间用tv 结构体返回,当地时区的信息则放到tz所指的结构中
struct timeval
{
long tv_sec;/*秒*/
long tv_usec;/*微妙*/
};

测试代码

//计算程序在当前环境中数数10万次耗时多少
#include <sys/time.h>//时间头文件
#include <stdio.h>
//int gettimeofday(struct timeval *tv,struct timezone *tz )
void mydelay()
{
	int i,j;
	for(i=0;i<100;i++){
	for(j=0;j<1000;j++);
	}
}
int main()
{
	struct timeval startTime;//启动时间
	struct timeval stopTime;//结束时间
    
	gettimeofday(&startTime,NULL);
	mydelay();//开始数数
	gettimeofday(&stopTime,NULL);
    
    long diffTime = 1000000*(stopTime.tv_sec - startTime.tv_sec) +(stopTime.tv_usec -startTime.tv_usec);//计算秒的差值+微秒的差值
	
    printf("全志H6的Linux数100000耗	时%ldus\n",diffTime);
    
	return 0;
}

5.代码实现和验证

#include <stdio.h>
#include <sys/time.h>//时间操作库,用于获取高精度时间
#include <wiringPi.h>// Wiring Pi库,用于树莓派的GPIO操作
#include <stdlib.h>
#include <unistd.h>

#define Trig 0//定义触发引脚为GPIO 0
#define Echo 1// 定义回声引脚为GPIO 1

// 函数用于测量距离并返回以厘米为单位的值
double getDistance()
{
    double dis;//储存算出的距离
    struct timeval start;//开始时间
    struct timeval stop;//结束时间
    
    pinMode(Trig, OUTPUT);// 设置触发引脚为输出模式
    pinMode(Echo, INPUT);//设置回声引脚为输入模式
    
    digitalWrite(Trig ,LOW);//触发引脚拉低
    usleep(5);//维持5微秒低电平
    
    digitalWrite(Trig ,HIGH);//将触发引脚拉高,发送超声波脉冲
    usleep(10);//维持10微秒高电平
    digitalWrite(Trig ,LOW);//再拉下去才是一个10微秒的方波
    /*above init CSB*/
    
    while(!digitalRead(Echo));//等待回声引脚变为高电平,表示超声波被反射回来
    gettimeofday(&start,NULL);//获取开始时间
    while(digitalRead(Echo));// 等待回声引脚再次变为低电平,表示超声波的回波已经被接收完毕
    gettimeofday(&stop,NULL);//获取结束时间
    
    long diffTime = 1000000*(stop.tv_sec-start.tv_sec)+(stop.tv_usec - start.tv_usec);// 计算超声波往返的时间差(微秒)
    printf("diffTime = %ld\n",diffTime);
    dis = (double)diffTime/1000000 * 34000 / 2;//根据超声波在空气中的传播速度(34000厘米/秒)和时间差计算距离 
    
    return dis;// 返回计算出的距离
}

int main()
{
    double dis;
    if(wiringPiSetup() == -1){//初始化wiringPi库,如果失败则打印错误并退出
        fprintf(stderr,"%s","initWringPi error");
        exit(-1);//异常退出程序
   }
    while(1){
        dis = getDistance();// 调用函数测量距离
        printf("dis = %lf\n",dis);
        usleep(500000);// 暂停0.5秒,用于下一次测量
   }
    return 0;
}   


###5.1 验证结果:

超声波编译

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值