使用Python进行超声波测距– Part 2

23

继我之后 使用Python进行超声波测距– Part 1 文章我决定使我的Python脚本更加复杂。

In this example the script takes three 测量ments and calculates the average. This is 显示ed and 上e second later it takes another average. This allows the script to be used to constantly 测量 distances and print them to the command line.

就像以前一样,使用一小块面包板和一些跳线将Ultrasonic模块连接到Raspberry Pi。

触发器接受来自Pi的3.3V输出,但在到达GPIO输入之前,必须将Echo引脚从5V转换为3.3V。

超声波模块电路

超声波模块电路

蟒蛇脚本

这里 is the modified script :

#!/usr/bin/python
#+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
#|R|a|s|p|b|e|r|r|y|P|i|-|S|p|y|.|c|o|.|u|k|
#+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
#
# 超音波_2.py
# Measure distance using an 超音波 module
# in a loop.
#
# Author : 马特 Hawkins
# Date   : 28/01/2013

# -----------------------
# Import required 蟒蛇 libraries
# -----------------------
import time
import RPi.GPIO as 通用输入输出

# -----------------------
# Define some functions
# -----------------------

def 测量():
  # This function 测量s a distance
  通用输入输出.output(GPIO_TRIGGER, True)
  time.sleep(0.00001)
  通用输入输出.output(GPIO_TRIGGER, False)
  start = time.time()

  while 通用输入输出.input(GPIO_ECHO)==0:
    start = time.time()

  while 通用输入输出.input(GPIO_ECHO)==1:
    stop = time.time()

  elapsed = stop-start
  distance = (elapsed * 34300)/2

  return distance

def 测量_average():
  # This function takes 3 测量ments and
  # returns the average.
  distance1=measure()
  time.sleep(0.1)
  distance2=measure()
  time.sleep(0.1)
  distance3=measure()
  distance = distance1 + distance2 + distance3
  distance = distance / 3
  return distance

# -----------------------
# Main Script
# -----------------------

# Use BCM 通用输入输出 references
# instead of physical pin numbers
GPIO.setmode(GPIO.BCM)

# Define 通用输入输出 to use 上 Pi
GPIO_TRIGGER = 23
GPIO_ECHO    = 24

print "超声波测量"

# Set pins as output and input
GPIO.setup(GPIO_TRIGGER,GPIO.OUT)#触发
GPIO.setup(GPIO_ECHO,GPIO.IN)      # Echo

# Set 触发 to False (Low)
GPIO.output(GPIO_TRIGGER, False)

# Wrap main content in a try block so we can
# catch the user pressing CTRL-C and run the
# 通用输入输出 cleanup function. This will also prevent
# the user seeing lots of unnecessary error
# messages.
try:

  while True:

    distance = 测量_average()
    print "Distance : %.1f" % distance
    time.sleep(1)

except KeyboardInterrupt:
  # User pressed CTRL-C
  # Reset 通用输入输出 settings
  通用输入输出.cleanup()

也可以使用以下命令行将该脚本直接下载到您的Pi上:

wget //bitbucket.org/MattHawkinsUK/rpispy-misc/raw/master/python/ultrasonic_2.py

然后可以使用以下命令运行它:

须藤蟒蛇超声_2.py

这将为您提供一个看起来像这样的命令行:

上ic_2.py截图

上ic_2.py截图

Obviously your 测量ments will depend 上 what you point your 传感器 at!

相关文章

这是我的其他一些文章,如果您喜欢这篇文章,可能会觉得很有趣:

分享。

