RS485 超声波测距传感器(5m)

简介

这是一款基于机器人自动控制应用而设计的超声波避障传感器,针对目前市场上对于超声波传感器盲区大、测量角度大、响应时间长、安装适配性差等问题而着重设计,测量范围可达5m,具备了盲区小、测量角度小、响应时间短、过滤同频干扰、体积小、安装适配性高、防尘防水、寿命长、可靠性高等一系列优点。

结合异体声波处理技术,能识别并过滤异体声波,输出数据更加稳定可靠,使得超声波传感器一定程度上降低了超声波同频干扰的概率,满足了用户对于机器人自动控制领域复杂环境的应用需求。

传感数RS4585输出,用户可搭配Arduino的TTL转RS485扩展板(DFR0259)使用,广泛应用于机器人避障、自动控制、停车管理系统、安检门检测、门禁系统、物体接近与存在检测等。

技术规格

  • 测距范围:3~500cm
  • 测距精度:1+(S*0.3%)cm
  • 工作电压:3.3~24V
  • 工作电流:≤10mA
  • 通讯方式:RS485
  • 输出响应时间:15-750ms
  • 上电延迟工作时间:≤1000ms
  • 检测角度:30~60°
  • 工作温度:-25°C~65°C
  • 工作湿度:65%~80%RH
  • 存储温度:-30°C~80°C
  • 存储湿度:65%~90%RH

引脚示意图

标号 名称 功能描述
红线 VCC 电源输入正极
黑线 GND 电源接地线
黄线 B RS485 B线
白线 A RS485 A线

尺寸图


安装开孔建议图

Modbus协议说明

1、默认通讯参数

数据位 停止位 奇偶校验 波特率
8 1 默认115200

2、Modbus协议参数

模式 校验 传感器地址 读功能码 写功能码
Modbus-RTU CRC-16/Modbus 可设置,默认0x01 0x03 0x06

3、Modbus协议格式

用户机为主机设备,该传感器为从机设备。

主机发送(读):

名称 设备地址 功能码0x03 寄存器地址 寄存器数量 CRC16校验
长度(Byte) 1 1 2 2 2

从机回应(读):

名称 设备地址 功能码0x03 返回字节数 数据区 CRC16校验
长度(Byte) 1 1 1 N 2

主机发送(写):

名称 设备地址 功能码0x03 寄存器地址 数据区 CRC16校验
长度(Byte) 1 1 2 2 2

从机回应(写):

名称 设备地址 功能码0x03 寄存器地址 数据区 CRC16校验
长度(Byte) 1 1 2 2 2

4、Modbus寄存器

寄存器数据为高字节在前,低字节在后。

  • Modbus寄存器表一
权限 地址 功能 数据类型 说明
只读 0x0100 处理值 无符号整型,16位 收到指令后启动测距,经算法处理后,输出距离值,单位:mm,响应时间约 300~750ms(量程不同而有差异)
只读 0x0101 实时值 无符号整型,16位 模组收到指令后启动测距一次,输出实时距离值,单位:mm,响应时间约 15~140ms(量程不同而有差异)
只读 0x0102 温度 无符号整型,16位 单位:0.1℃,分辨率:0.5℃,响应时间约 40~140ms(量程不同而有差异)
只读 0x010A 回波时间 无符号整型,16位 模组收到指令后启动测距一次,输出实时回波时间,单位:us,此值除以 5.75 即得到 mm 单位的距离值,响应时间约 40~140ms(量程不同而有差异)
  • Modbus寄存器表二
权限 地址 功能 数据类型 说明
读写 0x0200 从机地址 无符号整型,16位 范围:0x01~0xFE(默认 0x01),0xFF 为广播地址
读写 0x0201 波特率 无符号整型,16位 串口波特率(默认 115200),单位:bps,设置后立即生效,寄存器值对应的波特率如下:0x0002: 4800,0x0003: 9600,0x0004: 14400,0x0005: 19200,0x0006: 38400,0x0007: 57600,0x0008: 76800,0x0009: 115200
读写 0x0205 开关输出极性 无符号整型,16位 设置开关量输出极性,仅开关量模式有效;0x00:负输出,小于门限值输出低;0x01:正输出,小于门限值输出高(默认)
读写 0x0206 设置开关量门阀值 无符号整型,16位 设置开关量门限值,单位:mm,范围:30~5000mm,仅开关量模式有效
读写 0x0208 检测角度等级 无符号整型,16位 角度等级可设置为 1~4 级,(默认第 4级);等级越大,检测角度越大,感应越灵敏,反之越小。1-单角度约 40°,双角度水平角度约45°,垂直角度约 60°;2-单角度约 45°,双角度水平角度约50°,垂直角度约 65°;3-单角度约 55°,双角度水平角度约55°,垂直角度约 70°;4-单角度约 65°,双角度水平角度约65°,垂直角度约 80°;
读写 0x0209 输出距离值数据单位 无符号整型,16位 受控/自动输出协议距离值单位,0x00-mm,0x01-us(此值除以 5.75 即得到 mm 单位的距离值),仅对 UART 自动和 UART 受控模式有效
读写 0x021A 电源降噪等级 无符号整型,16位 电源降噪等级分为 1~5 级(默认为 1),以适用于不同电源供电的场景;等级越高,对噪声抑制越大,同时整体角度也会受影响,等级越高角度受影响情况更大。不同等级说明:1-适用于电池供电的场合;2-适用于 USB 供电等有一定高频噪音的场合;3-适用于较长距离 USB 供电的场合;4-适用于开关电源供电的场合;5-适用于开关电源供电、环境干扰复杂的场合,一般不推荐使用;
读写 0x021F 量程等级 无符号整型,16位 测距量程等级 1~5(默认为 5),量程范围:1-约 50cm,2-约 150cm,3-约 250cm,4-约 350cm,5-约 500cm
  • 波特率对单包通讯时长的影响
