超声波传感器测距
分享一个树莓派超声波测距教程。非常基础的小制作,可以激发一下树莓派或其它基础嵌入式开发兴趣。
首先准备一个超声波传感器(这里是HC-HR04型)、树莓派及连接排线。
参考对照表将传感器引脚与树莓派连接,连接方式不唯一,一定仔细连接。传感器VCC引脚连接树莓派5V引脚,GND连接0V接地引脚,Trig、Echo根据具体代码连接,我这里是Trig引脚连接GPIO3,Echo连接GPIO4。
在树莓派正确路径下创建文件并写入代码,我这里创建为“ranging.c"
编译ranging.c
$ gcc ranging.c -o ranging -lwiringPi
执行ranging
$ ./ranging
此时便可以看到执行效果。
具体代码如下:
#include <wiringPi.h>
#include <stdio.h>
#include <sys/time.h>
#define Trig 3
#define Echo 4
void ultraInit(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); //发出超声波脉冲
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)
{
int a=0;
float dis;
if(wiringPiSetup() == -1)
{
printf("setup wiringPi failed !");
return 1;
}
ultraInit();
while(a<10)
{
dis = disMeasure();
printf("distance = %0.2f cm\n",dis);
delay(1000);
a++;
}
return 0;
}