逆向工程激光扫描仪Leuze RS4


之前,我谈到过反向工程激光距离传感器这次我们将讨论更复杂的设备-激光扫描仪Leuze RS4。像传感器一样,这台扫描仪处于崩溃状态,因此我不得不处理其工作的恢复,并在此过程中改善其某些特性,实际上,将其重新制成另一台设备。

这是什么激光扫描仪?


Leuze RS4是一款激光安全扫描仪,即旨在防止人们进入工厂的危险区域,防止生产车辆碰撞等。它具有相当不错的特性-最大范围:15 / 50m(取决于操作模式) ),在整个测量范围内的距离测量精度为5 mm,角分辨率为0.36度,扫描速度为25 rpm(25000次测量/秒)。

值得注意的是,此扫描仪的位置恰好是安全设备,也就是说,它将警报和警告区域的位置存储在内存中,当物体进入这些区域时,其中一个键会在扫描器中打开。要配置区域的位置,可以将扫描仪连接到计算机并观察屏幕上障碍物的位置。甚至还有一个ROS软件包,可让您从此扫描仪接收数据。
我得到了没有箱子的扫描仪,将其分解成各个组件。扫描仪由于强烈撞击身体而坠毁;到底是什么原因停止了工作,我仍然不明白-可能是光学系统未对准,其中一个连接器的触点断开,编码器传感器移动了或其他原因。我试图将所有零件组装在一起,在本机软件中看到了扫描仪,但是扫描没有开始。因此,我只有一种启动它的方法-尽可能完全恢复扫描仪电路,并编写自己的扫描仪微控制器固件。

这是我看起来像的零件:这些零件 应该放在箱子中(从文档中的照片中可以看出,设计和电子设备略有不同):

图片



图片

扫描仪的另一个重要组成部分是安装在其中央的扫描镜(上图中以蓝色突出显示):

图片

扫描仪的示意图:

图片

从图中可以看出,扫描仪的整个电子设备均包括通过连接器和回路连接的独立模块(板)。

有很多模块-电源模块(DC-DC),接口模块,处理器模块,光电探测器模块(APD),激光模块。此外,还有一个编码器模块和两个马蹄形板,一开始看起来很奇怪。

首先,值得关注它们:

图片

显然,其中一个板包含LED,第二个板包含光电二极管。最初,我认为它是某种编码器或某种用于检查激光辐射的机制。但是,稍后,在阅读完扫描仪的文档并详细检查了照片之后,我意识到这是一个用于监视扫描仪防护玻璃表面状态的系统。

照片中可见LED的孔:



通过测量来自光电二极管的信号电平,可以估算防护玻璃的透射电平。显然,该系统对于扫描仪而言并不重要,因此将来我不会使用这些板。

处理器模块是扫描仪最困难的部分。这是从两个方面看模块电子设备的外观:

图片

第一次看板时,我立即意识到扫描仪使用了飞行时间距离测量方法(TOF)-标记最大的芯片竟然是“ ACAM TDC-GPX ”,这我已经听说过。 TDC-“时间数字转换器”,即专门设计用于以非常高的精度测量时间间隔的芯片,它是用来测量激光脉冲“飞行”时间的。
板上还装有一个英飞凌C167微控制器,它带有一个外部FLASH存储器芯片(令人欣喜)和ASIC(令人沮丧)。我将在下面详细介绍该模块。

电源模块包含一个定制的电隔离DC-DC转换器,

图片

该转换器具有多个输出电压和多个电容器:转换器的电源电压为24V。它的主要特点是它为单独的小型连接器提供了一个高电压(〜230V),这对于操作激光和光电探测器是必需的。

它还向主连接器输出以下电压:+ 5V,-5V,〜15V,与其余电隔离为RS232接口的+ 5V。

扫描仪的光学部分

图片

乍一看,扫描仪的光学元件在哪里还不太清楚。在这种情况下,位于照片中央的带有镜子的小窗口用于输出激光束,围绕它的较大的发亮表面是安装在光电探测器透镜前面的干涉滤光片的表面。该滤光片仅透射波长接近激光波长的辐射。

这是扫描仪文档中显示的方式:



镜头本身安装在黑色塑料外壳内,因此很难看到它。在此外壳的末端,与上图相反,固定了激光模块光电探测器激光模块

