树莓派红外避障⼩车python_树莓派PythonC语⾔超声波测距
以及利⽤超声波模块⼩车避障...
使⽤Python进⾏超声距离测量 – 第1部分
超声波传感器
LED,蜂鸣器和开关是⼈们尝试与Raspberry Pi相连接的最常见的项⽬。在某宝中发现的有点不同的是超声波测量模块。这允许您测量距离最近的墙壁或固体物体的距离。这些模块很容易买到,便宜⽽且⽐较直接的连接到GPIO头。
所以这⾥有⼀些关于我的超声测量模块和Python的实验的信息。在未来的项⽬中,我可以看到这些模块是向Pi动⼒机器⼈或汽车添加⼀些智能的好⽅法。
HC-SR04模块的成本约为3-4yuan,是⼀个匹配的⼤⼩。其设计由5V供电,具有1个输⼊引脚和1个输出引脚。该模块通过向空中发送超声波脉冲并测量反弹所需的时间来⼯作。该值可以⽤于计算脉冲⾏进的距离。
连接到Pi
为模块供电很简单。只需将+ 5V和Ground引脚连接到Pi的GPIO接头上的引脚2和引脚6。
模块上的输⼊引脚称为“触发”,⽤于触发发送超声波脉冲。理想情况下,它需要⼀个5V信号,但它与GPIO的3.3V信号⼯作正常。所以我将触发器直接连接到GPIO头上的引脚16(GPIO23)。
您可以在RPI上使⽤任何您喜欢的GPIO引脚,但您需要注意引⽤并相应地修改您的Python脚本。
模块的输出称为“回波”,需要更多思考。输出引脚为低电平(0V),直到模块进⾏距离测量。然后将此引脚设置为⾼电平(+ 5V),使脉冲返回相同的时间。所以我们的脚本需要衡量这个引脚保持⾼电平的时间。该模块对“⾼”使⽤+ 5V电平,但是对于仅适⽤于3.3V的GPIO 头上的输⼊,该模块太⾼。为了确保Pi只能⽤3.3V命中,我们可以使⽤基本的分压器。这是由两个电阻组成。
如果R1和R2相同,则电压被分成两半。这将给我们2.5V。如果R2是R1的两倍,那么我们得到3.33V,这是很好的。所以理想情况下,您希望R2位于R1和R1 x2之间。在我的⽰例电路中,我使⽤了330和470欧姆的电阻。⼀个替代⽅案是使⽤1K和1K5值。如果不⽤也可以,但不保证不bug
这是我的最后⼀个电路图。我选择了GPIO23和GPIO24,但您可以使⽤GPIO头上的17个可⽤GPIO引脚中的任何⼀个。只要记住更新脚本。
超声波模块电路
这是我的电路照⽚。我⽤了⼀⼩块⾯包板和⼀些男对⼥跳线。
超声波传感器电路
Python脚本
现在脚本实际上要做⼀些测量。在这个例⼦中,我使⽤的是Python。为什么Python?这是Pi最喜欢的语⾔,所以我倾向于将它⽤于所有的实验,但是这⾥的技术很容易应⽤于C.
您可以直接使⽤此链接 或通过Pi上的命令⾏下载脚本:
然后可以使⽤以下命令运⾏:
sudo python ultrasonic_1.py
声⾳的速度
⽤于到距离的计算依赖于声⾳的速度。这随温度⽽变化。脚本根据预定义的温度计算要使⽤的正确值。如果需要,您可以更改此值,或者使⽤温度传感器动态测量该值。
相⽚
以下是我通过GPIO头连接到Raspberry Pi的超声波传感器的⼀些照⽚:
准确性
这⾥有⼀些关于准确性的⼀些观点:
距离测量的精度取决于时间。Linux下的Python不适合精确的时序,但是对于⼀般的操作,它可以正常⼯作。为了提⾼准确性,您需要开始使⽤C代替。
当配置GPIO时,模块需要⼀段时间才能完成第⼀次读取,所以我在脚本开始时添加了0.5秒的延迟。
传感器具有⼴泛的灵敏度。在杂乱的环境中,由于对象在模块的侧⾯,您可能会读取更短的读数。
测量时间可达2厘⽶左右。低于这个限度,结果可以给出奇怪的结果。
如果超声波传感器接触任何东西,结果是不可预知的。
感谢这项技术,我现在知道从我的桌⼦到天花板的距离是155厘⽶。
如果不⽤上⾯的代码 可以复制如下代码进⾏测试。我是在树莓派3B上运⾏
|#! /usr/bin/python
# -*- coding:utf-8 -*-
#本代码实现的是树莓派利⽤超声波模块测距
#使⽤超声波测距模块时,VCC接树莓派的5V,GND接树莓派GND。trig接树莓派38,echo接树莓派40.
#GPIO编码⽅式为BOARD
import RPi.GPIO as GPIO
import time
def checkdist():
#发出触发信号
GPIO.output(38,GPIO.HIGH)
#保持10us以上(我选择15us)
time.sleep(0.000015)
GPIO.output(38,GPIO.LOW)
while not GPIO.input(40):
pass
#发现⾼电平时开时计时
t1 = time.time()
while GPIO.input(40):
pass
#⾼电平结束停⽌计时
t2 = time.time()
#返回距离,单位为厘⽶
return (t2-t1)*34000/2
GPIO.setmode(GPIO.BOARD)
GPIO.setup(38,GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(40,GPIO.IN)
time.sleep(2)
try:
while True:
print 'Distance: %0.2f cm' %checkdist()
time.sleep(0.5)
except KeyboardInterrupt:
GPIO.cleanup()|
下⾯为⼩车避障的代码 ,先定义⼩车前后左右的动作。然后进⾏距离判断进⾏相应的动作。
|#!/home/pi/server
# coding=utf-8
#使⽤超声波测距模块时,VCC接树莓派的5V,GND接树莓派GND。trig接树莓派38,echo接树莓派40. #GPIO编码⽅式为BOARD!!
import RPi.GPIO as GPIO
import time
def t_stop():
GPIO.output(11,False)
GPIO.output(12,False)
GPIO.output(15,False)
GPIO.output(16,False)
def t_up():
GPIO.output(11,True)
GPIO.output(12,False)
GPIO.output(15,True)
GPIO.output(16,False)
def t_down():
GPIO.output(11,False)
GPIO.output(12,True)
GPIO.output(15,False)
GPIO.output(16,True)
def t_left():
GPIO.output(11,False) GPIO.output(12,True) GPIO.output(15,True) GPIO.output(16,False)
def t_right():
GPIO.output(11,True) GPIO.output(12,False) GPIO.output(15,False) GPIO.output(16,True)
def bee():
GPIO.output(12,True) time.sleep(0.5)
GPIO.output(12,False) GPIO.output(15,True) time.sleep(5)
GPIO.output(12,True) GPIO.output(15,False)
def checkdist():
#发出触发信号
GPIO.output(38,GPIO.HIGH) #保持10us以上(我选择15us) time.sleep(0.000015) GPIO.output(38,GPIO.LOW) while not GPIO.input(40): pass
#发现⾼电平时开时计时
t1 = time.time()
while GPIO.input(40):
pass
#⾼电平结束停⽌计时
t2 = time.time()
#返回距离,单位为厘⽶
return (t2-t1)*34000/2 GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(38,GPIO.OUT,initial=GPIO.LOW) GPIO.setup(40,GPIO.IN)
GPIO.setup(11,GPIO.OUT)
GPIO.setup(12,GPIO.OUT)
GPIO.setup(15,GPIO.OUT)
GPIO.setup(16,GPIO.OUT)
##time.sleep(2)
try:
while True:
dis = int(checkdistance())
print(dis)
if dis <= 30:
print"distance less than 0.30m and back"
t_stop()
time.sleep(0.1)
t_down()
time.sleep(0.5)
t_left()
elif dis >30:
print"forward"
time.sleep(0.1)
t_up()
except KeyboardInterrupt:
GPIO.cleanup()|
此图与代码中定义是C语⾔的代码
如下为⼩车超声波避障的C代码
|#include
#include
#include
#include
#include
#include
#include能运行python的软件
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论