一、HC-SR04超声波模块
1.简介
超声波测距模块是用来测量距离的一种产品,通过发送和收超声波,利用时间差和声音传播速度,计算出模块到前方障碍物的距离。模块除了两个电源引脚外,还有TRIG,ECHO引脚,可接入单片机作为外设开发。
2.如何使用超声波模块
超声波模块测距原理是通过TRIG发送波,ECHO接受波来实现的,通过计算来回时间算出超声波距离。
超声波时序图
观察时序图可知,通过给Trig端口至少10us的高电平触发模块发出超声波信号,当Echo信号由低电平跳转到高电平,表示开始发送波,由高电平跳转回低电平,表示波回来了。
通过Echo引脚维持高电平的时间得到超声波来回的时间,我们可以当波发出去的那一下,开始启动定时器,波回来的那一下,我们开始停止定时器,计算出中间经过多少时间。
距离=速度(340m/s)*时间/2。
二、时间函数(gettimeofday)
可实现在Linux平台下进行时间数数,可用来记录超声波模块发出波到收回波的时间
函数原型
#include<sys/time.h>
int gettimeofday(struct timeval *tv,struct timezone *tz )
//
gettimeofday()会把目前的时间用tv 结构体返回,当地时区的信息则放到tz所指的结构中
//
struct timeval
{
long tv_sec;/*秒*/
long tv_usec;/*微妙*/
};
测试代码
//计算程序在此环境中数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(×tart,NULL);//获取当前时间
cntTest();//进行数数
gettimeofday(×top,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;
}