避障模块的功能就是让小车能够检测到障碍物并且可以正确的避开障碍物。当然避障的方式有很多种。我选择的是超声波结合红外传感器来避障。
- 为什么要用超声波传感器结合红外传感器?
因为硬件原因,没有舵机,原本超声波可以安装在舵机上,通过舵机转动,让超声波检测周围障碍物,我们可以设置舵机转动的角度,最大程度减少超声波检测的盲区。我在设计的时候提前没有想到要舵机,所以后来也来不及了。
我的超声波传感器固定在了小车的正前方,只能检测到正前方的障碍物,左右两边的障碍物超声波无法检测,所以我只能在左前和右前两个位置安装了两个红外避障传感器来检测障碍物。 - 避障方案还存在的不足?
1.虽然用红外传感器检测了左右的障碍物,但是超声波依然存在盲区,高于和低于超声波检测位置的障碍物无法检测到。
2.小车后方的障碍物没有检测的装置
3.红外传感器在强光下无法正常工作 - 如何完善避障方案?
如果你想设计更加完善的避障方案,需要做如下工作:
1.增加舵机
2.小车后方增加超声波传感器或者红外传感器
接下来讲解避障电路和原理 - 电路连接:
(1)超声波的电路连接:超声波共有4个引脚,VCC、GND、Trig、Echo。
Trig是发送端,发出超声波,Echo是接收端,接收超声波。电路连接图如下:
如上图所示,VCC接了2号引脚(+5V),GND接了39号引脚(GND),Trig和Echo分别接了35和37号引脚(GPIO),还是一样,你自己在设计的时候可以选择正确的任何引脚。
(2)红外避障传感器的电路连接:红外避障传感器共有三个引脚,VCC、GND、OUT。电路连接图如下:
如图中所示,两个传感器的VCC都接树莓派的4号引脚(+5V),GND都接树莓派的34号引脚(GND),OUT分别接了36号和40号引脚(GPIO口)。还是一样,你自己可以选择引脚来设计。 - 避障原理:
(1)超声波测距原理:
超声波传感器包括发射端(Trig)和接收端(Echo),使用IO口Trig触发测距,给在至少10us的高电平信号下会模块会自动发射方波,发出信号的同时接收端会输出高电平,等到接收到反射回来的信号时,Echo就会跳转为低电平。通过超声波的工作原理可知:从Trig=1到Echo=0的时间,就是超声波从发射到返回的时间,因此:障碍物的距离=Echo高电平持续的时间*声速/2。
(2)红外避障传感器:红外传感器检测到障碍物时状态为False,两个灯亮,没有检测到时为True,一个灯亮。 - 设计方案图解:
- 代码:
import RPi.GPIO as GPIO
import time
Trig=35
Echo=37
L_Senso=40
R_Senso=36
def init():
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(Trig,GPIO.OUT)
GPIO.setup(Echo,GPIO.IN)
GPIO.setup(L_Senso,GPIO.IN)
GPIO.setup(R_Senso,GPIO.IN)
def get_distance():
GPIO.output(Trig,GPIO.HIGH)
time.sleep(0.00015)
GPIO.output(Trig,GPIO.LOW)
while GPIO.input(Echo)!=GPIO.HIGH:
pass
t1=time.time()
while GPIO.input(Echo)==GPIO.HIGH:
pass
t2=time.time()
distance=(t2-t1)*340*100/2
return distance
def bizhang():
safe_dis=40
while True:
barrier_dis=get_distance()
if (barrier_dis < safe_dis) == True:
while (barrier_dis < safe_dis) == True:
L_S=GPIO.input(L_Senso)
R_S=GPIO.input(R_Senso)
if L_S == False and R_S == True:
print "左有障碍物先后退再右转"
turn_back(18,0.5)
turn_right(18,0.2)
if L_S == True and R_S == False:
print "右有障碍物先后退再左转"
turn_back(18,0.5)
turn_left(18,0.2)
if L_S ==False and R_S == False:
print "两边都有障碍物后退"
turn_back(18,0.5)
L_S=GPIO.input(L_Senso)
R_S=GPIO.input(R_Senso)
if L_S == True and R_S == True:
print "右转"
turn_right(18,0.2)
if L_S == False and R_S == True:
print "右转"
turn_right(18,0.2)
if L_S == True and R_S == False:
print "左转"
turn_left(18,0.2)
if L_S == False and R_S == False:
print "后退"
turn_back(18,0.5)
if L_S == True and R_S == True:
print "两边都没有障碍物,后退再右转"
turn_back(18,0.5)
turn_right(18,0.2)
print barrier_dis,'cm'
print ''
barrier_dis=get_distance()
else:
L_S=GPIO.input(L_Senso)
R_S=GPIO.input(R_Senso)
if L_S == True and R_S == True:
print "前方40cm内没有障碍物,且左前和右前方没有障碍物,前进"
turn_up(18,0)
if L_S == False and R_S == True:
print "前方40cm内没有障碍物,左前有障碍物,右前方没有障碍物,后退右转"
turn_back(18,0.5)
turn_right(18,0.2)
if L_S == True and R_S == False:
print "前方40cm内没有障碍物,右前有障碍物,左前方没有障碍物,后退右转"
turn_back(18,0.5)
turn_left(18,0.2)
if L_S == False and R_S == False:
print "前方40cm内没有障碍物,左前,右前方都有障碍物,后退"
turn_back(18,0.5)
L_S=GPIO.input(L_Senso)
R_S=GPIO.input(R_Senso)
if L_S == True and R_S == True:
print "右转"
turn_right(18,0.2)
if L_S == False and R_S == True:
print "右转"
turn_right(18,0.2)
if L_S == True and R_S == False:
print "左转"
turn_left(18,0.2)
if L_S == False and R_S == False:
print "后退"
turn_back(18,0.5)
print barrier_dis,'cm'
print ''
- 注:
(1)你在测试运行时,需要添加基本运动的代码。
(2)我的避障的处理代码只能作为参考,写的不是很简洁。可以参考部分原理,你自己需要设计符合你自己情况的避障代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)