图片


激光模块的类型(一些细节在电路图中由我标出): 如您所见,该模块的电路非常简单,因此我可以完全恢复其电路: 板上较大的圆形部分是专用的激光发射器。不幸的是,上面没有标记,因此找不到文档。 从扫描仪的说明中,您可以找到-“激光波长-905 nm”,“激光等级-1”,“脉冲持续时间-0.003 µs”,“重复频率-25 kHz”。 通过恢复模块电路并分析其操作可以了解什么:

图片



图片






  • 激光发射器始终由齐纳二极管限制供应143 V的电源电压。
  • , «3» . , , .
  • , , . ( ) «» .

所有激光控制都在一行中执行-“ LASER_PULSE”。在线上的大多数时间应为“高”电平。当施加负脉冲时,触发器DD1在其上升沿复位为0,在下降沿,触发开始“等待”来自光电二极管的信号,然后激光器启动。当出现来自光电二极管的信号时,触发器将切换到1。
您可以使用连接到模块的连接器注意到两条同轴线。它们用于将差分信号从触发器传输到TDC芯片。

该模块上还有五个LED。处理器模块控制它们。

光电探测器
模块该模块本身如下所示: 附近的光电探测器本身的照片:

图片



图片

电路板角落的高压标志清楚地表明,此处使用了雪崩光电二极管(APD) -它们需要相当高的电压才能工作。

不幸的是,光电探测器主体上没有可见的标记。通过光电二极管本身(在中间)上的徽标,只能确定它是由Pacific Silicon Sensor(第一传感器)制造的但是,没有关于他的更多信息,也许他是定制的。从照片中可以看出,该光电探测器是混合型的,即包含一个内置放大器-在光电二极管上方清晰可见。显然,放大器和光电二极管需要电源-它通过下部端子供电(电容器焊接到它们)。一个大谜团是光电二极管左侧的小细节,上面有三个导体。进一步的研究表明,这是一个模拟热传感器。

该模块比上一个模块复杂得多,它使用多层印刷电路板-至少4层,大多数信号线位于板的外层,这极大地方便了其分析。在此模块中,我恢复了大约80%的电路,其余部分对我来说并不是真正需要的。

光电检测器模块的最终电路: 在电路的顶部是用于雪崩光电二极管的可调线性高压源。它可以产生至少150 V的稳定电压。此电源由DA1 DAC(LTC1451)控制。

图片



由于扫描仪基于脉冲测距仪,因此光电检测器模块的主要任务是快速检测从障碍物反射的足够弱的激光信号。由于光信号的电平非常小,因此只能使用具有自身增益的雪崩光电二极管来检测。在这种情况下,来自光电二极管的信号还会通过集成在光电探测器中的集成放大器进行放大。由于放大器内置在光电探测器的主体中,因此可以减少干扰对有用信号的影响。由光电探测器产生的信号(OUT_B)被传输到某个DA4芯片,该芯片显然是另一个高频放大器。之后,信号被传输到高速比较器D1(MAX9601)的直接输入。来自电阻分压器的参考信号(约50 mV)被馈送到该比较器的反相输入。

比较器输出端的信号是差分信号,它通过同轴线直接传输到处理器模块板。

此外,来自DA4放大器输出的信号被传输到某种峰值检测器,该峰值检测器“记住”了接收脉冲的最大电平。我没有开始恢复该节点的电路,而是仅将其输出级(U1芯片)拉到电路上,信号的输出级也从该信号传输到处理器模块。

我不太清楚的扫描仪部件之一是安装在RF放大器输出端的Q3晶体管。通过电路判断,需要使放大器输出端的信号衰减。可以使用来自处理器板的信号来控制该晶体管(第10行-“ digi”)。

您可能会注意到该板上有一个EEPROM芯片。该芯片的所有信号输出均连接至处理器板。显然,在该微电路中,存储了一些参数,这些参数对于每个光电检测器板都是唯一的,并在测试该板时记录在其中。特别地,这可以是增益APD对电源电压的依赖性,温度传感器的输出处的电压对其温度的依赖性以及其他类似特性的曲线。

您会看到,可以通过在连接到DAC和EEPROM的CLK,CS,CS2线上设置某些电平来控制光电检测器的功率。

