用树莓派实现超声波测距

目录

1、HC-SR04超声波模块说明

1.1 超声波测距原理 

1.2 超声波的时序图

2、时间函数

2.1 函数原型

2.2、测试代码(time.c)

3、超声波代码实现(csb.c)


1、HC-SR04超声波模块说明

1.1 超声波测距原理 

让它发送波:给Trig端口至少10us的高电平

开始发送波:Echo信号由低电平跳转到高电平

接收返回波:Echo信号由高电平跳转回低电平

计算时间:Echo引脚维持高电平的时间!

                  开始发送波,启动定时器,接收到返回波,停止计时器

计算距离:测试距离=(高电平时间*声速(340m/s))/2

1.2 超声波的时序图

2、时间函数

2.1 函数原型

#include <sys/time.h>

int gettimeofday(struct timeval *tv,struct timezone *tz )

gettimeofday()会把目前的时间用tv 结构体返回,当地时区的信息则放到tz所指的结构中。

struct  timeval
{
    long tv_sec;/*秒*/
    long tv_usec;/*微妙*/
};

2.2、测试代码(time.c)

#include <stdio.h>
#include <sys/time.h>

//#include<sys/time.h>
//int gettimeofday(struct timeval *tv,struct timezone *tz )
//struct timeval
//{
//long tv_sec;/*秒*/
//long tv_usec;/*微妙*/
//};


void cnttime()
{
    int i,j;
    for(i=0;i<100;i++){
        for(j=0;j<10000;j++){
        }   
    }   
}

int main()
{
    struct timeval timestart; //定义结构体开始时间
    struct timeval timestop;//定义结构体结束时间

    gettimeofday(&timestart,NULL);
    cnttime();
    gettimeofday(&timestop,NULL);

    long timediff = (timestop.tv_sec-timestart.tv_sec)*1000000+(timestop.tv_usec-timestart.tv_usec);//这是将单位化为微妙
    printf("raspberryPi count 100W time:%ld\n",timediff);//在树莓派上数100w次需要多少微妙
    return 0;
}

运行结果:

3、超声波代码实现(csb.c)

● 重点提醒:

① 代码编写一定要结合时序图分析过程;

② 计算波在空气中的时间,要尽量统一把时间单位换算成微妙。

#include <stdio.h>
#include <sys/time.h>
#include <wiringPi.h>
#include <stdlib.h>
#include <unistd.h>

#define Trig 0
#define Echo 1

double get_distance()//double定义距离,比float精度更高
{
    double distance;

    struct timeval start;
    struct timeval stop;

    pinMode(Trig,OUTPUT);//输出,发送波
    pinMode(Echo,INPUT);//输入,接收波

    digitalWrite (Trig, LOW);//结合时序图,低电平上先维持5us
    usleep(5);
    digitalWrite (Trig, HIGH);//上到高电平 维持10us
    usleep(10);
    digitalWrite (Trig, LOW);//最后拉到低电平,完成整个放波流程
   /*以上是对超声波进行初始化*/
    while(!digitalRead(Echo));//卡点,当变为高电平的时候就跳出循环。
    gettimeofday(&start,NULL);
    while(digitalRead(Echo));
    gettimeofday(&stop,NULL);

    long diffTime = (stop.tv_sec-start.tv_sec)*1000000+(stop.tv_usec-start.tv_usec);
    //long diffTime = 1000000*(stop.tv_sec - start.tv_sec)+(stop.tv_usec - start.tv_usec);
    distance = diffTime*34000/2000000; //记住时间很小,如果不先乘的话就会为0,所以先乘\
以34000,也可以用(double)强制转换, 距离 = 时间 * 速度(340m/s)/ 2     注意单位换算
    return distance;
}

int main()
{
    double dis;
    if(wiringPiSetup()==-1){ //wiringPi库初始化
        fprintf(stderr,"%s","initWringPi error");    //将错误打印出来
        exit(-1);

    }
    while(1){
        dis = get_distance();//距离值
        printf("dis = %lf\n",dis);//双精度用lf%
        usleep(500000);
    }

    return 0;
}

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值