树莓派3b连接超声波测距探头实现测距功能(C语言版)

模块:

树莓派3b连接超声波测距探头实现测距功能(C语言版)_第1张图片

连接时对应引脚关系:

超声波模块     树莓派              wPi

VCC                  4
GND                 6
Trig                   8(output)    15
Echo               10(input)      16
物理引脚编号和wPi引脚编号的对应关系可以根据在控制台输入gpio readall查看,对比Physical和wPi两列 

超声波测距原理:不解释,只给出时序图

树莓派3b连接超声波测距探头实现测距功能(C语言版)_第2张图片


根据时序图可以得知使用方法:

        先拉低电平,在保持10us高电平,再拉低电平,如第一行所示,经过上述时许,传感器自主发出脉宽(超声波开始发送),当声波在空气中传播时,Echo端保持高电平,直到接收到返回信号。也就是说,发出超声波后,要不断读取echo端的电平高低,利用digitalRead(16)函数读取,返回值只有0和1,0为低电平,1为高电平,高电平时是超声波发射到收到返回的过程


编程思路:
配置引脚状态,15号为输出,16号为输入
触发超声波开始工作的时序,低高(10us)低
while(1){
        判断echo引脚的值是否为1
        否:继续
        是:跳出循环
}
记录当前时间为t1
while(2){
        判断echo引脚的值是否为0
        否:继续
        是:跳出循环
}
记录当前时间为t2
计算距离d =(t2-t1)x 340 / 2

必要部分讲解:
获取当前时间的函数为:
struct timeval t1;// 结构体,秒,微秒
gettimeofday(&t1, NULL)
struct timeval t2;// 结构体,秒,微秒
gettimeofday(&t2, NULL)
计算时间差
long start, stop;//换算为微秒
start = t1.tv_sec * 1000000 + t1.tv_usec
stop = t2.tv_sec * 1000000 + t2.tv_usec
计算距离
float dis;
dis = (float)(stop - start) / 1000000 * 340 / 2 * 100; //cm  


源程序:
#include 
#include 
#include 

int main(){
	wiringPiSetup();  // 初始化库
	pinMode(15, OUTPUT);  // 设置15号引脚功能为输出
	pinMode(16, INPUT);  // 设置16号引脚功能为输入
	// 大循环不断测距
	while(1){
		// 低高低是发射声波的信号,通过15号一脚发出
		digitalWrite(15, LOW);
		digitalWrite(15, HIGH);
		delayMicroseconds(10);
		digitalWrite(15, LOW);
		// 通过16号引脚接收信号,判断超声波是否发出
		while(1){
			if (digitalRead(16) == 1){ // 如果是1,即高电平,表示超声波已发出
				break;  // 跳出循环
			}
		struct timeval t1;  // 结构体,可以记录秒和微秒两部分值
		gettimeofday(&t1, NULL);  // 记录电平变高的时刻,即超声波发出时的时刻
		//依然监听16引脚的信号,判断是否收到超声波信号
		while(1){
			if(digitalRead(16) == 0){  // 如果是0,即低电平,表示超声波已收到
				break;  // 跳出循环
			}
		}
		struct timeval t2;
		gettimeofday(&t2, NULL);  // 记录电平变低的时刻,即收到反射信号时刻
		计算时间差
		long start, stop;//换算为微秒
		start = t1.tv_sec * 1000000 + t1.tv_usec; // 开始时刻
		stop = t2.tv_sec * 1000000 + t2.tv_usec;  // 结束时刻
		计算距离
		float dis;
		dis = (float)(stop - start) / 1000000 * 340 / 2 * 100; //单位换算成cm  
		// 一直循环,每隔2s进行一次测距
		delay(2000);
	}
	return 0;
}


你可能感兴趣的:(树莓派)