软件平台:MobaXterm
硬件:HC-SR04型 超声波模块(superaudible) (下图所示)
HC-SR04型 超声波模块:四根引脚分别是:
Vcc — 接5v , GND — 接地, Trig引脚 一 接 wPi 0 ,Echo引脚 一 接 wPi 1
1
测距原理:
超声波测距模块
是用来测量距离的一种产品,发送和接收超声波之间的时间差与声音传播速度, 计算出
超声波
模块到前方障碍物的距离
时间差 = (接收点时间 一 发送点时间 ) / 2
距离 = 速度(340m/s)x 时间差
时序逻辑:
时间函数原型:
#include<sys/time.h>
int gettimeofday(struct timeval *tv,struct timezone *tz )
gettimeofday()
会把目前的时间用
tv
结构体返回,当地时区的信息则放到
tz
所指的结构中
struct
timeval
{
long
tv_sec
;
/*
秒
*/
long
tv_usec
;
/*
微妙
*/
};
代码如下:
/*
超声波测距离
superaudible.c 文件
*/
#include <stdio.h>
#include <sys/time.h>
#include <wiringPi.h>
#include <unistd.h>
#define Trig 0 //信号发射引脚
#define Echo 1 //接受信号引脚
double getDistance()
{
double dis;
struct timeval start;
struct timeval stop;
digitalWrite(Trig ,LOW);
usleep(5);
digitalWrite(Trig ,HIGH);
usleep(10);
digitalWrite(Trig ,LOW);//以上 Trig为10us的触发信号
/*above init CSB*/
while(!digitalRead(Echo));//Echo=0,waiting
gettimeofday(&start,NULL);//Echo=1,start counte timer
while(digitalRead(Echo));//Echo=1,waiting
gettimeofday(&stop,NULL);//Echo=0,stop counte timer
//发射端探测到物体时所用的时间,接收端接收到数据所用的时间,(两者作差)/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 ;//路程 = 速度 x 时间/2
return dis;
}
int main()
{
double dis;
if(wiringPiSetup() == -1)
{
printf("initWringPi error!\n");
return -1;
}
pinMode(Trig, OUTPUT);//设为输出
pinMode(Echo, INPUT);//设为输入
while(1)
{
dis = getDistance();
printf("dis = %.2fcm\n",dis);
//printf("dis = %lf\n",dis); //用这条语句,不稳定,容易卡住
usleep(100000);//每0.1s测一次距离
}
return 0;
}
运行结果:
遇到的问题: 程序运行中,会卡住,测距中断
问题: 在 while()循环里面
参考: 其他的人写的 树莓派的代码, 把 printf("dis = %lf\n",dis); 这句改了 , 用 printf("dis = %.2fcm\n",dis); 可以运行了。