该评估板包含旨在监测其状况的若干电路。您可以控制APD的电压电平,其温度(第7行)和比较器的阈值。这些电压由DA3-DA5运算放大器转换并传输到处理器模块板。

返回到处理器 模块该模块是所有模块中最复杂的模块,它包含大量的多输出微电路,电路板又是四层的,大多数信号线在内层分开,这使电路的恢复大大复杂化。 经常发现,轨道切换到了板的另一侧。为了快速搜索特定轨道的连接位置,我只需要使用连接到万用表的画笔(在拨号模式下):

图片





图片

我恢复了大约70%的计划-其余的我并不需要。处理器模块

图片

的框图:处理器模块的结果图: 尽管事实上我到处都称这个模块为“处理器模块”,但实际上它是基于Infineon SAK-C167CR-L33M微控制器的。它具有144个引脚,并基于相当古老的C166架构构建。该微控制器没有自己的非易失性存储器-必须通过并行总线将外部存储器连接到它。为此,扫描仪具有一个闪存芯片M29F400B(512K x 8 / 256K x 16)。另外,两个RAM芯片连接到微控制器-IS61C6416AL-12(64K x 16)和K6R4016C1D(256K x 16)。

图片



您可以看到,地址总线连接到所有存储微电路,仅移位了一位-存储线A0连接到微控制器的线A1。这是由于以下事实:地址是在地址总线上以字节为单位设置的,但是控制器和内存是16位的。为了使控制器将单个字节写入RAM而不影响16位字中的相邻字节,存储芯片具有特殊的行UBn,LBn。该解决方案在具有并行总线的设备中非常常见,并在控制器的文档中进行了详细描述。

但是处理器模块中的另一种解决方案对我来说还不是很清楚。如果查看U1闪存芯片,您会注意到该芯片的A14线已接地。相应的A15控制器地址总线未完全连接到芯片。结果是控制器只能访问闪存的一半。与RAM2芯片(DD3)完全类似的情况。

使用RAM1(DD2)芯片时,情况有所不同-A15控制器线也未连接到它,但是与此同时,该芯片的所有地址输入都连接到了地址总线,以便控制器可以访问芯片的整个内存。

现在,您应该注意逻辑元素DX1,DX2,DD4上的节点。正是这些微电路决定了微控制器选择了哪个存储微电路。可以看出它们受以下信号控制:

  • WRn-记录信号,有效电平-低。在这条线上,当您需要向外部RAM存储器中写入一些数据时,微控制器设置为低电平
  • A15是同一条数据总线,没有直接连接到任何存储芯片。
  • CSn0是专用的芯片选择信号,有效电平为低电平。这条线连接到集成在控制器中的地址解码器。复位后,控制器为低电平。
  • RAM2_CE-通过接地将其连接到控制器的GPIO。

下表很好地描述了此节点的操作逻辑:

图片

如您所见,根据RAM2_CE线的状态,微控制器将与闪存或RAM2(DD3)微电路一起工作,并且它们的地址空间重合。值得注意的是,这些微电路的存储容量是相同的。也许这样做是为了简化设备固件的更新。还有另一个选择-已安装的RAM比闪存快3倍,因此启动控制器后,可以将FLASH的内容复制到RAM2,然后从中执行程序。

但是A15线上的高电平清楚地确定了控制器将与RAM芯片(DD2)一起使用。

结果,结果表明FLASH和RAM1存储器在控制器的地址空间中交替出现:

图片

已经遇到的RAM区域以红色突出显示-访问它时,控制器实际上将访问位于地址(0x8000-0xFFFF)的数据。
编译器配置并非易事,而且如上所述,一半的Flash / RAM2丢失了。不清楚为什么扫描仪的开发人员没有使用控制器的专用CSnX线在FLASH和RAM芯片之间切换。

正如我已经提到的,使用的控制器没有闪存,因此没有熔丝位。为了配置控制器的一些参数:数据总线宽度和地址,使用PLL参数连接到数据总线的下拉电阻。控制器本身具有连接到整个总线的内置高阻上拉电阻(> 100 KOhm)。因此,由于使用了外部电阻器,因此在总线上建立了一定的信号组合,控制器在打开时会读取该信号。它确定必要的控制器设置。

