美文网首页
手把手教你打造智能小车(4)-使用传感器自动避障

手把手教你打造智能小车(4)-使用传感器自动避障

作者: 赵小生 | 来源:发表于2018-11-18 21:51 被阅读165次

    1. 超声波传感器

    1.1 简介

    超声波传感器是一种广泛使用的距离传感器。本文使用树莓派连接 HC-SR04 超声波测距传感器,用python GPIO 控制传感器完成距离测定,并控制小车在前方障碍小于某一特定值时,做出“停止”、“后退”等一系列动作。

    HC-SR04 超声波距离传感器模块可提供 2cm - 400cm 的非接触式距离感测功能,测距精度可达高到3mm。模块包括超声波发射器、接收器与控制电路。如下图。

    image

    1.2 工作原理

    传感器的基本工作原理是

    (1)给 IO 口 TRIG 至少 10 μs 的高电平信号触发测距;

    (2)模块自动发送 8 个 40 khz 的方波,自动检测是否有信号返回;

    (3)有信号返回,通过 IO 口 ECHO 输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。因此,可以得到

    测试距离=(高电平时间*声速)/2  #声速一般取340 m/s
    

    1.3 接线方式

    HC-SR04 超声波距离传感器模块共有四个引脚,其中有两个电源引脚和两个控制引脚。

    1. Vcc 和 Gnd 是电源引脚,Vcc 接树莓派GPIO 口输出的 5v 电源接口,Gnd 接树莓派任意一个 Gnd 接口。理论上说,Vcc 和 Gnd 接任意的 5v DC 电源都行,但最好使用树莓派的 GPIO 口供电,不然会影响这个模块的运行。

    2. Trig 引脚用来接收树莓派的控制信号。接任意 GPIO 口。

    3. Echo 引脚用来向树莓派返回测距信息。接任意 GPIO 口。

    (注意 Echo 返回的是 5v信号,而树莓派的 GPIO 接收超过 3.3v 的信号可能会被烧毁,为保证树莓派 GPIO 口 安全,最好加一个分压电路,我这里没有加,直接用杜邦线连的)。

    1.4 使用方法

    使用 Python 的 GPIO 库操作超声波传感器方法如下。

    创建一个 python 文件,命名为 checkDist.py。打开文件,输创建测距函数 checkdist,如下。

    import RPi.GPIO as GPIO
    import time
    
    ########超声波传感器接口定义#################
    Trig = 38
    Echo = 40
    # 超声波距离探测
    def checkdist(self):
        GPIO.setup(Trig, GPIO.OUT, initial=GPIO.LOW)
        GPIO.setup(Echo, GPIO.IN)
        GPIO.output(Trig, GPIO.HIGH)
        time.sleep(0.00015)
        GPIO.output(Trig, GPIO.LOW)
        while not GPIO.input(Echo):
            pass
        t1 = time.time()
        while GPIO.input(Echo):
            pass
        t2 = time.time()
        return (t2-t1)*340*100/2
    

    之后,循环执行这一函数,并把测得的目标物距离显示出来

    def distStart():
        try:
        while True:
            print '目标距离:%0.2f cm' % checkdist()
            time.sleep(0.5)
        except KeyboardInterrupt:
            GPIO.cleanup()
    
    distStart()
    

    保存代码并执行,可以看到,每隔 0.5秒,系统将显示前方目标物的距离。

    2. 红外传感器

    2.1 简介

    红外传感器是专为轮式机器人设计的一款距离可调的避障传感器。其具有一对红外线发射与接收管,发射管发射出一定频率的红外线,当检测方向遇到障碍物(反射面)时,红外线反射回来被接收管接收,此时指示灯亮起,经过电路处理后,信号输出接口输出数字信号,通过探测此信号来判断前方有障碍物。
    工作电压为3.3V-5V,由于工作电压范围宽泛,在电源电压波动比较大的情况下仍能稳定工作,具有干扰小、便于装配、使用方便等特点,可以广泛应用于机器人避障、 避障小车、流水线计数及黑白线循迹等众多场合。

    image

    2.2 使用说明

    红外传感器的工作电压为DC 3.3V-5V,可直接与树莓派的 5V 电压连接;工作温度 -10℃—+50℃,可适应大部分工况;在指定距离内探测到障碍物时,电路板上指示灯点亮,同时 OUT 端口持续输出低电平信号,使用非常方便;另外,通过传感器上的电位器旋钮可以调节检测距离,有效距离 2 ~ 40 cm。

    接线方式如下:

    1. VCC 外接 3.3V-5V 电压(直接与树莓派 5v 电源接口相连)
    2. GND 外接 GND(与树莓派任意 GND 接口相连)
    3. OUT 输出接口(与树莓派 GPIO 口相连)

    2.3 使用方法

    我们使用一个 LED 灯来来作为有障碍物时发出的警告。Python代码如下:

    import RPi.GPIO as GPIO
    import time
    
    GPIO.setmode(GPIO.BOARD)
    GPIO.setwarnings(False)
    ########红外传感器接口定义#################
    GPIO_OUT = 16
    led = 37 
    #设置引脚为输入和输出
    #设置16针脚为输入,接到红外避障传感器模块的out引脚
    GPIO.setup(GPIO_OUT,GPIO.IN) 
    GPIO.setup(led,GPIO.OUT)     
     
    def warn():   
        GPIO.output(led,GPIO.HIGH) #亮灯来作为有障碍物时发出的警告
        time.sleep(0.5)
        GPIO.output(led,GPIO.LOW)
        time.sleep(0.5)
            
    while True:
        if GPIO.input(GPIO_OUT)==0: #当有障碍物时,传感器输出低电平,所以检测低电平
            warn()
    GPIO.cleanup()
    
    

    保存代码并执行,然后将手挡在传感器前,就会看到 LED 灯一闪一闪的,拿开手时,LED 灯将熄灭。转动传感器上的电位器旋钮,可以发现红外传感器发出警告时,目标的距离会发生变化。选择合适的告警距离,大约 15 cm 就可以了。

    将超声波测距功能和红外避障功能加入到小车转向控制代码中,一个完整的自动避障小车就完成了。详细代码,见 Github

    系列目录:

    《手把手教你打造智能小车(0)-写在前面的话》

    《手把手教你打造智能小车(1)-树莓派及其使用配置

    《手把手教你打造智能小车(2)-点亮 LED 灯

    《手把手教你打造智能小车(3)-小车跑起来

    《手把手教你打造智能小车(4)-使用传感器自动避障

    《手把手教你打造智能小车(5)-使用舵机打造摄像机云台

    相关文章

      网友评论

          本文标题:手把手教你打造智能小车(4)-使用传感器自动避障

          本文链接:https://www.haomeiwen.com/subject/eolnfqtx.html