树莓派基础实验24:超声波测距传感器实验

时间:2022-07-25
本文章向大家介绍树莓派基础实验24:超声波测距传感器实验,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

一、介绍

   超声波传感器使用超声波来准确检测物体并测量距离。他发出超声波并将它们转换成电信号,主要应用于汽车的倒车雷达、机器人自动避障行走、建筑施工工地以及一些工业现场。


二、组件

★Raspberry Pi 3主板*1

★树莓派电源*1

★40P软排线*1

★超声波传感器模块*1

★面包板*1

★跳线若干

三、实验原理

超声波传感器模块

  该传感器有4个引脚: VCC,超声波模块电源脚,接5V电源即可 Trig,超声波发送脚,高电平时发送出40KHZ出超声波 Echo,超声波接收检测脚,当接收到返回的超声波时,输出高电平5V GND,超声波模块GND 注意:Echo 返回的是 5v信号,而树莓派的 GPIO 接收超过 3.3v 的信号可能会被烧毁,因此需要加一个分压电路,这里由于返回的脉冲时间非常短,我没有加,能正常运行,但还是冒险了!

  超声波是指频率大于20 kHz的在弹性介质中产生的机械震荡波,其具有指向性强、能量消耗缓慢、传播距离相对较远等特点,因此常被用于非接触测距。声音是由振动产生的,能够产生超声波的装置就是超声波传感器,习惯上称为超声换能器,或者超声探头。超声波探头主要由压电晶片组成,既可以发射超声波,也可以接收超声波。

  常用的是压电式超声波发生器,是利用压电晶体的谐振来工作的。超声波传感器探头内部有两个压电晶片和一个共振板。当它的两极外加脉冲信号,其频率等于压电晶片的固有振荡频率时,压电晶片将会发生共振,并带动共振板振动,便产生超声波。反之,如果两电极间未外加电压,当共振板接收到超声波时,将压迫压电晶片作振动,将机械能转换为电信号,这时它就成为超声波接收器了。 超声波传感器就是利用压电效应的原理将电能和超声波相互转化,即在发射超声波的时候,将电能转换成超声波发射出去;而在接收时,则将超声振动转换成电信号。

  超声波碰到杂质或分界面会产生显著反射形成反射成回波,碰到活动物体能产生多普勒效应。由于超声波对液体、固体的穿透本领很大,尤其是在阳光不透明的固体中,因此超声波测距对环境有较好的适应能力,此外超声波测量在实时、精度、价格也能得到很好的折衷。

超声波传感器工作原理

  本实验中,HC-SR04超声波传感器通过发送声波,并计算声波返回超声传感器所需的时间来工作。通过往返时间检测法,它可以告诉我们物体相对于超声波传感器有多远。

  HC-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能, 测距精度可达高到3mm;模块包括超声波发射器、接收器与控制电路。基本工作原理:

(1)采用IO口TRIG触发测距,给至少10us的高电平信号;

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

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

(4)测试距离=(高电平时间*声速(340M/S))/2;

HC-SR04超声波模块工作原理

  初始化时将trig和echo端口都置低,给Trig一个10US以上的高电平,模块开始工作,模块内自动发送八个40khz方波,并自主检测是否有电波返回。这时我们需要检测Echo处的电平,当为高电平的时候记一个时间;当Echo出为低电平的时候在记一个时间,这两个时间的差就是高电平持续的时间,然后用测距公式进行计算。

四、实验步骤

第1步:连接电路。

树莓派

T型转接板

超声波测距模块

GPIO0

G17

Trig

GPIO1

G18

Echo

5V

5V

VCC

GND

GND

GND

超声波测距传感器实验电路图

超声波测距传感器实验实物接线图

第2步:编写控制程序。将手放在超声波测距模块上,观察屏幕上打印的距离数值。

#!/usr/bin/env python

import RPi.GPIO as GPIO
import time

TRIG = 11  #send-pin
ECHO = 12  #receive-pin

def setup():
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(TRIG, GPIO.OUT, initial = GPIO.LOW)
    GPIO.setup(ECHO, GPIO.IN)

def distance():

    GPIO.output(TRIG, 1)  #给Trig一个10US以上的高电平
    time.sleep(0.00001)
    GPIO.output(TRIG, 0)

    #等待低电平结束,然后记录时间
    while GPIO.input(ECHO) == 0:  #捕捉 echo 端输出上升沿
        pass
    time1 = time.time()  
    
    #等待高电平结束,然后记录时间
    while GPIO.input(ECHO) == 1:  #捕捉 echo 端输出下降沿
        pass
    time2 = time.time() 

    during = time2 - time1   
#ECHO高电平时刻时间减去低电平时刻时间,所得时间为超声波传播时间
    return during * 340 / 2 * 100  
#超声波传播速度为340m/s,最后单位米换算为厘米,所以乘以100
def loop():
    while True:
        dis = distance()
        print dis, 'cm'
        print ''
        time.sleep(0.3)

def destroy():
    GPIO.cleanup()

if __name__ == "__main__":
    setup()
    try:
        loop()
    except KeyboardInterrupt:
        destroy()