在这种情况下,我们谈论的是电阻器R3-R6。电阻器的选定配置与最终的总线信号连接一致,并提供33 MHz的控制器时钟速度。

来自镜像编码器的脉冲信号通过逻辑元件OR D6馈送到微控制器的定时器“ T2IN”的输入。该芯片的第二个输入连接到控制器的GPIO,使您可以禁用向定时器输入的脉冲供应。我仍然不明白为什么需要这种解决方案,以及为什么不可能以编程方式关闭计时器。

现在,您应该注意TDC芯片(DD1)。

扫描仪具有TDC-GPX芯片-ACAM范围内所有芯片中“最先进”的芯片。声称的测量时间间隔的精度高达10 ps RMS。该微电路具有LVTTL线的8个输入通道和LVECL(差分)的2个通道。
在此扫描仪中,为了获得最大的时间测量精度,正是LVECL输入用于使用四根同轴电缆从激光模块和光电检测器模块接收信号。来自激光模块的信号被馈送到DStart / DStartN的输入,并开始计时。来自光电探测器模块的信号被馈送到输入DStop1 / DStop1N,DStop2 / DStop2N,并停止时间计数。从该图可以看出,停止信号立即以相反极性施加到两个TDC通道。因此,不仅可以测量光脉冲的“飞行”持续时间,而且可以测量接收脉冲的宽度。

TDC-GPX具有28位数据总线,但是可以切换到16位模式,这是扫描仪中使用的模式。地址总线为4位,与存储芯片一样,它也移位了1位。芯片DD8,DD9,U2用于生成芯片的控制信号并匹配电平-微控制器从5V开始工作,TDC从3.3V开始工作。通常,TDC电源系统非常复杂,甚至可以自动调节电源电压。由于它的复杂性,我没有开始绘制它的图-我怀疑它与数据表没有太大不同。

稍后将讨论微控制器和TDC的编程。

正如我之前提到的,板上装有标有“ LEUZE98”和“ WATCHDOG”字样的定制ASIC芯片。什么是未知的。可以看出,一个20 MHz的晶体振荡器连接到该微电路。在对微控制器进行编程之后,我确保ASIC不会干扰其操作,并且没有恢复ASIC连接图。据我了解,该芯片通过并行总线与控制器通信。 ASIC可能会生成重置信号RESETn,从而重置控制器和TDC。

然而,有必要更详细地处理一些连锁店。

事实证明,激光控制信号“ LASER_PULSE”可以由微控制器和ASIC使用晶体管T1,T2上的节点生成。在这种情况下,ASIC导通时会打开晶体管T1,因此控制器无法控制激光器。因此,我必须卸下电阻器R24-激光器开始由控制器正常控制。

镜像马达控制信号line_motor1也来自ASIC(通过二极管D2)。因此,我不得不剪切板上的走线并将此信号直接连接到GPIO控制器的自由输出-P3.15。

最奇怪的是,连接到安装在光电检测器模块电路板上的DAC的CS2线也被连接到ASIC。因此,控制器无法独立设置APD电源电压,也无法打开APD放大器。也许这样做是为了提高扫描仪的可靠性-错误的DAC设置可能会导致APD故障。我还必须将这条线连接到P3.4控制器的空闲GPIO引脚。

众所周知,是ASIC控制着安装在激光模块上的三个LED。通过控制器控制另外两个显示扫描仪状态(工作区域中存在障碍物)的LED-线LN1,LN2。这些线也连接到接口模块板。

由于扫描仪可以在安全系统中工作,因此处理器板具有大量用于诊断其状况的节点。处理器(可能还有ASIC)可以检测到激光的存在(使用U3芯片),控制几个电源电压,APD电源电压,APD温度以及光电检测器板上比较器阈值的电平。

由于控制器ADC的参考电压为4.1V,因此在电阻分压器的帮助下,一部分测得的电压会降低-可以在右图中看到。

现在值得仔细研究一下产生异常 “ DIGI”信号的方法,我在光电检测器模块的描述中已经提到过。

下图显示了处理器模块(底部)和光电检测器模块(顶部)的节点:

图片

