HC-SR04 超声波距离传感器如何工作?
当Trig引脚设置为高电平达 10µs 时,超声波距离传感器开始工作。随后传感器以 40KHz 发送八个超声波脉冲。这八个脉冲模式是专门设计的,使得接收器可以将发射的超声波与环境噪声区分开来。这八个超声波脉冲在远离发射器的空气中传播。同时,Echo引脚变为高电平,以接收回波返回信号。如果这些脉冲没有被反射回来,Echo信号就会超时,并在 38ms 后变为低电平。因此,38ms 的脉冲表示在传感器的范围内没有障碍物。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_42417071/article/details/133635350

如果这些超声波脉冲被反射回来,那么一旦接收到信号,Echo引脚就会变低。这会在Echo引脚上产生一个宽度从 150µs 到 25ms 不等的脉冲,具体取决于接收信号所需的时间。

程序实现
初始化超声波
将 Trig 引脚和 Echo 引脚分别设置为输入和输出。因为启动超声波传感器是把把 Trig 引脚拉高 10 μs,所以先把 Trig 引脚拉低到一个稳定的低电平并维持这个状态 500 ms。
void initUltrasonic()
{
if((wiringPiSetup() == -1))
{
perror("wiringPiSetup");
exit(-1);
}
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
digitalWrite(TRIG, LOW);
delay(500);
}
启动超声波
在获取距离之前先要把超声波模块启动一下,先拉高 Trig 引脚 10 μs 再拉低。
void startUltrasonic()
{
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
}
获取距离
计算两时间节点的秒的差值,再计算两时间节点的微秒的差值,两数相加等到单位为微秒的时间,这个时间就是 Echo 引脚高电平的时间,最后乘以单位为 cm/μs 的音速再除以 2,得到的就是超声波传感器和障碍物之间的距离了。
double get_distance()
{
while(!digitalRead(ECHO)); //等待 Echo 引脚由低变高
gettimeofday(&tv1, NULL);
while(digitalRead(ECHO)); //等待 Echo 引脚由高变低
gettimeofday(&tv2, NULL);
double distance = 0.034 * ((tv2.tv_sec - tv1.tv_sec) + (tv2.tv_usec - tv1.tv_usec)) / 2;
return distance;
}
整合代码
#include <stdio.h>
#include <sys/time.h>
#include <wiringPi.h>
#include <stdlib.h>
#define TRIG 5
#define ECHO 7
struct timeval tv1;
struct timeval tv2;
void initUltrasonic()
{
if((wiringPiSetup() == -1))
{
perror("wiringPiSetup");
exit(-1);
}
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
digitalWrite(TRIG, LOW);
delay(500);
}
void startUltrasonic()
{
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
}
double get_distance()
{
while(!digitalRead(ECHO));
gettimeofday(&tv1, NULL);
while(digitalRead(ECHO));
gettimeofday(&tv2, NULL);
double distance = 0.034 * ((tv2.tv_sec - tv1.tv_sec) + (tv2.tv_usec - tv1.tv_usec)) / 2;
return distance;
}
int main()
{
double distance = 0;
initUltrasonic();
while(1)
{
startUltrasonic();
distance = get_distance();
printf("distance = %f cm\n", distance);
delay(1000);
}
return 0;
}


被折叠的 条评论
为什么被折叠?



