一起玩转树莓派(14)——超声测距

简介: 当今,汽车行业的发展可谓是日新月异。智能汽车的概念也越来越火热。自动驾驶也将得到越来越广泛的应用。不知你有没有想过,平时我们在人工驾驶汽车时,主要使用的是视觉来感知距离,对于人工智能来说,它是如何通过感知距离来获取周围环境信息的呢?这就需要使用到相关的测距传感器。

一起玩转树莓派(14)——超声测距

当今,汽车行业的发展可谓是日新月异。智能汽车的概念也越来越火热。自动驾驶也将得到越来越广泛的应用。不知你有没有想过,平时我们在人工驾驶汽车时,主要使用的是视觉来感知距离,对于人工智能来说,它是如何通过感知距离来获取周围环境信息的呢?这就需要使用到相关的测距传感器。

一、超声测距传感器

我们知道,超声波频率高,相对于普通声波,其能量消耗慢,传播距离远且指向性很强。十分适合用来进行距离的测量。本次实验,我们使用HC-SR04超声测距模块来进行距离测量。元件如下图所示:

如上图所示,HC-SR04模块有一个超声发生器(T端)和一个超声收集器(R端)以及4个引脚。在网上很容易购买到此模块,其价格低廉,精准度高,使用简单,性价比非常高。HC-SR04硬件原理图如下:

模块内部电路结构虽然看上去非常复杂,但是我们使用它来测距并不需要了解其内部完整的工作原理,要进行距离的测定,离不开公式_s = v * t_。如果要计算出距离s,需要得知速度v和时间t,声波的速度v是一定的,我们可以取340m/s,时间t就是HC-SR04模块能够帮助我们得到的。

超声测距的核心原理是通过发生源发出超声波,当超声波遇到障碍时会被反射,反射的超声波可以被感知源感知到,从声波发出到被感知到这之间的时间就是超声波从模块到障碍物间传递一次来回所使用的时间。如下图所示:

对于HC-SR04模块,其Trig引脚是触发引脚,向其发10us以上的高电平即可触发发送超声波指令,HC-SR04模块会自动发送8个40kHz的方波,当发送完成后,Echo引脚会输出高电平,当收到反射回来的声波后,Echo会重新变回低电平。因此,在使用HC-SR04模块时,我们只需要通过向Trig引脚加高电平触发测量指令,之后监听Echo引脚高电平的持续时间,即可完成测距工作。

二、连线与编码

我们选择BCM编码下的GPIO17来控制超声发生Trig引脚,使用GPIO18来获取Echo引脚的电平。连线如下:

HC-SR04模块 树莓派
VCC +5V电源
GND GND
Trig GPIO17(BCM编码)
Echo CGIO18(BCM编码)

编写如下代码:

#coding:utf-8

import RPi.GPIO as GPIO
import time

# 触发声波引脚
trig = 11
# 监听信号
echo = 12

def getDistance():
    # 输出高电平
    GPIO.output(trig, GPIO.HIGH)
    # 持续15us高电平 触发超声波
    time.sleep(0.000015) 
    # 停止加高电平
    GPIO.output(trig, GPIO.LOW)

    # 开始检测信号引脚的电平为高电平时开始计时
    while GPIO.input(echo) == 0:
        pass
    t1 = time.time()
    # 信号引脚的电平为低电平时计算时间间隔
    while GPIO.input(echo) == 1:
        pass
    t2 = time.time()
    # 计算距离
    s = (t2 - t1)*340/2
    return s

