避障模块的功能就是让小车能够检测到障碍物并且可以正确的避开障碍物。当然避障的方式有很多种。我选择的是超声波结合红外传感器来避障。

  • 为什么要用超声波传感器结合红外传感器?
    因为硬件原因,没有舵机,原本超声波可以安装在舵机上,通过舵机转动,让超声波检测周围障碍物,我们可以设置舵机转动的角度,最大程度减少超声波检测的盲区。我在设计的时候提前没有想到要舵机,所以后来也来不及了。
    我的超声波传感器固定在了小车的正前方,只能检测到正前方的障碍物,左右两边的障碍物超声波无法检测,所以我只能在左前和右前两个位置安装了两个红外避障传感器来检测障碍物。
  • 避障方案还存在的不足?
    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,一个灯亮。
  • 设计方案图解:
  • 代码:
#coding=utf-8
import RPi.GPIO as GPIO
import time
#定义超声波模块的GPIO口
Trig=35 #发射端
Echo=37 #接收端
#定义红外避障传感器GPIO口
L_Senso=40
R_Senso=36def 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) #给Trig发送高电平,发出触发信号time.sleep(0.00015) #需要至少10us的高电平信号,触发Trig测距GPIO.output(Trig,GPIO.LOW)while GPIO.input(Echo)!=GPIO.HIGH: #等待接收高电平passt1=time.time() #记录信号发出的时间while GPIO.input(Echo)==GPIO.HIGH: #接收端还没接收到信号变成低电平就循环等待(等高电平结束)passt2=time.time() #记录接收到反馈信号的时间distance=(t2-t1)*340*100/2 #计算距离,单位换成cmreturn 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)我的避障的处理代码只能作为参考,写的不是很简洁。可以参考部分原理,你自己需要设计符合你自己情况的避障代码。

树莓派小车————避障篇相关推荐

  1. 树莓派小车避障之——超声波控制(2.1)

    不带舵机驱动代码: 有障碍物的话------就右转或者左转避开 #!/usr/bin/env pythonimport RPi.GPIO as GPIO import time import sys ...

  2. WeMos下实现小车避障与手机控制

    参考:WeMos下实现小车避障与手机控制 作者:爱学习的小王呀 发布时间:2020-10-02 10:17:45 网址:https://blog.csdn.net/hongliwong/article ...

  3. STC单片机实现智能小车避障功能的C语言例程

    使用STC单片机实现智能小车避障功能的C语言例程: #include <reg52.h>// 定义GPIO口映射宏,需根据具体型号和连接方式进行修改 #define MOTOR_LEFT_ ...

  4. 树莓派红外避障小车python_基于树莓派的环保“捡垃圾”机器人小车(避障、摄像、红外、WIFI)...

    项目:基于树莓派的环保"捡垃圾"机器人小车控制平台 功能:避障.锁定某个障碍物 概述: 目前这个控制平台能够识别是"垃圾"只是塑料瓶,核心是利用Arduino控 ...

  5. matlab智能小车避障,Arduino智能小车系列教程4——超声波避障

    Arduino智能小车系列教程4--超声波避障 Arduino智能小车系列教程 准备材料 超声波模块HC-SR04 舵机固定架 舵机安装 超声波接线 代码测试 代码详解 int getDistance ...

  6. 如何使用树莓派制作避障机器人

    学习Arduino或者树莓派的过程中,如果仅仅看代码或者做简单实验,那么常常会虎头蛇尾,所以我们建议还是尝试一些简单的机器人项目,这样既有趣也能不断学习提高.本文将向大家展示如何使用树莓派制作简单的避 ...

  7. vrep小车避障算法_V-REP 小车建模

    任务概要参考文档中 Tutorial – BubbleRob Tutorial 部分,学习:车身与轮子物理引擎的设计 动力学模型等参数的设置 传感器的添加与使用 驱动关节的设计与控制 控制脚本的编写 ...

  8. my_RIO实现小车避障

    my_RIO实现小车的超声波避障 设计思路 labVIEW程序设计![在这里插入图片描述](https://img-blog.csdnimg.cn/20210620152515364.JPG?x-os ...

  9. NI myrio+labview+红外传感器小车避障巡线控制

    一.实验设备与软件 1.NI myRIO一块,小车一台,自备iPad或手机. 2.软件系统:Win7系统,Labview2015开发软件,NI myRIO2015驱动程序,APP软件Data Dash ...

最新文章

  1. java怎么让进程停止_JAVA:如何在进程停止时调用一个方法(甚至有可能吗?)
  2. python背景颜色词云图_python中实现词云图
  3. jquery 操作字符串、数组、对象常用方法
  4. R7-12 h0008.卡片延伸长度 (15 分)
  5. Java I/O体系之Writer和Reader详细讲解
  6. WinAPI: 钩子回调函数之 CallWndProcRetProc
  7. 深入PHP使用技巧之变量
  8. 如何系统的自学python-怎样才能彻底系统的自学python?!白Python菜鸟教程
  9. 关于SpringBoot和Thymeleaf模板中遇到的问题
  10. java 前端模板_前端项目模板
  11. EZEMC测试软件_AR EMC测试软件EMCWARE
  12. 华为员工工作生活及待遇全面揭秘
  13. Solidworks 草图绘制
  14. 谈谈你对Spring 的理解
  15. PocketPC常用程序和设置打开命令参数列表
  16. 论文阅读:Deep Residual Shrinkage Networksfor Fault Diagnosis
  17. (转载)JS与WebView交互存在的一些问题
  18. 微信公众号给微信用户推送信息 模板信息
  19. BootStrap一页通(样式+组件+插件)(全)
  20. python自动添加cad点坐标_利用pyautocad模块批量画点位

热门文章

  1. Stop sucking,Become awesome.这一年我做到了么
  2. windows10/11系统实现本地账户密码登录微软账户 微软账户取消pin登录
  3. java面试题,各大企业常见的java笔试题之九
  4. 如何写一个完整的django网站:配置环境啥的不讲(python+mysql+html相关) 壹
  5. android 百度人脸识别,百度人脸识别模块使用分享
  6. 什么是CS寄存器,什么是IP寄存器
  7. HTML页面跳转后返回原页面,H5跳转链接之后,返回原界面
  8. java音频频谱_Android 音乐频谱实现
  9. java redis 管道_4个点让你彻底明白Redis的各项功能
  10. 5g局域网传输速度_5G 内网传输速度为什么比2.4G还要慢?