超声波模块介绍
需要提供一个10uS以上脉冲触发信号,该模块内部将发出8个40KHz周期电平并检测回波。一旦检测到有回波信号则输出回响信号。回响信号的脉冲宽度与所测的距离成正比。由此听过发射信号到的回响信号时间间隔可以计算得到距离。
公式:uS/58=厘米或者uS/148=英寸
距离=高电平时间*声速(340M/S)/2
建议测量周期为60 ms以上,以防止发射信号对回响信号的影响。 超声波测距源代码
struct timeval结构体
struct timeval
{
__time_t tv_sec; /* Seconds. */
__suseconds_t tv_usec; /* Microseconds. */
};
我们知道 timeval结构体中含有两个变量,tv_sec表示的是秒数,1秒=1000000微妙,第二个参数tv_usec表示的就是微秒数
树莓派超声波测距代码
#include <wiringPi.h>
#include <stdio.h>
#include <sys/time.h>
#define Trig 4
#define Echo 5
/*超声波模块初始化*/
void chaoShengBoInit(void)
{
pinMode(Echo,INPUT);
pinMode(Trig,OUTPUT);
}
/*测距原理*/
float disMeasure(void)
{
struct timeval tv1;
struct timeval tv2;
long start,stop;
float dis;
digitalWrite(Trig,LOW);
delayMicroseconds(2);
digitalWrite(Trig,HIGH);
delayMicroseconds(10); //发出10微秒的方波
digitalWrite(Trig,LOW);
while(digitalRead(Echo) != 1);
gettimeofday(&tv1,NULL); //获取当前时间,开始接收到返回信号的时候
while(digitalRead(Echo) != 0);
gettimeofday(&tv2,NULL); //获取当前时间,最后接收到返回信号的时候
start = tv1.tv_sec * 1000000 + tv1.tv_usec;
stop = tv2.tv_sec * 1000000 + tv2.tv_usec;
dis = (float)(stop - start)/1000000 * 34000/2; //计算出时间,算出距离
return dis;
}
int main(void)
{
float dis; //用来存放测试的距离
if(wiringPiSetup() == -1){ //端口初始化
printf("setup wiringPi failed\n");
return -1;
}
chaoShengBoInit();
while(1){
dis = disMeasure();
printf("distance = %0.2f cm\n",dis);
delay(1000);
}
return 0;
}
运行效果