简介
这款激光测距传感器外壳采用黑金螺纹设计,探头带光学盖片,产品一体化,能有效过滤光学干扰,防水防震,其发射源为非可见激光,模块内部自带电压稳压电路,工作稳定,RS485输出,带一根报警输出线,当测量距离小于自定义阀值时,会触发低电平稳定输出。还具备3种测距模式,检测距离4-400cm,误差±2cm,满足不同用户的测距需求。
场景可应用于安检门检测、门禁系统、安防报警装置、智能垃圾桶、智能小车或机器人避障。
注:测量黑色物体时数据会不稳定。
技术规格
- 供电电压:5-36V
- 测量距离:4-400cm
- 测量精度:±2cm
- 发射角度:39.6°
- 接收角度:36.5°
- 工作电流:<38mA
- 通讯接口:RS485
- 通信协议:Modbus-RTU
- 防水等级:IP67
- 波特率:2400-921600可选 115200(默认)
- 频率:20Hz(默认)
- 工作温度:-20~70°C
- 尺寸:21.5x21x8mm
尺寸图
引脚示意图
标号 | 名称 | 功能描述 |
---|---|---|
红色 | VCC | 5-36V电源供电 |
绿色 | B | 485的B线 |
黄色 | A | 485的A线 |
黑色 | GND | 电源地 |
白色 | ALARM | 报警连接线 |
通讯协议
传感器采用工业标准Modbus协议,具体读写格式如下表:
Modbus通信,命令号分为两种读命令与写命令,0x03(读命令)读取相应寄存器数据,0x06(写命令)向相应寄存器写入数据。
主机发送帧(HEX)
从机地址 | 功能码 | 寄存器地址高位 | 寄存器地址低位 | 读取长度高位 | 读取长度低位 | CRC校验高位 | CRC校验低位 |
---|---|---|---|---|---|---|---|
0x50 | 0x03 | RegH | RegL | LenH | LenL | CRCH | CRCL |
模块地址为0x50(默认),读命令0x03,寄存器0x34(测量距离),长度一位。
指令:50 03 00 34 00 01 C8 45
从机应答帧(HEX)
从机地址 | 功能码 | 数据长度 | 数据位1 | 数据位2 | CRC校验高位 | CRC校验低位 |
---|---|---|---|---|---|---|
0x50 | 0x03 | LenH | DataH | DataL | CRCH | CRCL |
模块地址为0x50,读命令0x03,长度2位。
示例:读取测量距离
发送指令:50 03 00 34 00 01 c8 45
接受数据:50 03 02 07 0B 06 7F
数据解析:0x50为Modbus地址,0x03读命令,0x02数据长度,0x07 0x0B测量数据对应0x070B为十进制1803,测量距离为1803mm,0x06 0x7F为CRC校验位。
寄存器表
寄存器名称 | 寄存器地址 | 命令 | 说明 |
---|---|---|---|
系统恢复 | 0x00 | MODADDR 06 00 00 00 01 CRCH CRCL | 写入0x01,传感器恢复默认设置 |
报警阈值 | 0x02 | MODADDR 06 00 02 MH ML CRCH CRCL | MH报警阈值高位,ML报警阈值低位,阈值设置范围40~4000mm |
波特率设置 | 0x04 | MODADDR 06 00 04 00 00 CRCH CRCL | 写入0x00,波特率2400 |
MODADDR 06 00 04 00 01 CRCH CRCL | 写入0x01,波特率4800 | ||
MODADDR 06 00 04 00 02 CRCH CRCL | 写入0x02,波特率9600 | ||
MODADDR 06 00 04 00 03 CRCH CRCL | 写入0x03,波特率19200 | ||
MODADDR 06 00 04 00 04 CRCH CRCL | 写入0x04,波特率38400 | ||
MODADDR 06 00 04 00 05 CRCH CRCL | 写入0x05,波特率57600 | ||
MODADDR 06 00 04 00 06 CRCH CRCL | 写入0x06,波特率115200 | ||
MODADDR 06 00 04 00 07 CRCH CRCL | 写入0x07,波特率230400 | ||
MODADDR 06 00 04 00 08 CRCH CRCL | 写入0x08,波特率460800 | ||
MODADDR 06 00 04 00 09 CRCH CRCL | 写入0x09,波特率921600 | ||
定时预设时间(不建议修改 默认200MS) | 0x07 | MODADDR 06 00 07 TIMEBUDGETH | TIMEBUDGET: 20-1000毫秒可改0x0014-0x03e8 |
测量间隔(不建议修改 默认50MS ) | 0x08 | MODADDR 06 00 08 PERIODH PERIODL CRCH CRCL | PERIOD :1-1000毫秒可改 0x0001-0x03e8 |
ID设置 | 0x1A | MODADDR 06 00 1a 00 MODADDRL CRCH CRCL | 可写入0x00~0xFE |
测量数据 | 0x34 | MODADDR 03 00 34 00 01 CRCH CRCL | 读取,距离高8位于距离低8位 |
输出状态 | 0x35 | MODADDR 03 00 35 00 01 CRCH CRCL | 读取:0x07,传感器No Update |
读取:0x00,传感器Range Valid | |||
读取:0x01,传感器Sigma Fail | |||
读取:0x02,传感器Signal Fail | |||
读取:0x03,传感器Min Range Fail | |||
读取:0x04,传感器Phase Fail | |||
读取:0x05,传感器Hardware Fail | |||
测量模式 | 0x36 | MODADDR 06 00 36 00 01 CRCH CRCL | 写入0x01,短距离 (最多1.3m,更好的环境免疫力) |
MODADDR 06 00 36 00 02 CRCH CRCL | 写入0x02,中距离 (最多3米) | ||
MODADDR 06 00 36 00 03 CRCH CRCL | 写入0x03,长距离模式 (最多4米) | ||
校准模式 | 0x37 | MODADDR 06 00 37 00 04 CRCH CRCL | 写入0x04,进入校准状态 |
MODADDR 03 00 37 00 01 CRCH CRCL | 读取:0x01,开始校准 | ||
MODADDR 03 00 37 00 02 CRCH CRCL | 读取:0x02,校准失败 | ||
MODADDR 03 00 37 00 03 CRCH CRCL | 读取:0x03,校准完成 |
在树莓派上使用教程
准备
- 硬件
树莓派 x1
激光测距传感器 RS485(4m) x1
1、接线图
2、查看usb设备
在终端输入
sudo ls -l /dev
找到刚刚接入树莓派的usb设备(每次usb设备接入树莓派,设备端口都会变化,所以每次接入树莓派都需要查看实际的端口)
3、安装wiringpi库
cd /tmp
wget https://project-downloads.drogon.net/wiringpi-latest.deb //下载wiringpi库
sudo dpkg -i wiringpi-latest.deb //安装wiringpi库
4、编译并运行示例代码
在桌面新建一个文件夹,在文件夹中新建一个LaserRanging.c的文件,将代码复制进去并保存,然后使用终端打开程序所在的文件夹,编译并运行
gcc -Wall -lwiringPi -o LaserRanging LaserRanging.c
sudo ./LaserRanging
最后就能看到准确的测量距离值了
示例代码
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <wiringPi.h>
#include <wiringSerial.h>
int recData(unsigned char* buf);
unsigned int CRC16_2(unsigned char *buf, int len);
int fd;
unsigned char Data[8] = {0};
int main()
{
if ((fd = serialOpen("/dev/ttyUSB0", 115200)) < 0) { //可在此处根据实际情况更改usb设备端口
fprintf(stderr, "Unable to open serial device: %s\n", strerror(errno));
return 0;
}
while(1){
delay(100);
printf("%d mm\n",recData(Data));
}
return 1;
}
int recData(unsigned char* buf)
{
char ret = 0;
int jl=0;
long curr = millis();
char ch = 0;
unsigned char COM[8]={0x50, 0x03, 0x00, 0x34, 0x00, 0x01, 0xC8, 0x45};
write(fd, COM, 8);
while(!ret){
if (millis() - curr > 1000){
//write(fd, COM, 8);
curr = millis();
printf("OK\n");
}
if(serialDataAvail(fd) > 0){
delay(10);
if (read(fd, &ch, 1) == 1){
if(ch == 0x50){
buf[0] = ch;
if (read(fd, &ch, 1) == 1){
if(ch == 0x03){
buf[1] = ch;
if (read(fd, &ch, 1) == 1){
if(ch == 0x02){
buf[2] = ch;
if (read(fd, &buf[3], 4) == 4){
// for(int i=0; i<7; i++){
// if(buf[i] < 0x10){
// printf("0");
// }
// printf("%x ", buf[i]);
// }
// printf("\n");
// printf("%x\n", CRC16_2(buf, 5));
// printf("%x\n", buf[5]*256+buf[6]); //此段代码用于查看传感器测量距离的原始数据
if(CRC16_2(buf, 5) == (buf[5] * 256 + buf[6])){
jl = buf[3]*256+buf[4];
ret = 1;
}
}
}
}
}
}
}
}
}
}
return jl;
}
unsigned int CRC16_2(unsigned char *buf, int len)
{
unsigned int crc = 0xFFFF;
for (int pos = 0; pos < len; pos++)
{
crc ^= (unsigned int)buf[pos];
for (int i = 8; i != 0; i--)
{
if ((crc & 0x0001) != 0)
{
crc >>= 1;
crc ^= 0xA001;
}
else
{
crc >>= 1;
}
}
}
crc = ((crc & 0x00ff) << 8) | ((crc & 0xff00) >> 8);
return crc;
}
常见问题
还没有客户对此产品有任何问题,欢迎通过 qq 或者论坛联系我们!
更多问题及有趣的应用,可以访问论坛进行查阅或发帖