树莓派3 + HC-SR04超声波测距模块 - 2

超声波测距模块 HC-SR04 非常易于使用,这篇文章就介绍 HC-SR04 的测距原理、树莓派如何与 HC-SR04 接线,以及使用 python 程序控制测距的方法。

HC-SR04 测距过程

下图说明了超声波的测距原理:


ultrasonic.png

HC-SR04 引脚图:


HC-SR04_pin.png

HC-SR04 模块包含了超声波发射器、超声波接收器和控制电路,可以提供 3cm - 4m 的距离测量。引脚图如上图所示有4个引脚:电源引脚(5v Vcc),触发脉冲引脚(Trig),返回脉冲引脚(Echo),地引脚(Gnd)。
如何使用呢?下面是 HC-SR04 的工作过程:
  1. 树莓派向 Trig 脚发送一个持续时间至少为 10us 的高电平信号。
  2. HC-SR04 接收到树莓派的触发信号,自动发送 40 Khz 的超声波,并把 Echo 脚置为高电平。然后开始检测返回的声波。
  3. 当检测到返回的声波时,Echo 脚被置为低电平。

从上述过程可以看出,Echo 脚的高电平持续时间就是超声波从发射到返回所经过的时间间隔 T。那么传感器和物体间的距离就能用下面的公式计算:
距离(Distance) = 超声波速度(340m/s) * 时间 T / 2

HC-SR04 与树莓派的接线

树莓派 GPIO 引脚图


树莓派GPIO 引脚图

接线图


raspiberry_HCSR04_bb.png
  • 电源引脚 Vcc 与树莓派的 5v 脚(物理引脚2)相连,地引脚 Gnd 与树莓派的 Gnd 脚(物理引脚6)相连。
  • 触发脉冲引脚 Trig 用来接收来自树莓派的控制信号,接任意 GPIO 口。图中连接了 GPIO_23(物理引脚16)。
  • 返回脉冲引脚 Echo 用来返回测距结果,需要注意的是 Echo 输出的是 5v 信号,而树莓派的 GPIO 最高只能承受3.3v 信号,所以 Echo 引脚需要经分压电路连接到树莓派的 GPIO。图中连接了 GPIO_24(物理引脚18).

为什么 GPIO_23 又是物理引脚16呢,这跟 GPIO 的两种编号方式有关,这两种编号方式分别是 BCM 编号和物理编号。

分压电路使用了 330 欧姆和 470 欧姆的电阻,这样 GPIO_24 分到的电压为: (470) / (330+470) * 5v = 2.9v < 3.3 v 。当然你可以选用任意阻值的两只电阻来组成分压电路,只要经过计算后 GPIO_24 分到的电压合适即可。

python 程序控制测距

如果你理解了 HC-SR04 的工作过程,那么下面包含注释的程序对你应该很简单,就不一一解释了。

#导入 GPIO库
import RPi.GPIO as GPIO
import time
 
#设置 GPIO 模式为 BCM
GPIO.setmode(GPIO.BCM)
 
#定义 GPIO 引脚
GPIO_TRIGGER = 23
GPIO_ECHO = 24
 
#设置 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
 
    return distance
 
if __name__ == '__main__':
    try:
        while True:
            dist = distance()
            print("Measured Distance = {:.2f} cm".format(dist))
            time.sleep(1)
 
        # Reset by pressing CTRL + C
    except KeyboardInterrupt:
        print("Measurement stopped by User")
        GPIO.cleanup()

运行结果:

Snipaste_2018-12-04_00-24-20.png

这个程序放在了 github

此文章也发布在 mengsheng.me

参考文章

Using a Raspberry Pi distance sensor (ultrasonic sensor HC-SR04)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容