昉·星光 2演示案例之超声波测距(请上网查阅超声波测距仪的原理)

本次演示为将带领大家在昉·星光开发板上,使用超声波测距模块进行测距(昉·星光和昉·星光 2开发板的操作步骤相同)。

1.准备工作

在开始本次演示的实际操作之前,大家需要做好一些准备工作,主要涉及到的硬件如下:

  • 开发板:昉·星光 2开发板(昉·星光也可以)
  • 超声波测距模块: HC-SR04
  • 杜邦线:若干

2. 超声波测距传感器测距原理

本次演示中,使用的超声波测距传感器型号为HC-SR04,该模块具体如下:

在超声波传感器的最前面,有两个金属探头,一个类似喇叭用于发射超声波,一个类似麦克风用于接收反射回来的超声波。

超声波测距利用超声波在空气中的传播时间来进行测距。HC-SR04发射40KHz的超声波,遇到障碍物后将会反射。从发射和反射回来,超声波在空气中经过一定距离需要一定的时间。因此,我们计算计算传播过程所花费的时间,就能计算出HC-SR04与障碍物之间的距离。

在超声波传感器模块上,有两个控制引脚,分别为Trig和Echo。使用这两个引脚控制HC-SR04进行测距,具体步骤如下:

  1. 将Trig引脚保持高电平至少10us
  2. HC-SR04将对外发送40KHz的超声波,共8个周期
  3. 读取Echo引脚的输出电平,高电平持续的时间就是超声波从发射到返回的时间
  4. 根据得到的时间,计算出实际的距离

距离计算公式:

  • 距离 =(超声波速度 * 高电平保持时间)/ 2
  • 超声波速度:取声波在空气中的速度240m/s

因为超声波从HC-SR04到障碍物需要一个来回,所以实际距离为超声波路程的一半。

3. 超声波测距实验

通过上述超声波测距的原理,我们可以得知,可以通过两个引脚,一个引脚控制HC-SR04的Trig来控制超声波的发射,一个引脚从HC-SR04的Echo读取电平状态来得知超声波是否返回。

首先,参考下图,将超声波测距模块,连接到昉·星光 2开发板:

注意:
应根据实际使用的传感器,确定供电电压。本次课程中使用的HC-SR04使用5V供电电压。

然后,编写如下的程序:

# -*- coding: utf-8 -*-
# file: ~/projects/distance/udm.py
# pip3 install gpio
import os 
import time 
from time import sleep  
#导入 GPIO库
import gpio as GPIO 
import time  
#定义 GPIO 引脚 
GPIO_TRIGGER = 54 
GPIO_ECHO = 51
#设置 GPIO 的工作方式 (IN / OUT) 
GPIO.setup(GPIO_TRIGGER, GPIO.OUT) 
GPIO.setup(GPIO_ECHO, GPIO.IN)  
def distance():    
   # 发送高电平信号到 Trig 引脚     
   GPIO.output(GPIO_TRIGGER, True)      
   # 持续 10 us     
   time.sleep(0.00001)    
   GPIO.output(GPIO_TRIGGER, False)    
   start_time = time.time()  
   stop_time = time.time() 
   # 记录发送超声波的时刻1
   while GPIO.input(GPIO_ECHO) == 0:   
   start_time = time.time()   
   # 记录接收到返回超声波的时刻2
   while GPIO.input(GPIO_ECHO) == 1:     
   stop_time = time.time()  
   # 计算超声波的往返时间 = 时刻2 - 时刻1  
   time_elapsed = stop_time - start_time  
   # 声波的速度为 343m/s, 转化为 34300cm/s  
   distance = (time_elapsed * 34300) / 2
   print("往返时间=%0.3fms 物体距离=%0.2fcm" % (time_elapsed*1000, distance))   
   return distance 
whileTrue:   
   print("测量距离:")  
   distance()  
   sleep(1)

上述程序的逻辑根据超声波测距模块的原理,首先输出高电平到Trig引脚,保持10us,触发超声波发送,然后从Echo引脚读取高电平信号,从而得到间隔时间,再根据公式计算出实际的距离。

编写完成后,运行 udm.py ,即可按键控制LED了。

# 安装GPIO模块 
sudo pip3 install gpio  
# 如果遇到错误,可以使用sudo python3 udm.py运行: 
python3 udm.py

实际运行和测量结果如下:

注意:因为超声波实在空气中传播,也会受到现场环境的影响,所以实际使用中,可以进行多次测量,然后取平均值。

4. 总结

在本次演示中,我们学习了通过使用超声波测距模块进行测距。

在实际处理的过程中,涉及到了以一定的时序控制外部设备,然后再从外部设备读取数据的逻辑。虽然其中的控制时序非常简单,但这是很多复杂控制的基础。

参考资料:

  • HC-SR04 超音波測距感測模組(https://ithelp.ithome.com.tw/articles/10249987

本项目演示作者:HonestQiao

原文链接:,转发请注明来源!