本网页已闲置超过3分钟,按键盘任意键或点击空白处,即可回到网页

基于 STM32 的激光测距仪

发布时间:2021-11-11
分享到:

基于 STM32 的激光测距仪

发布时间:2021-11-11
分享到:

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

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

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

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

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

模块尺寸:25x13x50 毫米。

重要提示:您将丢失原始固件,因此该设备以后不能用作激光磁带测量!

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

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

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

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

拆开的激光卷尺:

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

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

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

第 2 步:编程激光测距仪模块
您需要为模块的 MCU 编写专门的固件以获得所需的功能。

1.首先你需要焊接一些电线来编程MCU。引脚排列如图所示:

连接键盘连接器的 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”线):

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

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

如果您的编程器有“NRST”输出,您只需打开电源并在实用程序上按“目标 -> 连接”即可。

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

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

必须得到这样的图片:

3. MCU flash 被锁定读取,因此您需要禁用“Read Out Protection”。在这一步您将丢失原始固件!

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

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

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

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

第 3 步:将激光测距仪模块连接到 Arduino
您需要将电线或某个连接器焊接到板上的 TX 焊盘:

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

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

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

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

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

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

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

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

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

第 4 步:调零
第一次启动后,需要校准激光测距仪模块。

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

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

本方案所用到的一些代码

如果您对此项目有任何想法、意见或问题,请在下方留言。

加入微信技术交流群

技术交流,职业进阶

关注与非网服务号

获取电子工程师福利

加入电路城 QQ 交流群

与技术大牛交朋友

讨论