箭头表示使用电线的模块连接。据我所知,下面我将描述这些节点的操作。在光电探测器模块中,来自APD输出的信号被DA4芯片放大,然后将其传输到比较器D1。如果比较器输入端的信号电平大于50 mV,则在比较器的输出端设置高电平。来自比较器输出的信号被传输到处理器模块。首先,它进入TDC输入,该输入对从激光脉冲开始算起的时间进行计数。但是此外,该信号被馈送到D触发器DD1的时钟输入。逻辑单元始终提供给触发信号输入,并且可以使用BASE5控制器的GPIO线将触发本身重置为零。因此,比较器的操作导致快速触发“ 1”。该触发器具有差分输出,信号从该信号被馈送到D3芯片的输入,该信号将其转换为LVTTL格式。该信号被馈送到光电检测器模块的“数字”输入。如前所述,我认为该信号的出现会导致比较器输入端的信号电平变弱。

主要问题是为什么需要这样做,为什么执行起来如此困难?为什么不可能将两个节点都放在光电探测器模块的板上?

我只能表达我的假设。也许需要衰减信号,以避免比较器或幅度检测器过渡到饱和状态。也许-减少接收脉冲的长度。对于两个节点,在光电检测器板上根本就没有位置。另一个选择也是可能的-仅在有时间通过​​同轴线到达TDC之后才需要减弱信号,这证明了这种复杂的设计是合理的。
研究表明,在开始新的激光脉冲之前,有必要重置触发器,否则脉冲将不被接受。

接口模块
不幸的是,我没有找到该模块的照片。只有一个:

图片

在此模块上仅安装了两个连接器,您可以在扫描仪外部将其连接到该连接器。其中之一是RS-232 / RS-422,第二种是向扫描仪供电,提供控制信号,并在此处连接了安全电路。

该模块包含UART-RS232 / RS485转换器和电隔离光电耦合器(它们安装在右侧所示的单独的小板上),安全电路的电源键,测距仪控制线的输入电路,电机控制电路,编码器信号转换器。

电源模块和处理器模块以及编码器模块和后视镜电机已连接到该模块(使用模块底部的连接器,它们在照片中不可见)。

接口模块的局部示意图: 我只恢复了该模块的部分电路框图(大约20%),因为我对确保安全性所需的按键和输入线不感兴趣。那里有很多伤口,文档中提到了安全电路,短路监控和其他功能上的电流限制。

图片



怪异地控制了反射镜电机的旋转速度。通过改变电动机的电压来实现速度控制-这样,一切都变得清晰了。但是,该电压本身的调整是借助于运算放大器上的某个积分链来进行的。为了增加电压,控制器在line_mot1线上将其设置为0以将其降低-1。显然,在没有来自编码器的恒定反馈的情况下,电机会通过控制器停止或加速至最大速度。

事实证明,UART-RS232 LTC1387转换器芯片非常慢-速度为500 kbit / s,数据失真。因此,我必须卸下一块带有该芯片的小板,然后将USB-UART转换器直接连接到接口模块板上。

现在,我已经讨论了所有模块的设计,现在有必要详细介绍逆向工程本身的过程。

当我开始处理扫描仪电子设备时,我最担心激光或光电探测器会因撞击而损坏。同时,我不确定是否可以启动处理器模块-陌生的微控制器和ASIC会感到尴尬。因此,首先,我恢复了激光模块的电路,然后恢复了光电检测器模块的电路。在我了解了这些模块的电路并确定了其连接器上所有触点的用途之后,便可以继续使用处理器模块了。万不得已,如果我无法启动它,我有个主意可以在STM32 + TDC-GP2微电路上对该模块进行模拟。

显然,要检查模块,您需要在其上安装的Infineon SAK-C167CR微控制器上运行自己的程序。同样,值得记住的是,该控制器没有内置闪存。而且,事实证明,该控制器没有任何专门的调试接口(包括JTAG)。很有可能将固件写入工厂编程器中的外部闪存。但是,事实证明,一切还不错-控制器具有一个在UART上工作的引导加载程序(“ Bootstrap Loader”)。此引导程序存储在控制器的内置引导ROM中,因此它必须已在我的控制器中。而且它的功能非常独特-要在启动时激活它,您需要将数据总线P0L.4设置为低电平,之后,控制器开始等待主机的0x00字节出现。引导加载程序接受了该字节后,会自动确定传输速率,并开始等待将其复制到控制器内部RAM的32字节数据。接收到数据后,控制器开始执行接收到的程序(16个控制器字)。