GPIO.setmode(GPIO.BOARD)
GPIO.setup(trig, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(echo, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

while True:
    s = getDistance()
    print("当前距离前方障碍物:%fm"%(s))
    time.sleep(1)

在树莓派中运行上面代码,即可实现超声波测距,效果如下图:

专注技术,懂的热爱,愿意分享,做个朋友
目录
相关文章
|
开发工具 git
Git commit操作之后找不到提交记录
Git commit操作之后找不到提交记录
|
缓存 JavaScript 开发工具
【安装指南】VSCode搭建运行Vue的详细教程
【安装指南】VSCode搭建运行Vue的详细教程
4580 0
|
9月前
|
编译器 数据安全/隐私保护 C++
【C++面向对象——继承与派生】派生类的应用(头歌实践教学平台习题)【合集】
本实验旨在学习类的继承关系、不同继承方式下的访问控制及利用虚基类解决二义性问题。主要内容包括: 1. **类的继承关系基础概念**:介绍继承的定义及声明派生类的语法。 2. **不同继承方式下对基类成员的访问控制**:详细说明`public`、`private`和`protected`继承方式对基类成员的访问权限影响。 3. **利用虚基类解决二义性问题**:解释多继承中可能出现的二义性及其解决方案——虚基类。 实验任务要求从`people`类派生出`student`、`teacher`、`graduate`和`TA`类,添加特定属性并测试这些类的功能。最终通过创建教师和助教实例,验证代码
187 5
|
数据采集 开发工具 Python
海康威视工业相机SDK+Python+PyQt开发数据采集系统(支持软件触发、编码器触发)
该系统基于海康威视工业相机SDK,使用Python与PyQt开发,支持Gige与USB相机设备的搜索及双相机同时显示。系统提供软件触发与编码器触发模式,并可在数据采集过程中实时保存图像。此外,用户可以调节曝光时间和增益,并进行信息输入,这些信息将被保存至配置文件以便下次自动加载。参数调节与实时预览等功能进一步增强了系统的实用性。
1212 1
|
Android开发
Android 配置蓝牙遥控器键值
本文详细介绍了Android系统中配置蓝牙遥控器键值的步骤,包括查看设备号、配置键位映射文件(kl文件)、部署kl文件以及调试过程,确保蓝牙遥控器的按键能正确映射到Android系统对应的按键功能。
1983 1
|
小程序
微信小程序中引导用户关注公众号实现方案详细说明
之前讲过如何利用公众号针对指定用户完成业务操作之后实时发送消息
微信小程序中引导用户关注公众号实现方案详细说明
|
Java Linux Android开发
深入理解Android开发:从基础到高级
【9月更文挑战第17天】本文将深入探讨Android开发的各个方面,包括应用开发、操作系统等。我们将通过代码示例来展示如何创建一个简单的Android应用,并解释其背后的原理。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和启示。
|
自然语言处理 Ubuntu 编译器
使用 `byacc`(Berkeley Yacc)在Linux中构建编译器
本文介绍了如何在Linux中使用`byacc`构建编译器。首先,通过包管理器安装`byacc`,如在Debian/Ubuntu上使用`apt-get install byacc`,在Red Hat/CentOS/Fedora上使用`yum`或`dnf`。接着,定义编程语言的语法(如示例中的简单计算器`calc.y`),然后运行`byacc -d calc.y`生成C代码。最后,编译生成的文件并运行。虽然示例简单,但展示了使用`byacc`创建编译器的基本步骤,实际项目中需处理更复杂语法和实现语义动作。
|
传感器 存储 Java
一起玩转树莓派(17)——BMP180数字压力传感器应用
BMP180是一款高级的温度气压传感器,通过测量的气压值也可以计算出当前海拔高度。其压力测量范围为300-1100hPa,对应的海拔高度为正9000m-负500m。工作电压在1.8V到3.6V之间。体积小,精度高,采用I2C接口,使用非常方便。BMP180传感器在GPS导航,天气检测,海拔测量和垂直方向速度检测等方面有广泛的应用。本实验,我们尝试使用树莓派的I2C接口来读取BMP180的温度和气压值,并进行海拔高度的计算。
18183 0
|
Java
Java编程:基于socket实现局域网双人联机对战五子棋
Java编程:基于socket实现局域网双人联机对战五子棋
1262 0
Java编程:基于socket实现局域网双人联机对战五子棋