资讯专栏INFORMATION COLUMN

树莓派31/100 - Pico连接HC-SR04超声波传感器,为自动避障智能小车打好基础

neuSnail / 1038人阅读

摘要:超声波传感器,英文,既可以发射超声波,也可以接收超声波,它有一个重要作用,可以提前探测到附近的物体,而且通过声波速度,能够推算出附近物体离传感器的大概距离。

超声波传感器,英文ultrasonic sensor,既可以发射超声波,也可以接收超声波,它有一个重要作用,可以提前探测到附近的物体,而且通过声波速度,能够推算出附近物体离传感器的大概距离。

HC-SR04是一种非常流行的、很便宜的超声波传感器,非常适合进行嵌入式编程的技术试验,它是智能避障小车的一个关键部件,可以提前发现小车前方的障碍物,相应做出转弯或后退的动作。

HC-SR04长的模样见下图,它的工作电压为5V,据说HC-SR04P或HC-SR04+新型号可以工作在3V电压下。

现在我们的任务是把它接入树莓派Pico里,来感知位于它前方物体的距离。

电路连接

先观察它的针脚,只有4个,左边是Vcc,接5V正极,右侧 GND接地。我手里的HC-SR04是5V版本的,Vcc接Pico的VBUS即可。


现在还剩下2个针脚,Trig和Echo。

Trig负责控制是否发射超声波,如果给它高电位,则发射;如果低电位,则停止发射。这里,我们要把它接到Pico的一个GPIO引脚,让Pico控制它,我把它直接连接到GP18引脚。


Echo的连接稍微复杂一点,Echo的英文意思是“回声”,意思是接收超声波信号。如果接收到超声波,则高电位;如果没收到,则为低电位。

重要提醒:

我的HC-SR04的工作电压为5V,那么echo针脚的电位也相应是5V,而Pico的工作电压为3.3V,如果直接把echo的输出信号连接到GPIO引脚上,会超过Pico的工作电压,有损坏Pico的可能性,所以需要做降压处理。

网上有些教程没有说明这个问题,把echo输出直接连到GPIO引脚上,比如这篇文章

一种解决方案是加入3.3V-5.5V电平转换器,一个非常便宜的小元件,比如这篇文章

还有一种解决方案,只需要增加2个电阻,再加上清晰的头脑和认真的连线即可,我参考了这篇文章的说明。

用到高中物理知识,得到电阻的计算公式。我们这里的Vin=5,Vout=3.3,所以R1/R2 = 0.515,如果R1选1000欧,那么R2约为2000欧。

所以,从Echo串上一个1000Ω的电阻,接到GP26引脚,再串一个2000Ω的电阻接地,就可以有效保护Pico的引脚。最后的逻辑连线图:

实际连接图(电阻丝非常细,又比较长,拍摄角度不容易看清楚连接关系):

学习原理,编写程序

看懂代码,需要了解一下超声波测距的基本原理。传感器的T端(Transmitter)发出超声波,遇到障碍物之后,超声波返回,被传感器的R端(Receiver)接收到,根据时间差和声音的速度,可以求出距离。

HC-SR04就是这样工作的:
1)Trigger收到一个长达10us的方波后,开始发出超声波
2)传感器内部发出8组40KHz的方波,然后接收回声
3)方波发送完成后,ECHO变为高电位,收到回声的时候,ECHO为低电位

下面这段代码,一开始的2us是把电位置零,再产生10us的方波。

trigger.low()utime.sleep_us(2)trigger.high()utime.sleep_us(10)trigger.low()

然后把ECHO处于高电位的时间段计算出来,乘以声音的速度,由于超声波跑了双程,所以还要除以2,最后求出距离,这里的单位是厘米。

while echo.value() == 0:    start = utime.ticks_us()while echo.value() == 1:    end = utime.ticks_us()d = (end - start) * 0.0343 / 2

最后的所有源代码:

from machine import Pinimport utime# 超声波测距,单位:厘米def getDistance(trigger, echo):    # 产生10us的方波    trigger.low()    utime.sleep_us(2)    trigger.high()    utime.sleep_us(10)    trigger.low()        while echo.value() == 0:        start = utime.ticks_us()    while echo.value() == 1:        end = utime.ticks_us()    d = (end - start) * 0.0343 / 2     return d# 主程序trigger = Pin(18, Pin.OUT)echo = Pin(26, Pin.IN)while True:    distance = getDistance(trigger, echo)    print("距离:{:.2f} cm".format(distance))    utime.sleep(1)

看HC-SR04的规格说明书,它能判断出传感器前方15度范围内的2厘米~5米距离的障碍物,分辨率达3毫米。

这里的计算距离的函数已经非常简化,有时会不太准确,可以多取几次求平均,另外,如果你对距离精度有更高的要求,那就要换其它的传感器了。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/122388.html

相关文章

  • 基于STM32f103c8t6和L292N驱动设计避障小车(核心函数的建立自己所写)

    基于STM32f103c8t6和L292N驱动设计避障小车(核心函数的建立为自己所写) 一.项目感触 完成这个项目自己一开始也是无法从本身上出发,看着这个最小系统板和这个电机驱动模块上面想着怎样实现让这两块板子实现四个电机上面转动呢,还要加入避障模块,自己一开始一头雾水,于是开始了漫长的借鉴之路,首先作为一个开发者,我觉得学习的地方首选是B站,所以我找了相关的做智能小车的视频 首先是B站智能小车教...

    CoffeX 评论0 收藏0
  • 分享 | 撞坏遥控车后,有个技术大牛爸爸是种怎样的体验

    摘要:在我已经制作完成一辆可以运行的遥控车时,公司发布了一个自驾车项目,来展示自动驾驶汽车的工作原理。需要注意的是,这里用的都是语言而非,其主要原因有两个一方面,近来似乎已成为运用机器学习技术时实际使用的语言。 最近,Mapbox 的 Android 工程师 Antonio 使用计算机视觉和机器学习技术,为他的女儿 Violeta 重新制作了一台遥控车。接下来我们看看 Antonio 是如何...

    ConardLi 评论0 收藏0
  • 三年探索:一条自控、电信/科类学生的技术成长路线

    摘要:所以我必须基于自己现在的情况走出一条适合自己情况的成长路线。下位机上位机的思想下位机上位机这就是我自己探索出来的技术成长路线。对和嵌入式的朋友感兴趣的朋友可以试一下我这条学习路线 ...

    Miracle 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<