实际上,在这32个字节中,您需要推送另一个加载器(“ preloader”),它将从主机接收主加载器“ External loader”,并开始执行。

在这里,我很幸运-对于该处理器,已经有一个现成的FLASHit程序,可以自动执行所有上述操作。内置的加载器具有很多功能-通过它,您可以自动确定已安装闪存的型号,编辑并查看控制器寄存器的内容,还可以查看ADC通道的状态。

我在与控制器的P0L.4线连接的板上找不到任何测试垫,因此为了启动自举程序,我必须在该线上焊接一个特殊的引脚。我将引脚固定在其中一个RAM芯片的外壳上。要启动自举程序,您需要将该引脚通过8kΩ电阻接地。

当我将开发板连接到计算机,并为处理器模块通电后,微控制器才真正出现在FLASHit中。之后,我在Keil中编写了一个小程序,该程序切换了一个控制器引脚,并将其写入Flash。该程序运行良好,ASIC没有干扰(我担心其中内置了某种看门狗机制,或者总线上发生了冲突),因此我可以继续前进。
之后,我恢复了处理器模块电路,这使我能够检查部件中所有模块的运行情况。

首先,我检查了激光模块的工作-如我先前所写,要启动激光脉冲,仅需要向该模块施加一个信号。激光工作正常-可以使用手机的摄像头看到其闪光。另外,我使用示波器检查了模块是否正常形成启动(参考)脉冲。

接下来是对光电探测器模块的检查。在这里,我必须检查DAC,雪崩光电二极管电压生成单元和光电检测放大器的功率控制单元的操作。他们都赚了,这可以检查测距仪本身的操作。为此,我以开发人员预期的形式组装了其模块:

图片

在照片中,所有五个主要模块都在光学系统周围组装在一起。在这里,我安装了一个普通的镜子,而不是自己的旋转镜。

之后,我提交了一个用于UART的激光控制程序,设置了光电二极管。结果,当我在比较器的输入端启动激光时,我真的能够用示波器检测到脉冲,其幅度明显取决于镜子前面的障碍物类型!比较器也工作正常。测试的最后一个重要部分仍然是TDC性能验证。

安装在扫描仪中的TDC-GPX芯片的设计相当复杂,可以在多种模式下工作。

下图显示了其结构图:

图片

如您所见,该芯片包含8个独立的通道,也就是说,它最多可以接收8个停止信号。如果通道是差分的,则只能分析两个停止信号和一个开始信号。在这种情况下,该芯片允许您组合测量通道,从而提高测量时间间隔的准确性:

图片

老实说,我不喜欢该芯片的文档。其中的许多内容都只是肤浅地描述,代码示例令人费解。数据表中专门用于调整时间分辨率的部分充满了某种“迁移数字”。芯片上也没有正常的“应用笔记”。此外,在扫描仪本身中,我无法检测到EF1 / EF1线与控制器的连接。从这些线路可以确定微电路已完成测量时间。由于所有这些,启动TDC花费了我很多时间,但结果一切都按预期进行-当启动激光时,TDC起作用了,TDC的结果显然取决于到障碍物的距离。因此,脉冲激光测距仪开始工作。仍然需要将整个结构变成可行的激光扫描仪。

我需要进行的第一步-组装好的测距仪在几米后停止“看到”障碍物。光学系统看上去完好无损,但我必​​须从光学系统中卸下板子,以使反射光不能被透镜准确地聚焦在光电探测器上。

对准之前,我为控制器编写了一个程序,该程序不仅确定距离,而且还测量了使用ADC由峰值检测器生成的信号的幅度。

整个调整过程被简化为光检测器和激光板的平滑移动,并减少了信号幅度最大的位置的搜索。调整的结果是,接收信号的幅度大大提高。

接下来,您应注意脉冲测距仪固有的某些数据处理功能。

光电探测器产生的信号具有模拟形式。为了将其转换为数字形式(由TDC进一步处理),使用了一个比较器,该比较器配置为在输入信号超过某个阈值时进行切换。结果,由于输入信号的复杂形状,在更改信号幅度时,在确定时间间隔时会发生错误:

