资讯详情

905nm激光测距模块串口协议解析与 Arduino / 树莓派 / ROS2 接入实战

📅 2026/10/13 10:29:22 | 华诺云谱 👁 阅读
905nm激光测距模块串口协议解析与 Arduino / 树莓派 / ROS2 接入实战
披露我是这类模块的厂商ERDILRF成都一方的工程人员。文中的帧格式、波特率、单位都转录自厂商手册驱动是 MIT 协议开源的。我没有在这里贴任何实测精度或性能数据文末会说清楚哪些没验证过。第一次接激光测距模块最常见的两种翻车串口一片安静或者读出来的数差了 10 倍。两种我们都见过原因几乎都在协议细节上不在接线。下面按先认协议家族再接线再写代码的顺序走一遍。1. 先认家族我们这条 905nm 产品线有两套串口协议A 族8 字节55 AA命令/应答。LR1000E2/E4、LR1200E2/E4、LR1500E2/E4、LR2000E2/E4、LRF1200A1、LRF3000A1、SPD1200N0/N2/N4、SPD1200D03。默认 115200 bps。B 族5C开头的连续输出。LRF50H/100H/200H/300H/600H/1500H、LRF22VB、LRF50VB。默认 460800 bps可调8 位数据、1 位停止、无校验小端。选型号之前先别写代码先看你手上是哪一族因为两族的单位根本不是一回事。2. 帧格式A 族byte 0 1 2 3 4 5 6 7 55 AA 功能码 D1 D2 D3 D4 校验单次测距发送55 AA 88 FF FF FF FF 84应答55 AA 88 STA FF DIS_H DIS_L SUMSTA 1表示测量成功其他值表示失败。距离是DIS_H8 | DIS_L大端手册写明输出为实际值 × 10所以原始计数 1 个数 0.1 m。连续测距0x89、停止0x8E。这里最容易踩的坑发送和应答的校验范围不一样。发送功能码 D1~D4 求和取低 8 位应答0x55 0xAA 功能码 D1~D4 求和取低 8 位两者正好差0x550xAA 0xFF。如果拿发送公式去验应答几乎每帧都差 1看起来像偶尔能对上。手册自己也提醒了收发校验内容可能不同。举个手算例子构造帧不是从硬件抓的55 AA 88 01 FF 04 D2 5D。求和 0x550xAA0x880x010xFF0x040xD2 0x35D低 8 位 0x5D距离 0x04D2 1234除以 10 得 123.4 m。B 族byte 0 1 2 3 5C dist_lo dist_hi 校验例5C 02 11 EC。校验是从第 2 字节到倒数第 2 字节求和再按位取反~(0x020x11) ~0x13 0xEC。单位按型号不按家族型号原始计数单位同一帧5C 02 11 EC的含义LRF50H/100H/200H/300H/600H/1500H厘米43.54 mLRF22VB、LRF50VB毫米4.354 m同样 4 个字节差 10 倍。所以别让程序自动判断家族然后选单位老老实实按型号查表。LRF1500H 是目录里唯一的 5 字节帧距离占 3 字节手册里它的示例帧校验和自己的公式对不上我们在驱动里把这个差异保留并标注了没有悄悄改掉。3. 接线先说一句最重要的供电电压和串口信号电平是两个独立的指标。手册给出供电范围不等于给出了 TX/RX 的逻辑电平别自己从供电推断。以 LRF3000A1 为例手册 6 针接口A1002WV-S-6P针定义说明1GND地2电源3.3V–5V DC3NC预留4TTL_TXD模块发送TTL 3.3V 电平5TTL_RXD模块接收TTL 3.3V 电平6Enable低电平开机对板子模块 TX → 主控 RX模块 RX → 主控 TXGND 共地。Enable 脚按手册是低电平使能别悬空乱接具体到你收到的那一台以随货资料为准。另外两点别混LRF50H 的供电是 9–36 VLRF22VB 是 3.0–3.6 V有些型号手册里没单独写信号电平这种情况先向厂商要书面确认再接。所有型号一律不要拿别的型号的电气参数顶替。4. Arduino官方库名ErdiLRF已进 Arduino Library Manager也可用 PlatformIOerdi-tech/ErdiLRF。#includeErdiLRF.hErdiLRFlrf(Serial1,ERDI_LRF3000A1);voidsetup(){Serial.begin(115200);Serial1.begin(erdiDefaultBaud(ERDI_LRF3000A1));// A 族 115200B 族 460800}voidloop(){ErdiMeasurement m;if(lrf.measure(m)ERDI_OK)Serial.println(m.metres,3);delay(500);}波特率和换算由型号表决定。注意Uno 的 SoftwareSerial 跑不到 460800B 族要用硬件串口Mega、ESP32 等或者先用命令把模块波特率改到手册支持的低速率。5. 树莓派Pythonpipinstallhttps://github.com/yu911517778-a11y/erdi-lrf-drivers/releases/download/v0.1.0/erdi_lrf-0.1.0-py3-none-any.whl erdi-lrf--port/dev/ttyUSB0--modelLRF3000A1 measurefromerdi_lrfimportErdiLRFwithErdiLRF(/dev/ttyUSB0,modelLRF3000A1)aslrf:print(f{lrf.measure().metres:.1f}m)withErdiLRF(/dev/ttyUSB0,modelLRF100H)aslrf:forminlrf.stream():# B 族自己连续输出print(m.metres,(超量程)ifm.out_of_rangeelse)用 USB-TTL 适配器最省事直接接树莓派 GPIO 串口也行3.3V 电平同样 TX/RX 交叉。编解码函数是不依赖串口的纯函数可以直接拿去做单元测试。6. ROS2cp-rros2/erdi_lrf_ros2 ~/ros2_ws/src/cd~/ros2_wscolcon build --packages-select erdi_lrf_ros2sourceinstall/setup.bash ros2 run erdi_lrf_ros2 range_node --ros-args-pport:/dev/ttyUSB0-pmodel:LRF3000A1-prate:10.0-pframe_id:lrf_link节点发布sensor_msgs/Rangemin_range/max_range取自型号手册的量程行field_of_view默认 0手册协议部分没有束散角需要的话按你型号的数据手册自己设。7. 手册自己打架的地方我们没替你选SPD1200D03协议章节写 115200技术表写 15200/9600手册自己要求先确认交付配置。驱动要求你显式给波特率也不输出米制距离。LRF1200A1 / LRF3000A1连续测距请求用 0x89、记录的应答却是 0x88手册明说不授权连续应答解析。单次测距不受影响连续模式要手动确认后才能开。LRF50VB 的串口读取示例校验与手册自己的公式对不上。遇到这类地方写进工单问厂商比猜一个值要省时间。还没验证的部分文中没有实测数据没有精度、响应时间之类的结论需要的数值请看你那个型号的手册。ROS2 节点目前是软件回放层面的测试没有宣称在真实 ROS2 运行时和硬件上验证过。所有驱动代码和 pytest 用例都是按手册里印出来的帧写的。资料开源驱动MIThttps://github.com/yu911517778-a11y/erdi-lrf-driversArduino 库https://github.com/yu911517778-a11y/ErdiLRF技术笔记DOIhttps://doi.org/10.5281/zenodo.23297197型号目录与资料https://erdilrf.com/models/厂商披露本文作者属 ERDI TECH LTDERDILRF。样品、数据手册和协议问题可通过 https://erdilrf.com 或 tommyerdimail.com 联系。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