一、超声波模块介绍:
(1)超声波传感器模块上面通常有两个超声波元器件,一个用于发射,一个用于接受。电路板上 有4个引脚:
VCC : 正极
Trig : 触发脚
Echo : 回应脚
GND : 接地
主要参数:
1)工作电压与电流:5V、15mA
2)感测距离:2 ~ 400cm
3) 感测角度:不大于15度
4)被测物体的面积不要小于50cm²并且尽量平整。
5)具体温度补偿电路
(2)工作原理:
在超声波模块的触发脚位(Trig)输入10微秒以上的高电位,即可发射超声波,发射超 声波之后,与接收到传回的超声波之前,“响应”脚位(Echo)的高电位脉冲持续时间, 换算出 被测物体的距离。
(3)时序图:
(4)超声波从发射到返回的时间、测试距离:
测试距离 = (高电平时间 * 声速(340/s)) / 2
二、所用函数:
(1)读取引脚值函数:
int digitalRead(int pin);
pin : 读取的引脚
返回值:引脚上的电平,可以是LOW,HIGH之一。读取一个引脚的电平值LOW,HIGH。
(2)延时函数:
void delayMicroseconds(unsigned int howlong);
作用:将执行暂停的微秒数(1000微秒 = 1毫秒 = 0.001秒)
注:最大延时时间可达71分钟。
(3)gettimeofday(); 获取系统时间
int gettimeofday(struct timeval * tv , struct timezone * tz);
1) 第一个参数是一个结构体:
struct timeval
{
time_t tv_sec; //秒
suseconds_t tv_usec; //微秒
};
第二个参数是一个时区结构,已经过时了,所以tz参数通常应该指定为NULL
2)作用:该函数会把自Epoch以来的秒数和微秒数放到tv结构体。
3)返回值:调用成功返回 0,失败返回 -1 并设置ermo
三、程序贴图
/*
* 超声波程序实现:
*
* 超声波工作原理:
* 在超声波模块的触发角位输入10微秒以上的高点位,即可发射超声波,发射超声波之后,
* 与接受到传回的超声波之前,“响应”脚位呈现高电位。因此,程序可从”响应“脚位的高
* 电位脉冲持续时间,换算出被测物的距离。
*
* 思路:
* (1)初始wiringPi库
* (2)初始化引脚(把引脚都拉成低点位)
* (3)根据时序图控制Trig,Echo引脚的电平值和等待时间
* (4)算出声波在空气中的传播时间(Echo 引脚处于高电平的时间),进而算出距离
*
*
* VCC ——————————— 5V
* Trig ——————————— 2
* Echo —————————— 3
* GND —————————— GND
*
*
*
*/
#include <wiringPi.h>
#include <stdio.h>
#include <sys/time.h>
#include <unistd.h>
#define Trig 2 //触发 (输出高电平)
#define Echo 3 //回响 (接收高电平)
//声明
void Initpin();
float ultr();
void Initpin()
{
pinMode(Trig,OUTPUT);
pinMode(Echo,INPUT);
//引脚默认输出低电平
digitalWrite(Trig,LOW);
digitalWrite(Echo,LOW);
}
float ultr()
{
struct timeval start_val;
struct timeval stop_val;
float distance = 0; //距离
long start_time; //开始时间
long stop_time; //结束时间
float HIGH_time;
Initpin(); //初始化引脚模式
digitalWrite(Trig,HIGH);
delayMicroseconds(10); //延时10us
digitalWrite(Trig,LOW);
while(!(digitalRead(Echo) == HIGH));
//start
gettimeofday(&start_val,NULL);
//printf("s = %d,us = %d\n",start_val.tv_sec,stop_val.tv_usec);
while(!(digitalRead(Echo) == LOW))
//stop
gettimeofday(&stop_val,NULL);
//printf("s = %d,us = %d\n",stop_val.tv_sec,stop_val.tv_usec);
//计算高电平时间:(转换成微秒)
stop_time = (stop_val.tv_sec * 1000000) + stop_val.tv_usec;
start_time = (start_val.tv_sec * 1000000) + start_val.tv_usec;
//printf("stop_time = %ld\n",stop_time);
//printf("start_time = %ld\n",start_time);
HIGH_time = stop_time - start_time;
//printf("HIGH_time = %ld\n",HIGH_time);
//距离测试 = (高电平时间 * 声速(340/s))/2
distance = ((HIGH_time / 1000000) * 34000)/2;
return distance;
}
int main()
{
float ret;
if(wiringPiSetup() == -1) //初始化wiringPi库
{
printf("wiringPi error\n");
wq return -1;
}
while(1)
{
ret = ultr();
printf("%.2fcm\n",ret);
sleep(1);
}
return 0;
}