图片

从图中可以看出,具有较低幅度的信号将被延迟检测。为了解决这个问题,有几种方法,包括硬件和软件。我决定使用最简单的选项-根据信号幅度校正测量结果。同时,我不得不收集有关信号幅度变化引起的时间测量结果变化的统计信息。为了在不改变信号其他参数的情况下改变信号的幅度,我在镜头上使用了纸垫,以减少入射到光电二极管上的光束。

结果就是这种依存关系:

图片

基于这种依存关系,我形成了一个校正表,控制器程序使用该表来确定到物体的距离。

下一步是启动镜像引擎和编码器。

之前,我已经引用了一张镜子的照片:

图片

镜子电机是无刷的,与冷却风扇中使用的非常相似。三根电线从中出来-其中两根是电源,另一根是脉冲速度信号。所有这些线都连接到接口模块,而没有使用电动机生成的速度信号-控制基于来自编码器的数据。
从照片中可以看到,带有编码器标签的透明磁盘固定在引擎的轴上。您可能会注意到磁盘上有一个零标记。

编码器安装在一个小板上,并完全用金属丝网覆盖,因此无法确定其标记。但是,根据其尺寸和引脚排列,我确定它是HEDS-9040正交编码器:

图片

从编码器板到接口模块有四根线,但事实证明,只有三根线被使用-两个电源和一个信号。

据我了解,施密特触发器和一些逻辑电路已安装在板上,结合了通道A,B和索引(零标记信号)中的数据。

这就是编码器板产生的信号和直接从编码器获取的索引信号的样子。

图片

可以看出,在索引信号期间,编码器脉冲被抑制。事实证明,编码器板每转产生500个脉冲,但是连接到编码器线的T2控制器的计时器可以在脉冲的两个边沿上同时运行,从而使反射镜每转产生1000次中断。此值对应于声明的扫描仪在0.36度的角分辨率。

我将T2计时器设置为“捕获模式”,这使我可以测量编码器中断之间的时间。所获得的时间用于检测反射镜的“零”位置,并稳定电动机的旋转速度。同时,对中断次数进行计数,这使您可以确定反射镜的位置。

编码器工作之后,我设法开始了发动机转速控制,就可以完全组装扫描仪了。由于电路板和光学元件的复杂形状,因此设计相当复杂: 组装这样的设计并不容易-单个零件的布置精度对于扫描仪非常重要。如果反射镜的轴与测距仪部件的光轴不一致,则可能导致扫描平面强烈弯曲或倾斜。

图片

图片



在测量到物体的精确距离时,重要的是要有某种“参考”物体,该物体的距离要精确知道。了解了它的“飞行时间”,您可以准确地确定与零距离相对应的时间。由于扫描仪组件温度的变化,该时间可能会发生变化,因此必须不断监控该时间。为解决此问题,我在扫描仪中安装了一块特殊的发黑板:

图片

该板被发黑,以使从其反射的光不会“遮蔽”光电探测器。根据说明判断,原始扫描仪设计中还安装了暗光反射元件。它们用于监视扫描仪测距仪部分的操作,并且很可能还用于校准。

在上面的照片中,板上的编码器也清晰可见。事实证明,编码器必须相对于磁盘非常精确地定位,并且存在很多问题-即使编码器的微小移动也会导致脉冲(尤其是索引脉冲)的丢失。由于编码器出现问题,扫描仪可能正好撞上身体后停止工作。

结果,可以获得高达每秒20转的扫描速度。在135 V的APD电压下,通常可以检测到10-15 m的距离;在145 V的电压下,通过附加信号过滤,可以测量30 m的距离(尽管我不确定这对于光电探测器是否安全)。

值得注意的是,原始扫描仪的最大传输速度为115200 bit / s,这使您只能以每秒约11转的速度传输所有数据。

如前所述,在固件中,我以500 kbit / s的速度传输数据,这可以显着增加每秒传输的扫描次数。由于UART速度限制,我没有将扫描速度提高到最初的25转/秒。我注意到,在扫描仪的原始设计中,数据是在扫描仪本身中处理的,因此低数据传输速度不会特别影响任何东西。