23条留言

  1. 你好
    我爸爸是盲人,我’我正在研究一个项目,以制造某种可穿戴设备(帽子,眼镜,臂章,护膝等),该设备可检测到即将到来的障碍物,并通过音频或振动反馈以提醒他。他一直在敲打东西,因为他的棍子通常扫得很低。对于距离检测器而言,这似乎是一个不错的开始。这是正确的方法吗?您是否知道所有完成整个项目的项目?我没有’还没买到Pi,刚刚完成15分钟的冲浪。
    我见过一个使用不同类型的传感器(http://jeremyblythe.blogspot.co.uk/2012/09/raspberry-pi-distance-measuring-sensor.html) –您认为哪种更适合我的应用?
    谢谢你的帮助–作为菜鸟,我想从正确的方向开始。
    克里斯(前开发人员,现已预售)

  2. 我对这种传感器的经验是,根据Pi上当前的CPU负载,代码给出的结果不同。请参阅上述网站上的帖子50。我每次都做3个样本,结果保持最低。两次读数之间的最短时间约为2秒—没用。可惜那里没有’似乎是一种方法“sleep”直到ECHO引脚引起中断。这种设备可能更适合与Arduino一起使用,而Arduino不会有很多Linux后台进程。

  3. 每当我执行python时,我得到的就是
    超声_2.py:70:RuntimeWarning:该通道已在使用中,无论如何仍在继续。使用GPIO.setwarnings(False)禁用警告。
    通用输入输出.setup(GPIO_TRIGGER,GPIO.OUT)#触发

    任何帮助都将非常重要。谢谢

    • 那只是RPi.GPIO库发出的警告。这仅表示您正在配置先前已配置的GPIO输出。可能在脚本的先前运行中。可以忽略。或者,您可以在脚本开始时粘贴GPIO.setwarnings(FALSE)以禁用它。

  4. pingback: 使用Python进行超声波测距–第1部分|树莓派间谍

  5. 感谢您的这篇非常有用的文章。

    我需要这样的东西来报告门廊植物浇水系统中的水位。然而;我所能使用的只是Parallax PING)))28015单元(3针);将触发和回声组合成一个通道。我发现一对简单的功能即可在.IN和.OUT之间切换GPIO引脚,这几乎是适应代码的所有必要功能。

    我还发现28015在直接从Pi上运行的实现中看起来非常满意’s 3.3v rail —无需分压器。我怀疑这种设置对于动态环境是否非常可靠,但是对于每天一次以加仑为单位的储层液位检查,似乎就足够了。我确实使用了“circular buffer”使读数平稳,因为我的设置可以节省大量时间。

    干杯!

  6. 伊恩·卡本斯(Ian Carbarns)

    即使您拥有单独的4针超声波装置‘trigger’ and ‘measure’引脚,可以将它们组合在一起,以便在Pi上仅使用单个GPIO引脚。只需添加几个电阻即可‘pull down’ the 触发 pin and between the 2 pins, as well as make the voltage divider, and then switch the 通用输入输出 pin between output and input as needed

  7. 为了减少错误,您可以使用:


    def 测量_average():
    distances=[]
    elements = 20
    distances= range(0,elements)

    for i in range(0,elements):
    distances[i]= 测量()
    time.sleep(0.1)

    d = sum(distances) /len(distances)
    return d

  8. 很棒的帖子!

    请问当超声波感测到一定距离时,如何编程RPi以运行Python脚本?

    例如,当超声波传感器检测到对象为10cm时,启动某个脚本(sample.py)。

  9. I’m考虑到一个车库停车向导,该向导在进近时会亮起黄灯(即:在停止点的x米以内),然后在停止点处亮起红色。我的想法是让两个传感器馈入安装在车库侧壁触发点上的pi。一世’我想知道是否可以修改脚本以从两个传感器获取读数,检查对象是否在范围内,然后发出适当的触发信号,

    KD

  10. 脚本对我来说效果很好,但是有人能回答保罗吗’的问题?超声波发出特定距离(例如Paolo提到的10厘米)后,您将如何调用另一个脚本(或函数)?谢谢。

  11. 阿里夫·哈塔托

    感谢您的这篇非常有用的文章。

    我能问一下如何使用此HC-SR04获得接收频率的值。我想通过多普勒效应使用hc-sr04传感器制作速度测量装置。谢谢

    对不起,我的英语不好

    • 这些传感器不’t报告频率,仅报告脉冲时序。所以我’我不确定是否可以使用HC-SR04模块来测量速度。

  12. 你好
    每次我运行命令“须藤蟒蛇超声_2.py” i just get this:
    “超声波测量
    20度时的音速为331.12 m / s
    超声_2.py:79:RuntimeWarning:此通道已在使用中,无论如何仍在继续。使用GPIO.setwarnings(False)禁用警告。
    通用输入输出.setup(GPIO_TRIGGER,GPIO.OUT)#触发”
    如果有人能帮上忙,谢谢,
    安迪

    • 添加此行:
      通用输入输出.setwarnings(False)
      在GPIO.setmode行之后。
      它只是告诉GPIO库忽略先前的配置并继续。

发表评论

该网站使用Akismet减少垃圾邮件。 了解如何处理您的评论数据.