序号 波特率 通讯时长
1 4800 16ms
2 9600 8ms
3 14400 5.6ms
4 19200 4ms
5 38400 2.4ms
6 57600 1.6ms
7 76800 0.8ms
8 115200 0.6ms

注释:波特率越高单包通讯时间越短。

5、Modbus通讯举例

例1:读取处理值数据

主机:01 03 01 00 00 01 85 F6

从机:01 03 02 02 F2 38 A1

说明:传感器地址为0x01,处理距离值为0x02F2,转换成十进制为754mm。

例2:读取实时值数据

主机:01 03 01 01 00 01 D4 36

从机:01 03 02 02 EF F8 A8

说明:传感器地址为0x01,实时距离值为0x02EF,转换成十进制为751mm。

例3:读取温度值数据

主机:01 03 01 02 00 01 24 36

从机:01 03 02 01 2C B8 09

说明:传感器地址为0x01,实时温度值为0x012C,转换成十进制为30.0℃。

例4:修改从机地址

主机:01 06 02 00 00 05 48 71

从机:01 06 02 00 00 05 48 71

说明:传感器地址由0x01修改为0x05。

例5:读取波特率

主机:01 03 02 01 00 01 D4 72

从机:01 03 02 00 03 F8 45

说明:读取波特率,读取到的波特率是:9600bps

例6:设置波特率

主机:01 06 02 01 00 03 99 B3

从机:01 06 02 01 00 03 99 B3

说明:设置波特率为 9600bps

使用教程

准备

  • 硬件

Arduino UNO x1

TTL转RS485扩展板(DFR0259) x1

超声波测距传感器(5m) x1

  • 软件

Arduino IDE,点击下载 Arduino IDE

接线图

烧录代码前,请将扩展板的收发模式开关切换到AUTO,运行/编译开关切换到OFF,烧录代码后,运行/编译开关切换到ON,串口波特率选择115200

Arduino连接图

示例代码

uint8_t Com[8] = {0x01,0x03,0x01,0x01,0x00,0x01,0xd4,0x36};
void setup()
{
  Serial.begin(115200);    //初始化串口
}
void loop()
{
  int Distance =readDistance();
  Serial.print("Distance = ");
  Serial.print(Distance);
  Serial.println(" mm");
  delay(500);
}

int readDistance(void)
{
  uint8_t Data[10] = {0};
  uint8_t ch = 0;
  bool flag = 1;
  int Distance = 0;
  while (flag) {
    delay(100);
    Serial.write(Com, 8);
    delay(10);
    if (readN(&ch, 1) == 1) {
      if (ch == 0x01) {
        Data[0] = ch;
        if (readN(&ch, 1) == 1) {
          if (ch == 0x03) {
            Data[1] = ch;
            if (readN(&ch, 1) == 1) {
              if (ch == 0x02) {
                Data[2] = ch;
                if (readN(&Data[3], 4) == 4) {
                  if (CRC16_2(Data, 5) == (Data[5] * 256 + Data[6])) {
                    Distance = Data[3] * 256 + Data[4];
                    //Serial.println(Distance);
                    flag = 0;
                  }
                }
              }
            }
          }
        }
      }
    }
    Serial.flush();

  }
  return Distance;
}

uint8_t readN(uint8_t *buf, size_t len)
{
  size_t offset = 0, left = len;
  int16_t Tineout = 500;
  uint8_t  *buffer = buf;
  long curr = millis();
  while (left) {
    if (Serial.available()) {
      buffer[offset] = Serial.read();
      offset++;
      left--;
    }
    if (millis() - curr > Tineout) {
      break;
    }
  }
  return offset;
}

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;
}

串口查看传感器检测到的距离值

Arduino串口打印数据图

常见问题

还没有客户对此产品有任何问题,欢迎通过 qq 或者论坛联系我们!
更多问题及有趣的应用,可以访问论坛进行查阅或发帖

更多

DFRobot 商城购买链接