SEN0492 激光测距传感器RS485(4m)

简介

这款激光测距传感器外壳采用黑金螺纹设计,探头带光学盖片,产品一体化,能有效过滤光学干扰,防水防震,其发射源为非可见激光,模块内部自带电压稳压电路,工作稳定,RS485输出,带一根报警输出线,当测量距离小于自定义阀值时,会触发低电平稳定输出。还具备3种测距模式,检测距离4-400cm,误差±2cm,满足不同用户的测距需求。 场景可应用于安检门检测、门禁系统、安防报警装置、智能垃圾桶、智能小车或机器人避障。
注:测量黑色物体时数据会不稳定。

技术规格

尺寸图

引脚示意图

引脚示意图
标号 名称 功能描述
红色 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,校准完成

在树莓派上使用教程

准备

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 或者论坛联系我们! 更多问题及有趣的应用,可以访问论坛进行查阅或发帖

更多

DFRobot 商城购买链接