超声波传感器 - 从零开始认识各种传感器【第十九期】

超声波传感器|从零开始认识各种传感器

1、什么是超声波传感器 

超声波传感器是一种利用超声波来进行距离测量和目标检测的传感器。它通过发送,超声波脉冲,并测量超声波从传感器发射到目标物体并返回的时间来计算目标物体与传感器之间的距离。

图片

超声波传感器广泛应用在工业、国防、生物医学等方面。日常生活中最普遍接触到的有医学B超,智能泊车辅助等;在生物界也有蝙蝠,海豚等动物天然会利用超声波进行目标定位。

2、超声波传感器是如何工作的 

与红外线以及可见光传感器的工作原理类似,超声波传感器也是通过发射超声波,遇到被测物体反射后,通过接收到的超声波来测量距离以及识别、区分和测量物体。

图片

不同于光波,微波,或者红外线等电磁波,超声波是振动频率高于20kHz的机械波。一般的应用是从50kHz延申到5MHz,由于20kHz是人类能听到的声音的频率的上限,所以它被称为超声波。

超声波属于声波,具有方向性好、可定向传播等特点。其对于液体、固体的穿透性也很好。我们知道,声波在空气介质中的传播速度一般为340米每秒,它遇到活动物体能产生多普勒效应,也就是被测物体的相对运动,会导致反射波频率的增大或者减小,使得超声波传感器对于活动物体的检测非常灵敏。

超声波的测量原理是:超声波发射器发出超声波脉冲,经过介质(空气)传播到障碍物表面后反射,然后到达接收器。通过测量超声波从发射到接收所需的时间,并结合介质中的声速,可以计算出探头到障碍物表面之间的距离。

图片

3、常见的超声波传感器的种类 

超声波传感器的种类繁多,根据检测模式可分为收发一体型、收发分体型两种。

根据结构来分类可分为防水型(典型应用是汽车泊车辅助),高频型、开放型。其中开放型具有检测多普勒效应的能力。

根据材料分类可分为压电式(电致伸缩式)和磁致伸缩式;根据使用环境还可分为气体中的超声波传感器和液体中的超声波传感器。

压电式超声波发生器是利用逆压电效应的原理将高频电振动转换成高频机械振动,从而产生超声波。压电式超声波接收器的结构和超声波发生器基本相同,它利用正压电效应原理进行工作。

磁致伸缩式超声波发生器是把铁磁材料置于交变磁场中,磁场使它产生机械尺寸的交替变化即机械振动,从而产生出超声波。

4、超声波传感器的优点和缺点 

在选择超声波传感器时,要注意具体的测量环境和应用场景。一般来说,它适合于较长距离的高精度测量,由于它的穿透性好,尤其适合对于玻璃和水的检测。

5、超声波传感器实验演示 

我们来演示使用 MCU 读取显示超声波传感器的数据。实验中使用的是一款收发分体式超声波传感器。我们将手掌慢慢接近传感器,可以看到屏幕中显示的距离数值慢慢减小,距离示意圆圈也跟着慢慢缩小,然后随着手掌离开传感器,显示距离也随之开始增大。

主函数:

from machine import UART,Pin,Timer,PWM,SPI,time_pulse_us,freq
import _thread
from time import sleep_us,ticks_us,sleep
import uos
import test.st7789 as st7789
from test.fonts import vga2_8x8 as font1
from test.fonts import vga1_16x32 as font2
import random
import  math,array
import struct
global direction

freq(180_000_000)

trig = Pin(20, Pin.OUT, Pin.PULL_UP)
echo = Pin(21, Pin.IN)
st7789_res = 0
st7789_dc  = 1
disp_width = 240
disp_height = 240
CENTER_Y = int(disp_width/2)
CENTER_X = int(disp_height/2)
spi_sck=Pin(2)
spi_tx=Pin(3)
spi0=SPI(0,baudrate=60000000, phase=1, polarity=1, sck=spi_sck, mosi=spi_tx)

