接近传感器|从零开始认识各种传感器
1、什么是接近传感器
接近传感器常被用于检测物体的距离或者是否有物体靠近。它通常发射电磁场或电磁波(例如红外线)来探测物体的位置。当有物体靠近时,传感器会接收到反射的电磁波信号,从而触发相应的电路或者控制系统。它广泛应用于物体感应接近开关等场合, 如自动水龙头,智能手机等。
2、接近传感器工作原理
接近传感器通过不同的工作原理来检测物体是否接近。常见的工作原理包括利用红外线、超声波、电容变化或磁场变化来感知物体的存在或距离。传感器发射特定信号并接收反馈,根据信号的变化来判断物体的位置或距离,从而触发相应的输出信号。
3、常见的接近传感器的种类
依据测试原理不同,接近传感器可以分为红外,超声波,电容式和电感式接近传感器。
3.1 红外线接近传感器
红外接近传感器利用红外线来检测物体的接近。传感器内部包含一个红外发射器,它会发射红外线束;当红外线遇到物体时,部分红外线会被物体反射回传感器。传感器内部还有一个红外接收器,用于接收反射回来的红外线信号。传感器会分析接收到的信号,根据信号的强弱来判断物体的距离或者是否有物体靠近。
3.2 电容式接近传感器
电容接近传感器:通过测量物体与传感器之间的电容变化来检测物体的接近。传感器中的感应板与目标物体形成一个电容,电容随着与物体的距离变化而变化。由于电容容值的大小决定了振荡器产生的频率,对该频率进行监测,便可感知物体的接近。
电容式接近传感的一个示例是智能汽车门禁系统中。检测人手靠近的接近传感器位于车门把手内,一旦检测到有物体靠近,主控单元通过低频天线发送一个唤醒信号;该信号激活汽车钥匙发送器。汽车钥匙发送器于是与RFID接收器交换信息并完成开锁,整个过程在几分之一秒内就可完成,在人手摸到把手之前,门锁就已经打开了。
3.3 电感式接近传感器
电感式接近传感器一般仅适用于金属物体,多用于金属探测场景。它有一个电磁线圈用于产生交流磁场,在有金属物体接近时会改变磁场的强度或方向,从而触发传感器输出相应信号。
3.4 超声波接近传感器
超声波接近传感器利用超声波的回波来检测物体的距离。传感器发射超声波脉冲,当脉冲遇到物体时,会被反射回传感器,通过计算回波的时间或频率来确定物体与传感器的距离。
3.5 几种接近传感器的对比
从对比表格可以看出,超声波的检测范围最大,红外和电感接近传感器的成本相对更低,而电感接近传感器只可以用于金属探测,具体设计应用中的选择需要进行综合考量。
4、接近传感器实验演示
我们来演示使用MCU 读取显示接近传感器的数据。实验中使用的是一款常见的红外接近传感器。将手指慢慢靠近传感器,可以看到,随着手指距离越来越近,屏幕上显示的感应圆圈变得越来越大。
代码:
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 framebuf
from machine import Pin, SPI, ADC,PWM,I2C,freq
import time, math,array
from utime import sleep_ms
import struct
import vcnl4010
freq(180_000_000)
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=60_000_000, 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)
buttonM = Pin(5,Pin.IN, Pin.PULL_UP) #B
buttonS = Pin(6,Pin.IN, Pin.PULL_UP) #A
buttonL = Pin(7,Pin.IN, Pin.PULL_UP) #A
buttonPRESS = Pin(8,Pin.IN, Pin.PULL_UP) #A
buttonR = Pin(9,Pin.IN, Pin.PULL_UP) #A
i2c = I2C(1, scl=Pin(23), sda=Pin(22))
vcnl=vcnl4010.VCNL4010(i2c)
vcnl.startup()
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 :
turn += 1
current_r = int(vcnl.readProximity() * 100 / 65555)
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
其余代码文件请点此查看。