昉·星光系列课程4:昉·星光开发板超声波测距
本次课程为昉·星光开发板IoT开发系列课程的第四讲,将带领同学们在昉·星光开发板上,使用超声波测距模块进行测距。
本次课程,在昉·星光开发板V1和V2上,操作步骤相同。
一、学习目标
- 学习昉·星光开发板控制超声波测距模块测距
二、准备工作
在开始本次课程的实际操作之前,同学们需要做好一些准备工作,课程中涉及到的硬件如下:
- 开发板:昉·星光开发板
- 超声波测距模块: HC-SR04
- 杜邦线:若干
三、超声波测距传感器测距原理
本次课程中,使用的超声波测距传感器型号为HC-SR04,该模块具体如下:
在超声波传感器的最前面,有两个金属探头,一个类似喇叭用于发射超声波,一个类似麦克风用于接收反射回来的超声波。
超声波测距利用超声波在空气中的传播时间来进行测距。HC-SR04发射40KHz的超声波,遇到障碍物后将会反射。从发射和反射回来,超声波在空气中经过一定距离需要一定的时间。因此,我们计算计算传播过程所花费的时间,就能计算出HC-SR04与障碍物之间的距离。
在超声波传感器模块上,有两个控制引脚,分别为Trig和Echo。使用这两个引脚控制HC-SR04进行测距,具体步骤如下:
- 将Trig引脚保持高电平至少10us
- HC-SR04将对外发送40KHz的超声波,共8个周期
- 读取Echo引脚的输出电平,高电平持续的时间就是超声波从发射到返回的时间
- 根据得到的时间,计算出实际的距离
距离计算公式:
- 距离 =(超声波速度 * 高电平保持时间)/ 2
- 超声波速度:取声波在空气中的速度240m/s
因为超声波从HC-SR04到障碍物需要一个来回,所以实际距离为超声波路程的一半。
四、超声波测距实验
通过上述超声波测距的原理,我们可以得知,可以通过两个引脚,一个引脚控制HC-SR04的Trig来控制超声波的发射,一个引脚从HC-SR04的Echo读取电平状态来得知超声波是否返回。
首先,参考下图,将超声波测距模块,连接到昉·星光开发板:
实物连接如下:
注意:
应根据实际使用的传感器,确定供电电压。本次课程中使用的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
while True:
print("测量距离:")
distance()
sleep(1)
上述程序的逻辑根据超声波测距模块的原理,首先输出高电平到Trig引脚,保持10us,触发超声波发送,然后从Echo引脚读取高电平信号,从而得到间隔时间,再根据公式计算出实际的距离。
编写完成后,运行 udm.py ,即可按键控制LED了。
# 安装GPIO模块
sudo pip3 install gpio
# 如果遇到错误,可以使用sudo python3 udm.py运行:
python3 udm.py
实际运行和测量结果如下:
注意:因为超声波实在空气中传播,也会受到现场环境的影响,所以实际使用中,可以进行多次测量,然后取平均值。
五、总结
在本次课程中,我们学习了通过使用超声波测距模块进行测距。
在实际处理的过程中,涉及到了以一定的时序控制外部设备,然后再从外部设备读取数据的逻辑。虽然其中的控制时序非常简单,但这是很多复杂控制的基础。
六、课后作业
- 了解超声波测距模块
- 编写程序,测量所居住房屋的长宽高
- 编写程序,实现物体安全距离(>2m)、警告距离(2m~1m)、危险距离(<1m)分别亮绿灯、黄灯、红灯