超神波传感器模块上面通常有两个超声波元器件,一个用于发射,一个用于接收。电路板上有4个引脚:vcc(正极),trig(触发),echo(回应),GND(接收),主要参数:
1.工作电压与电流:5v,15mA
2.感测距离:2-400cm
3.被测角度:不大于15°
4.被测物的面积不要小于50cm2并且尽量平整
5.具备温度补偿电路
在超声波模块触发脚位输入10微妙以上的高电位,即可发射超声波,发射超声波之后,与接收到传回的超声波之前,“响应”脚位呈现高电位。因此,程序可从“响应”脚位的高电位脉冲时间,换算出被测物的距离。
在测试过程中会用到gettimeofda()函数获取当前时间。
demo如下:
#include <stdio.h>
#include <wiringPi.h>
#include <stdlib.h>
#include <sys/time.h>
#define trigger 28
#define echo 29
/*初始化函数*/
void init()
{
/*初始化wiringPi库*/
if(wiringPiSetup() == -1)
{
printf("we failed to setup wiringPi\n");
exit(-1);
}
/*初始化引脚*/
pinMode(trigger,OUTPUT);
pinMode(echo,INPUT);
}
/*测量距离函数*/
float getDistance()
{
struct timeval val1;
struct timeval val2;
float dis;
long start;
long stop;
digitalWrite(trigger,LOW);
delayMicroseconds(2);
digitalWrite(trigger,HIGH);
delayMicroseconds(10);/*发射脉冲*/
digitalWrite(trigger,LOW);
while(!digitalRead(echo) == 1);
gettimeofday(&val1,NULL);/*获取当前时间,超声波发送的时间*/
while(!digitalRead(echo) == 0);
gettimeofday(&val2,NULL);/*获取当前时间,超声波接收的时间*/
start = val1.tv_sec*1000000+val1.tv_usec;
stop = val2.tv_sec*1000000+val2.tv_usec;/*微妙时间*/
dis =(float)(stop-start)/1000000*34000/2;
return dis;
}
int main ()
{
float distance;
init();
while(1)
{
distance = getDistance();
printf("distance = %0.2fcm\n",distance);
delay(1000);
}
return 0;
}
反思:
dis是float型,而start-stop算出的是long型。需要强制转换下,不然输入的最后结果是0;
代码的debug需要分模块检查,有可能错在意想不到的地方.在配置引脚的时候,把echo配置出输出引脚了,实际上应该是输入引脚。导致测距结果一直出不了。