激光传感器 – 从零开始认识各种传感器【第二十一期】

激光传感器 – 从零开始认识各种传感器【第二十一期】激光传感器是一种利用激光技术来进行测量和检测的设备

大家好,欢迎来到IT知识分享网。

激光传感器|从零开始认识各种传感器

1、什么是激光传感器

激光传感器 - 从零开始认识各种传感器【第二十一期】

激光传感器是一种利用激光技术来进行测量和检测的设备。这类传感器使用激光光束来探测目标物体的位置、距离、速度或其他特性。激光传感器具有精度高、测量距离长,抗干扰能力强的特点。

2、激光传感器是如何工作的 

激光传感器的工作原理主要依赖于激光光束与目标物体的相互作用,如反射、散射或吸收。具体的工作原理依据不同类型的激光传感器会有所不同。

激光传感器 - 从零开始认识各种传感器【第二十一期】

区别于传统光源,激光具有高方向性,在几公里范围内的扩散也只有几厘米。他还具有高单色性,其频宽比普通光小十倍以上,激光束还具有高相干性和高亮度的特性,这是都是激光传感器的优势。

激光传感器 - 从零开始认识各种传感器【第二十一期】

对于测量距离和移动,常用的测量方式是三角测量式:通过半导体激光将激光照射到目标物上,目标物的反射光会在受光镜头上聚焦,并成像在光接收元件上;距离一旦变动,聚焦的反射光角度也会改变,光接收元件上的成像位置也随之发生变化。由于该光接收元件上的成像位置变化随目标物的移动量而变化,因此可通过读取成像位置的变化量来测量目标物的移动量。

激光传感器 - 从零开始认识各种传感器【第二十一期】

还有一种测量方式是时间测量式:它是通过测量激光从物体上反射回来所需的时间(TOF,即Time of Flight,飞行时间)来进行物体的定位和测量。当激光从物体上反射回传感器后,根据光的发射与反射的时间差,就可以计算出传感器与测量物体之间的距离。

图片

3、常见的激光传感器的种类 

激光传感器按照应用,可以分为激光测长,激光测距,激光测速几个种类。

3.1 测长激光传感器

激光传感器 - 从零开始认识各种传感器【第二十一期】

现代激光长度计量多是利用光波的干涉现象来进行的,其精度主要取决于光的单色性的好坏。激光是最理想的光源,它比以往最好的单色光源(氪-86灯)还纯10万倍。因此激光测长的量程大、精度高。最大量程可达几十公里。在测量数米之内的长度时精度可达0.1微米。

图片

3.2 测距激光传感器

激光传感器 - 从零开始认识各种传感器【第二十一期】

对于较短的距离测量一般采用激光三角测距法,激光束以一定的入射角度照射被测目标,激光在目标表面发生反射和散射,在另一角度利用透镜对反射激光汇聚成像,光斑成像在CCD位置传感器上。由于入射光和反射光构成一个三角形,运用几何三角定理就可以算出测量的距离。

激光传感器 - 从零开始认识各种传感器【第二十一期】

对于较长的距离测量多采用脉冲式激光测距,它是针对激光的飞行时间差进行测距,由于激光脉冲发射具有高能量密度的特点,非常适合天文观察,地理探测方面的测量。

激光传感器 - 从零开始认识各种传感器【第二十一期】

3.3 测速激光传感器

激光传感器 - 从零开始认识各种传感器【第二十一期】

测速激光传感器,通常利用多普勒效应来测量物体的速度。多普勒效应是当发射者和接收者之间的相对运动,会导致接收到的波的频率发生变化的现象。以汽车喇叭为例:当汽车以一定速度靠近听者时,听到的声音频率会增高,而当汽车远离时,听者会感觉到声音频率降低。

激光传感器 - 从零开始认识各种传感器【第二十一期】

由于激光的高能量密度特性,它也可以用来测量流体速度。激光输出被分成两束,汇聚到被测物体或者流体粒子上,由于被测物的移动以及两束激光存在的夹角,其返回的散射激光具备不同的多普勒频移,再与到达探测器的初始本振激光做计算,即可算出移动速度。

图片

4、激光传感器与其他传感器的比较 

激光传感器 - 从零开始认识各种传感器【第二十一期】

这是常用的几种传感器的特性比较,包括了激光,红外线,超声,激光四种传感器的各自特点。可以看到激光在多项比较中都有较好的表现,但是在成本方面是红外线和超声传感器比较有优势。

5、激光传感器实验演示 

我们来演示使用 MCU 读取显示激光传感器的数据,实验中使用的是一款反射型TOF激光传感器。将手慢慢靠近传感器的上方,可以看到随着手的贴近,显示测量的物体距离数值不断减小,屏幕显示的距离示意光环也越来越接近圆心。

激光传感器 - 从零开始认识各种传感器【第二十一期】

主代码:

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 vl6180x 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(0, scl=Pin(21), sda=Pin(20)) TOF=vl6180x.Sensor(i2c) TOF.init() TOF.default_settings() 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.74483, 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.48966, 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.2345, 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.9793, 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.72414, 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.469, 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.2138, 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.9586]; 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 : print(TOF.range()) turn += 1 if TOF.range() <200 : current_r = TOF.range() 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 

其余代码请前往gitee查看。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/149406.html

(0)
上一篇 2025-03-24 13:25
下一篇 2025-03-24 13:26

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信