3.【Orangepi Zero2】超声模块ultrasonic(HC-SR04)

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;
}

在这里插入图片描述

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值