Orangepi Zero2 全志H616(超声波测距)

一、HC-SR04超声波模块

1.简介

超声波测距模块是用来测量距离的一种产品,通过发送和收超声波,利用时间差和声音传播速度,计算出模块到前方障碍物的距离。模块除了两个电源引脚外,还有TRIG,ECHO引脚,可接入单片机作为外设开发。

2.如何使用超声波模块

超声波模块测距原理是通过TRIG发送波,ECHO接受波来实现的,通过计算来回时间算出超声波距离。

超声波时序图

观察时序图可知,通过给Trig端口至少10us的高电平触发模块发出超声波信号,当Echo信号由低电平跳转到高电平,表示开始发送波,由高电平跳转回低电平,表示波回来了。

通过Echo引脚维持高电平的时间得到超声波来回的时间,我们可以当波发出去的那一下,开始启动定时器,波回来的那一下,我们开始停止定时器,计算出中间经过多少时间。

距离=速度(340m/s)*时间/2。

二、时间函数(gettimeofday)

可实现在Linux平台下进行时间数数,可用来记录超声波模块发出波到收回波的时间

  1. 函数原型

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

//计算程序在此环境中数1万次耗时多少

#include <stdio.h>
#include<sys/time.h>
//int gettimeofday(struct timeval *tv,struct timezone *tz )
void cntTest()
{

        int i,j;

        for(i=0;i<100;i++)
                for(j=0;j<100;j++);
//数10000次

}
int main()
{
        struct timeval timestart;
        struct timeval timestop;

        gettimeofday(&timestart,NULL);//获取当前时间
        cntTest();//进行数数
        gettimeofday(&timestop,NULL);//获取数数后当前时间

        long diffTime =1000000*(timestop.tv_sec-timestart.tv_sec) + (timestop.tv_usec-timestart.tv_usec);//秒和微妙的计算
        printf("H6 Count 1w time=%ld\n",diffTime);//打印结果







        return 0;
}

三、超声波代码实现

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

#define Trig 5
#define Echo 7
double getDistance()//初始化超声波
{
        double dis;

        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);//获取时间1
        while(digitalRead(Echo));//判断超声波回来那一刻
        gettimeofday(&stop,NULL);//再获取时间2
        //时间1和时间2做差
        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;

        return dis;
}

int main()
{

        double dis;
        //wiringPi初始化判断
        if(wiringPiSetup() == -1){

                fprintf(stderr,"%s","initWiringPi error");
                exit(-1);
        }
        while(1){

                dis=getDistance();
                printf("dis =%lf\n",dis);//不断获取超声波距离
                usleep(500000);

        }


        return 0;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值