由于扫描仪现在可以在没有外壳的情况下工作,因此可以将扫描面积从原始设计的190度增加到208度。

可视化从扫描仪收到的数据:

图片

显然,扫描仪应该执行一些有用的功能,因此我决定在SLAM中的ROS中检查其运行情况,并将结果与自制激光扫描仪的结果进行比较。为此,我将其安装在Roomba上,该室先前已安装了家用扫描仪。

在Roomba上安装的Leuze扫描仪的视图(镜子旋转,使其 显得模糊):由于执行了hector_slam操作,我们设法获得了这样的公寓图(墙壁显示为黄色): 由于真空吸尘器在地板上移动,因此它主要“看到”了家具。 但是,如果您仅将真空吸尘器放在皮带的高度上,就可以得到这样的卡片: 在这种情况下,公寓的墙壁更“可见”。

图片



图片





图片



如果我们比较卡的质量,很明显,自制扫描仪的线路更加“嘈杂”。这是由于以下事实:对于使用三角测量操作原理的自制扫描仪,精度随着距离的增加而显着提高。

不幸的是,尽管扫描质量非常好,但该扫描仪并不适合自主机器人-它的尺寸和功耗过大(约7.2 W)。
我还能在哪里使用这种扫描仪?较早时,在讨论自制扫描仪时,经常有人问我制造3D扫描仪的可能性,现在该制造它了!较高的扫描速度在这里很有用。当然,按照分辨率,这种扫描仪无法与使用距离测量的三角测量原理的扫描仪(使用激光线或投影仪(SLS))相提并论,但是它们可以扫描较大的空间-房屋,街道。

为了在3D模式下重新制作2D扫描仪,您需要为其提供沿另一个轴旋转的功能。您的扫描仪,我决定做,使用扫描光束的原理相同的扫描仪这个文章。为此,我将Leuze扫描仪“躺在”,使其扫描平面垂直于地板。接下来,有必要实现整个扫描仪围绕轴的平稳缓慢旋转。主要困难-扫描仪必须旋转而没有跳动和变形,这会导致扫描变形。事实证明,在家中很难制造能够提供这种精确旋转的轴承组件。因此,我决定将磁带录音机的VHS磁头用作轴承单元-它包含两个轴承,具有非常高的精度,并且能够承受扫描仪的重量。最终的设计由步进电机驱动。

组装的3D扫描仪如下所示: 安装在三脚架上的扫描仪的视图:

图片



图片

左侧是一个12 V电池,它也是一个配重。由于Leuze扫描仪需要24 V的工作电压,因此我必须在扫描仪上安装基于XL6009芯片组装的升压型DC / DC转换器。扫描仪的步进电机由A4988和Arduino上的模块控制,该模块以给定速度提供旋转。 Leuze扫描仪(通过USB-UART适配器)和Arduino都通过USB集线器通过电线连接到捕获数据的计算机。在当前形式下,扫描仪镜的旋转与整个扫描仪的旋转不同步-选择扫描仪的旋转速度,以便当其旋转0.36度时,反射镜有时间至少旋转三圈。由于没有速度同步,因此我不得不将同步位置信息从Arduino传输到Leuze扫描仪。这实现起来非常简单-当Arduino每0.36度旋转扫描仪时,它会改变其中一个端子的信号电平。该信号传输到扫描仪处理器模块(传输到保护玻璃状态传感器未使用的连接器)。关于此信号状态的信息在每次扫描仪发送开始时都会发送-因此,用于控制扫描仪的PC的自写程序会接收到有关扫描仪运动的信息,并确定其旋转角度。接收有关扫描仪运动的信息,并确定扫描仪旋转的角度。接收有关扫描仪运动的信息,并确定扫描仪旋转的角度。

扫描仪生成的单个3D扫描包含大约350'000点。当然,这比专业扫描仪要少得多,但是仍然相当不错,特别是如果将多个扫描粘合在一起的话。

一个示例是对一个房间的一次扫描: 一个示例是对一个由多个粘合而成的房间的 扫描:入口扫描部分: 一段视频,显示了生成的扫描仪的结果:

图片



图片



图片





Github上控制器程序的源代码

Source: https://habr.com/ru/post/zh-CN396357/


All Articles