树梅派硬件编程_超声波测距

Posted Leslie X徐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树梅派硬件编程_超声波测距相关的知识,希望对你有一定的参考价值。

超声波测距

在这里插入图片描述

测距原理

在这里插入图片描述

一个超声波发射,一个接收超声波返回
在发出超声波一段时间内, echo引脚保持高电平.
高电平持续的时间就是超声波从发射到返回的时间.
== 测试距离=(高电平时间 * 声速(340m/s=0.034cm/us)) / 2 ==

硬件通信

在这里插入图片描述

  1. 首先主机通过Trig引脚发送至少10us的脉冲触发信号
  2. 然后等待Echo信号变成高电平
  3. 待Echo变高电平后,进行计时(可以获取当前时间来计时)
  4. 待Echo变成低电平,结束计时,根据高电平时间计算距离.

实现代码

初始化

#include <stdio.h>
#include <sys/time.h>
#include <wiringPi.h>

#define PIN_TRIG 15
#define PIN_ECHO 16

void wiringPiStart(void)
{
	wiringPiSetup();
	
	pinMode(PIN_ECHO, INPUT);
	pinMode(PIN_TRIG, OUTPUT);
	digitalWrite(PIN_TRIG,0);
}

计算距离

float HC_getDistence(void)
{
	struct timeval tv;
	unsigned int start=0,end=0;
	
	//发射10us以上的信号
	digitalWrite(PIN_TRIG,1);
	delayMicroseconds(10);
	digitalWrite(PIN_TRIG,0);
	
	//等待Echo高电平,获取时间
	while(digitalRead(PIN_ECHO)==0);
	gettimeofday(&tv,NULL);
	start = tv.tv_usec;
	
	//等待Echo低电平,获取时间
	while(digitalRead(PIN_ECHO)==1);
	gettimeofday(&tv,NULL);
	end = tv.tv_usec;
	
	//根据高电平持续时间计算距离
	return (float)((end-start)*0.017); //单位cm
}

知识:获取时间进行计时

struct timeval
{
    long tv_sec; /*秒*/
    long tv_usec; /*微秒*/
};

struct timeval tv;
gettimeofday(&tv,NULL);
start = tv.tv_usec;

主函数测试

int main(int argc, char **argv)
{
	wiringPiStart();
	
	float dis=0;
	dis = HC_getDistence();
	printf("前方阻挡物距离为: %.2f cm\\n",dis);
	
	return 0;
}

输出

前方阻挡物距离为: 15.30 cm

以上是关于树梅派硬件编程_超声波测距的主要内容,如果未能解决你的问题,请参考以下文章

树梅派硬件编程_按键中断

树梅派硬件编程_QT_OLED显示字符

树梅派硬件编程_红外遥控器

树梅派硬件编程_DTH11温湿度检测

树梅派硬件学习_多线程任务

STM32超声波模块测距控制舵机