×

为Arduino制作便宜的激光测距仪

消耗积分:0 | 格式:zip | 大小:0.68 MB | 2022-10-24

分享资料个

描述

您的 Arduino 项目需要快速且廉价的激光测距仪模块吗?

当然,你可以使用专门的模块来完成这项任务,但它们中的大多数价格都很高。VL53L0X/VL53L1X 模块价格便宜,但视野非常大。

所以我找到了一个解决方案:使用便宜的“X-40”激光卷尺作为激光测距仪。这些设备的成本为 20 美元或更低,它们可以测量距离高达 40m,精度约为 3mm。但是有两个问题 - 无法从磁带上获取读数并且测量速度很慢 - 低于 1 Hz。

为了解决这个问题,我对该激光卷尺进行了逆向工程,并为激光测距仪模块的 STM32 MCU 编写了自己的固件。测量速度对我来说很重要,我可以达到 ~60 Hz,但最大稳定距离降低到 ~6 m(最大范围为 37 m,但我没有测试)。

距离测量精度可以从 1 毫米到 10 毫米不等,具体取决于目标颜色和距离。

模块尺寸:25x13x50 毫米。

重要通知:您将丢失原始固件,因此该设备以后不能用作激光卷尺!

请注意,“X-40”激光卷尺可以有不同版本的激光测距仪模块,我的固件只支持其中的一部分!

“X-40”并不是带有此类模块的激光卷尺的唯一名称 - 我知道存在几种不同的带有合适模块的中国激光卷尺。

第 1 步:拆卸激光卷尺

让我们拆开激光卷尺,从中得到一个激光测距仪模块。

 
pYYBAGNVkVCASqJmAARLivW98nI588.jpg
这就是激光卷尺在拆卸前的样子
 

您需要从外壳上拧下 7 个螺丝:

 
pYYBAGNVkVKAFxwBAAErdCVM93s305.jpg
请注意,贴纸下方是一颗螺丝
 

拆卸的激光卷尺:

 
poYBAGNVkVWAZNhCAAJoPBKs5NY055.jpg
激光测距仪模块标记为蓝色
 

您可以在设备外壳内看到小型激光测距仪模块。您需要从模块上断开带状电缆并从外壳中取出模块:

 
poYBAGNVkVqAL1ZtAAnU9P4A_aA373.jpg
激光测距模块
 

请注意,模块标记为“701A”。我的固件只支持“512A”和“701A”模块版本。一些用户确认“703A”模块也可以工作(我没有测试过)。

UPD 11/2019:
注意:发现较新的“x-40”激光卷尺带有“M88B”模块。在 MCU 附近的 PCB 上标记为“88B”。该模块基于 STM32F0 MCU(它具有 QFN-32 封装)。我的固件不支持这些模块!

UPD 10/2021:
注意:增加了对 U85 模块的支持见链接它们用于现代类型的激光卷尺。

pYYBAGNVkVyAFGw7AABg8KHW_lE559.jpg
 

如果支持您的模块,则需要从模块上拆下电源线。

第 2 步:对激光测距仪模块进行编程

您需要将专用固件写入模块的 MCU 以获得所需的功能。

1. 首先,您需要焊接一些用于对 MCU 进行编程的电线。引脚排列如图所示:

 
pYYBAGNVkV-AKnX2AAQBtCQTSPs258.jpg
电线连接
 

连接键盘连接器的针脚 7-8 - 需要通电。

线“GND”和“Vbat”必须连接到电源。电源电压范围为+2.7...+3.3V。为模块供电时,“Vdd”线必须有 +3.5 V。

“GND”、“SWDIO”、“SWCLK”、“NRST”线必须连接到 ST-LINK 编程器。“NRST”线很重要——MCU的原始固件被锁定,所以进入MCU进入编程模式需要这条线。

有些程序员有这条线,有些(便宜的)没有,但是有一个解决这个问题的方法。

另外,有些编程器(如原来的“ ST-LINK/V2 ”)需要“Vbat”线与编程器的“VCC/TVCC”线相连。

连接示例(此程序员没有“NRST”行):

 
poYBAGNVkWOAWPI9AANfvVVPPv8081.jpg
ST-Link 连接到激光测距仪模块
 