display = st7789.ST7789(spi0, disp_width, disp_width,
                          reset=machine.Pin(st7789_res, machine.Pin.OUT),
                          dc=machine.Pin(st7789_dc, machine.Pin.OUT),
                          xstart=0, ystart=0, rotation=0)
display.fill(st7789.BLACK)

def get_distance():
    # 发送10us的高电平脉冲来触发超声波传感器
    trigger_pin.on()
    time.sleep_us(10)
    trigger_pin.off()

    # 计算回波的时间
    duration = time_pulse_us(echo_pin, 1, 30000)  # 等待最长30ms

    # 将回波时间转换为距离(单位:厘米)
    distance = duration / 58  # 根据声波在空气中传播的速度计算距离
    return distance

def getlang():
    distance=0
    trig.value(1)
    sleep_us(20)
    trig.value(0)
    while echo.value() == 0:
        pass
    if echo.value() == 1:
        ts=ticks_us()                   #开始时间
        while echo.value() == 1:        #等待脉冲高电平结束
            pass
        te=ticks_us()                   #结束时间
        tc=te-ts                        #回响时间(单位us)
        distance=(tc*170)/10000       #距离计算(单位为:m)
    return distance
def light_dot(x,y,color):
   display.pixel(x,y,color)

def draw_circle(x,y,r,color,fill=0):
   '''
   绘制圆形
   :param x,y  圆心坐标
   :param r  圆心半径
   :param fill 0 不填充  1 填充
   '''
   angleList = [0.0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.7853981633974483, 0.8, 0.85, 0.9, 0.95, 1.0, 1.05, 1.1, 1.15, 1.2, 1.25, 1.3, 1.35, 1.4, 1.45, 1.5, 1.55, 1.5707963267948966, 1.6, 1.65, 1.7, 1.75, 1.8, 1.85, 1.9, 1.95, 2.0, 2.05, 2.1, 2.15, 2.2, 2.25, 2.3, 2.35, 2.356194490192345, 2.4, 2.45, 2.5, 2.55, 2.6, 2.65, 2.7, 2.75, 2.8, 2.85, 2.9, 2.95, 3.0, 3.05, 3.1, 3.141592653589793, 3.15, 3.2, 3.25, 3.3, 3.35, 3.4, 3.45, 3.5, 3.55, 3.6, 3.65, 3.7, 3.75, 3.8, 3.85, 3.9, 3.9269908169872414, 3.95, 4.0, 4.05, 4.1, 4.15, 4.2, 4.25, 4.3, 4.35, 4.4, 4.45, 4.5, 4.55, 4.6, 4.65, 4.7, 4.71238898038469, 4.75, 4.8, 4.85, 4.9, 4.95, 5.0, 5.05, 5.1, 5.15, 5.2, 5.25, 5.3, 5.35, 5.4, 5.45, 5.497787143782138, 5.5, 5.55, 5.6, 5.65, 5.7, 5.75, 5.8, 5.85, 5.9, 5.95, 6.0, 6.05, 6.1, 6.15, 6.2, 6.25, 6.283185307179586];
   for i in angleList:
     light_dot(x+round(math.sin(i)*r),y+round(math.cos(i)*r),color)
   if fill:
     powR = math.pow(r,2)
     for xx in range(x-r,x+r):
       for yy in range(y-r,y+r):
         if ( (math.pow(xx-x,2)+math.pow(yy-y,2)) < powR):
           light_dot(xx,yy,color)

current_r = 0
turn = 0
while True:
    distance = getlang()
    if distance <25 :
        dis = "Dis: {} ".format(distance)
        display.text(font2, str(dis), 0, 0)
        display.text(font2, "cm", 190, 0)
        print(dis)
        turn += 1
        current_r = int(distance*5 )
        for i in range (current_r,current_r+3) :
            draw_circle(120,120,i,st7789.BLUE+0x10*current_r*turn,fill=0)
        if turn == 50 :
            turn = 0
    
  
    

其他文件可点此查看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值