昉·星光系列课程4:昉·星光开发板超声波测距

昉·星光系列课程4:昉·星光开发板超声波测距

本次课程为昉·星光开发板IoT开发系列课程的第四讲,将带领同学们在昉·星光开发板上,使用超声波测距模块进行测距。
本次课程,在昉·星光开发板V1和V2上,操作步骤相同。

一、学习目标

  • 学习昉·星光开发板控制超声波测距模块测距

二、准备工作

在开始本次课程的实际操作之前,同学们需要做好一些准备工作,课程中涉及到的硬件如下:

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

三、超声波测距传感器测距原理

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

在超声波传感器的最前面,有两个金属探头,一个类似喇叭用于发射超声波,一个类似麦克风用于接收反射回来的超声波。
超声波测距利用超声波在空气中的传播时间来进行测距。HC-SR04发射40KHz的超声波,遇到障碍物后将会反射。从发射和反射回来,超声波在空气中经过一定距离需要一定的时间。因此,我们计算计算传播过程所花费的时间,就能计算出HC-SR04与障碍物之间的距离。
3.HC-SR04原理

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

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

距离计算公式:

  • 距离 =(超声波速度 * 高电平保持时间)/ 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)分别亮绿灯、黄灯、红灯

八、参考资料

1 Like

调用板子的gpio库是不是不能在python虚拟环境里使用啊

使用的时候,具体遇到了什么问题?