2. 将“ST-LINK 实用程序”安装到 PC。如果您没有使用该软件的经验,网上有很多教程。

您需要配置实用程序(目标 -> 设置):

 
poYBAGNVkWWAVm7zAABv17e7HbE904.png
设置标记值
 

如果您的编程器有“NRST”输出,您只需打开电源并在实用程序中按“Target -> Connect”即可。

如果它没有这样的行,您需要执行以下步骤:

  • 打开电源。
  • 将模块的“NRST”线连接到 GND。
  • 在实用程序中按“目标 -> 连接”。
  • 快速断开“NRST”线与 GND 的连接。
  • 实用程序必须显示连接

Yon 必须得到这样的图片:

 
pYYBAGNVkWeADHnIAADfoA5GDdw905.png
正常连接
 

3. MCU flash 被锁定读取,所以需要关闭“Read Out Protection”。在这一步您将丢失原始固件!

打开目标->“选项字节”菜单。必须有这样的设置:

 
pYYBAGNVkWqAS1S-AAEPjWfrJYY759.png
选项字节菜单
 

将“读出保护”切换为“禁用”,然后按“取消全选”按钮,然后按“应用”按钮。尝试重新启动模块(通过断开电源)。

按目标 -> 连接。日志窗口中必须有关于成功连接的信息,并且您必须看到内存内容 - 用 0xFF 填充。现在您可以将自定义固件加载到 MCU。

4.需要的固件放在这里:https ://github.com/iliasam/Laser_tape_reverse_engineering/tree/master/Code/Firmware_dist_calculation_fast

为您的模块选择合适的 HEX 文件并使用“ST-LINK 实用程序”将其下载到 MCU Flash。

第 3 步:将激光测距仪模块连接到 Arduino

您需要将电线或一些连接器焊接到板上的 TX 焊盘:

 
poYBAGNVkWyAK2omAAE9LHuJ-Go877.jpg
701A 模块引出线
 

请参见下面的连接示意图。

首先,您需要检查测距仪模块是否正常工作。在这一步您不需要将OLED显示器连接到Arduino - 只需将激光测距仪模块的TX线连接到Arduino的TX线,并将模块的电源线连接到+ 3V电源。

创建空草图并将其加载到 Arduino。在 Arduino IDE 中打开“串行监视器”。选择波特率:250000

如果测距仪模块工作正常,您将获得相同的数据:

DIST;01937;AMP;0342;TEMP;1223;VOLT;115 DIST;01937;AMP;0343;TEMP;1223;VOLT;115 DIST;01938;AMP;0343;TEMP;1223;VOLT;115 DIST;01938;AMP ;0343;温度;1223;伏特;115

事实上,这个测试最好使用专门的 USB-UART 转换器。在其实用程序中选择 256000 波特率(它是 x-40 MCU 的真实波特率)。

其次,您需要将完整的原理图与显示器组装在一起。

将激光测距仪模块的 TX 线连接到 Arduino 的 RX 线(在将程序加载到 Arduino 时需要断开该线)。

如果一切正常,您将得到相同的结果:

 
pYYBAGNVkW-AZD42AAJHK_uSlRs881.jpg
组装面包板

您可以看到显示 3 个数字:

  • "COUNT" - 接收值的计数器
  • “AMPL” - 信号的幅度。下面的符号条(“<--->”)以图形方式显示幅度(以对数刻度)。
  • 最大值 - 以米和毫米为单位的距离。

第 4 步:调零

首次启动后,需要校准激光测距仪模块。

您需要在距离模块一定距离处放置一些白色物体。对于测距仪模块,到该物体的距离将变为零距离。要开始校准过程,您需要从激光卷尺连接键盘并按最低按钮。模块将发出两次哔声 - 在校准开始和结束时(校准持续时间接近 10 秒)。

 
poYBAGNVkXKAfW7cAAHeXcqqXU8135.jpg
校准过程
 

现在您可以使用此激光测距仪模块。

链接:

1. Github——逆向工程结果和源码。

2. Habr.com - 谷歌翻译的关于激光卷尺逆向工程过程的文章。

对不起我的英语 - 我来自非英语国家。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !