1.模块介绍:
HC-SR04 超声波模块:
VCC:正极
Trig:触发
Echo:回应
GND:负极(接地)
**
2.接线:
Vcc:超声波模块电源脚,接5V电源
Trig:接收来自树莓派的控制信号,接 GPIO 口
Echo:发送测距结果给树莓派,接 GPIO 口
(值得注意的是:Echo 返回的是 5v信号,而树莓派的 GPIO 接收超过 3.3v 的信号可能会被烧毁,因此可以加一个分压电路)
Gnd:接地,接 0v
3.工作原理:
1、树莓派向 Trig 发送一个持续 10us(微秒) 的脉冲信号
2、HC-SR04 接收到树莓派发送的 10us 脉冲信号,发送 8 个 40khz 的方波,把 Echo 置为高电平,并准备接收返回的超声波
3、当 HC-SR04 接收到返回的超声波时,把 Echo 置为低电平
4、Echo 输出的高电平持续的时间就是超声波从发射到返回的时间
5、记录发送到接收之间的时间(高电平持续时间)即可测算距离
3.代码实现
#include <stdio.h>
#include <wiringPi.h>
#include <sys/time.h>
#define Trig 4
#define Echo 5
float getDistance()
{
float dis;
long start;
long end;
struct timeval tv1;
struct timeval tv2;
/* struct timeval {
time_t tv_sec; // 秒
suseconds_t tv_usec; // 微秒
};
*/
digitalWrite(Trig, LOW); // 先通入低电平,避免后续误差过大
delayMicroseconds(2);
digitalWrite(Trig, HIGH);
delayMicroseconds(10); // 树莓派发送 10us 脉冲信号
digitalWrite(Trig, LOW);
while(digitalRead(Echo) != HIGH); // HIGH(1),检测到高电平时跳出循环
gettimeofday(&tv1, NULL); // 获取时间(此为高电平开始时间)
while(digitalRead(Echo) != LOW); // LOW(0),检测到低电平跳出循环
gettimeofday(&tv2, NULL); // 获取时间(此为低电平开始时间,即为高电平结束时间)
start = tv1.tv_sec * 1000000 + tv1.tv_usec; // 单位(微秒)
end = tv2.tv_sec * 1000000 + tv2.tv_usec; // 单位(微秒)
dis = (float)(end - start) / 1000000 * 34000 / 2; // 距离计算(高电平时间 * 音速 / 2)
return dis;
}
int main()
{
float dis;
if(wiringPiSetup() == -1){ // 硬件初始化
printf("硬件初始化失败!\n");
return -1;
}
pinMode(Trig, OUTPUT); // 配置端口为输出模式
pinMode(Echo, INPUT); // 配置端口为输入模式
pullUpDnControl(Echo, PUD_UP); // 对一个设置 IO 模式为 INPUT 的输入引脚设置拉电阻模式
// PUD_UP 启用上拉电阻,引脚电平拉到 3.3v
while(1){
dis = getDistance();
printf("distance = %0.2fcm\n",dis);
delay(1000);
}
return 0;
}