URM08-RS485防水超声波传感器

概 述

DFRobot最新研发URM08系列防水超声波传感器是一个专为专业级工控领域和机器人控制领域设计的超声波测距模块。兼具温度测量和距离检测两大主要功能,具有内部温度补偿,可准确检测传感器与目标物之间的距离。传感器内部完全密封,采用金属材质外壳,具有IP67级防水、防尘、耐腐蚀等优点,可应于各种液位、物位检测及各种避障应用。即使短时间内浸泡水中,晾干后可依旧工作。传感器采用高标准器件选型,保证了较短的检测盲区及较大的距离检测范围,在输出数据稳定可靠的前提下更具有超越众多市场同类产品的检测性能。 URM08-RS485型号为RS485通信接口,兼容modbus通信协议,支持级联控制,适用于工控领域,水位检测,机器人避障等应用。

技术参数

SEN0246_波束角示意图_1.jpg

接口说明

SEN0246-尺寸图-11.png
模块接口线序如下:

  1. 红------VCC(电源)
  2. 黑------GND(电源地)
  3. 绿------RS485-A
  4. 黄------RS485-B

通信说明

出厂参数:

通信命令帧格式为:

帧头 地址 数据长度 命令 数据 校验和
0x55 0xAA 1字节 1字节 1字节 数据1~数据n 1字节

命令一览表:

读取距离 读取温度 设置地址 设置波特率
0x02 0x03 0x55 0x08

读取测量测距

注意: 以下测试命令需要用到USB转RS485模块

主机通过RS485接口向超声波模块发送一帧命令,触发模块开始测距,之后接收模块返回的距离值命令。
测距命令串口演示
例如超声波模块地址为 0x11,则主机发送: 0x55 0xAA 0x11 0x00 0x02 0x12 //读取测量距离 [ 55 AA 11 00 02 12 ]

`说明:`
`帧头---------0x55`
`帧头---------0xAA`
`设备地址-----0x11`
`数据长度-----0x00`
`命令---------0x02`
`校验和-------0x12(校验和为前几个字节数据相加后去掉高位得到的值)`

超声波模块返回数据为: 0x55 0xAA 0x11 0x02 0x02 0x00 0xCA 0xDE

`说明:`
`帧头---------0x55`
`帧头---------0xAA`
`本机地址-----0x11`
`数据长度-----0x02`
`命令---------0x02`
`距离高位-----0x00`
`距离低位-----0xCA(距离值为 0x00CA 单位为厘米,即十进制202厘米)`
`校验和-------0xDE(校验和为前几个字节数据相加后去掉高位得到的值)`

读取温度

主机通过RS485接口读取超声波模块测得的当前温度。
测温命令串口演示
例如超声波模块地址为 0x11,则主机发送: 0x55 0xAA 0x11 0x00 0x03 0x13 //读取传感器当前温度 [ 55 AA 11 00 03 13 ]

`说明:`
`帧头---------0x55`
`帧头---------0xAA`
`设备地址-----0x11`
`数据长度-----0x00`
`命令---------0x03`
`校验和-------0x13`

超声波模块返回数据为: 0x55 0xAA 0x11 0x02 0x03 0x01 0x13 0x29

`说明:`
`帧头---------0x55`
`帧头---------0xAA`
`本机地址-----0x11`
`数据长度-----0x02`
`命令---------0x03`
`温度高位-----0x01`
`温度低位-----0x13(温度值为 0x0113 ,表示27.5摄氏度。注意:此温度值是放大10倍后的值,为有符号整数)`
`校验和-------0x29(校验和为前几个字节数据相加后去掉高位得到的值)`

设置超声波模块地址

主机通过RS485接口设置超声波模块地址。
修改地址命令串口演示
例如设置超声波模块地址为 0x12,则主机发送: 0x55 0xAA 0xAB 0x01 0x55 0x12 0x12 //设置超声波地址0x12 [ 55 AA AB 01 55 12 12 ]

`说明:`
`帧头---------0x55`
`帧头---------0xAA`
`设备地址-----0xAB(0xAB为广播地址,即所有模块的公共地址,在不确定模块地址的状态下,可以以0xAB代替设备本身的地址)`
`数据长度-----0x01`
`命令---------0x55`
`设置地址-----0x12(需要设置的设备地址为0x12)`
`校验和-------0x12`

设置成功则超声波模块返回命令为: 0x55 0xAA 0x12 0x01 0x55 0xCC 0x33

`说明:`
`帧头---------0x55`
`帧头---------0xAA`
`设备地址-----0x12(修改后的设备地址)`
`数据长度-----0x01`
`命令---------0x55`
`操作状态-----0xCC(0xCC——操作完成 0xEE——操作失败)`
`校验和-------0x33(校验和为前几个字节数据相加后去掉高位得到的值)`

设置RS485通信波特率

主机通过RS485接口设置超声波模块通信波特率。
修改波特率命令串口演示
例如设置超声波模块地址为 0x11,则主机发送: 0x55 0xAA 0x11 0x01 0x08 0x0B 0x24 //设置模块波特率为256000bps [ 55 AA 11 01 08 0B 24 ]

`说明:`
`帧头---------0x55`
`帧头---------0xAA`
`设备地址-----0x11`
`数据长度-----0x01`
`命令---------0x08`
`波特率选择---0x0B`
`校验和-------0x24(校验和为前几个字节数据相加后去掉高位得到的值)`

若设置成功,则超声波模块返回命令为: 0x55 0xAA 0x11 0x01 0x08 0xCC 0xE5

`说明:`
`帧头---------0x55`
`帧头---------0xAA`
`设备地址-----0x11`
`数据长度-----0x01`
`命令---------0x08`
`操作状态-----0xCC(0xCC——操作完成 0xEE——操作失败)`
`校验和-------0xE5(校验和为前几个字节数据相加后去掉高位得到的值)`

波特率选择一览表:

1200bps 2400bps 4800bps 9600bps 14400bps 19200bps 28800bps 38400bps 57600bps 115200bps 128000bps 256000bps
0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B
`例如设备地址为默认0x11时,波特率设置命令如下:`
`55 AA 11 01 08 00 19 //设置模块波特率为1200bps`
`55 AA 11 01 08 01 1A //设置模块波特率为2400bps`
`55 AA 11 01 08 02 1B //设置模块波特率为4800bps`
`55 AA 11 01 08 03 1C //设置模块波特率为9600bps`
`55 AA 11 01 08 04 1D //设置模块波特率为14400bps`
`55 AA 11 01 08 05 1E //设置模块波特率为19200bps`
`55 AA 11 01 08 06 1F //设置模块波特率为28800bps`
`55 AA 11 01 08 07 20 //设置模块波特率为38400bps`
`55 AA 11 01 08 08 21 //设置模块波特率为57600bps`
`55 AA 11 01 08 09 22 //设置模块波特率为115200bps`
`55 AA 11 01 08 0A 23 //设置模块波特率为128000bps`
`55 AA 11 01 08 0B 24 //设置模块波特率为256000bps`

单个URM08-RS485测量示例

接线示意图

说明: 由于需要将 Leonardo的UART通信转换为RS485通信,这里我们用到了TTL转RS485扩展板。

距离测量示例

测距示例

/**************************************************************************************************************
     This code tests the range finder function of the URM08-RS485 Waterproof Sonar Range Finder
     @ author : roker.wang@dfrobot.com
     @ data   : 11.09.2017
     @ version: 1.0
     RX(TTL-RS485转接板) -> TX1/D1 (Arduino Leonardo)  TX(TTL-RS485转接板)-> RX1/D0 (Arduino Leonardo)
    **************************************************************************************************************/
#define header_H    0x55 //帧头
#define header_L    0xAA //帧头
#define device_Addr 0x11 //模块地址
#define data_Length 0x00 //数据长度
#define get_Dis_CMD 0x02 //距离测量命令
#define checksum    (header_H+header_L+device_Addr+data_Length+get_Dis_CMD) //校验和

//#define  CE          2
#define  TX_EN()     digitalWrite(CE,HIGH)
#define  RX_EN()     digitalWrite(CE,LOW)
unsigned char i = 0;
unsigned int  Distance = 0;
unsigned char Rx_DATA[8];
unsigned char CMD[6] = {header_H, header_L, device_Addr, data_Length, get_Dis_CMD, checksum}; //距离测量命令�

void setup() {
  Serial1.begin(19200);  //使用Serial1与模块通信,波特率为19200
  Serial.begin(19200);   //使用Serial作为数据输出的串口
  //pinMode(CE,OUTPUT);
}


void loop() {
  //TX_EN() ;
  for (i = 0; i < 6; i++) {
    Serial1.write(CMD[i]);
  }
  // RX_EN() ;
  delay(150);  //等待测距结束
  i = 0;
  while (Serial1.available()) { //读取返回数据包(注意:Demo仅供参考,数据包并未做任何校验)
    Rx_DATA[i++] = (Serial1.read());
  }
  Distance = ((Rx_DATA[5] << 8) | Rx_DATA[6]); //取出距离数据
  Serial.print(Distance);               //打印距离
  Serial.println("cm");
}

温度测量示例

测温示例

/**************************************************************************************************************
     This code tests the temperature measurement function of the URM08-RS485 Waterproof Sonar Range Finder
     @ author : roker.wang@dfrobot.com
     @ data   : 11.09.2017
     @ version: 1.0
     RX(TTL-RS485转接板) -> TX1/D1 (Arduino Leonardo)  TX(TTL-RS485转接板)-> RX1/D0 (Arduino Leonardo)
    **************************************************************************************************************/

#define header_H     0x55 //帧头
#define header_L     0xAA //帧头
#define device_Addr  0x11 //模块地址
#define data_Length  0x00 //数据长度
#define get_Temp_CMD 0x03 //温度测量命令
#define checksum     (header_H+header_L+device_Addr+data_Length+get_Temp_CMD) //校验和

unsigned char i = 0;
int  temperature = 0;
unsigned char Rx_DATA[8];
unsigned char CMD[6] = {header_H, header_L, device_Addr, data_Length, get_Temp_CMD, checksum}; //读取温度命令�

void setup() {
  Serial1.begin(19200);  //使用Serial1与模块通信,波特率为19200
  Serial.begin(19200);   //使用Serial作为数据输出的串口
}

void loop() {
  for (i = 0; i < 6; i++) {
    Serial1.write(CMD[i]);
  }
  delay(50);  //等待数据返回
  i = 0;
  while (Serial1.available()) { //读取返回数据包(注意:Demo仅供参考,数据包并未做任何校验)
    Rx_DATA[i++] = (Serial1.read());
  }
  temperature = ((Rx_DATA[5] << 8) | Rx_DATA[6]); //取出温度数据(这是10倍温度值)
  Serial.print(temperature / 10);           //打印温度
  Serial.print('.');
  Serial.print(temperature % 10);
  Serial.println("C");
}

多个URM08-RS485连接测量示例

级联示意图

说明: 将多个模块连接到串口总线上使用前,需要先对每个URM08超声波模块设置不同的地址(示例使用四个URM08探头,地址分别设置为0x11、0x22、0x33、0x44)

级联测距示例

/**************************************************************************************************************
     This code tests the range finder function of multiple URM08-RS485 Waterproof Sonar Range Finder
     @ author : roker.wang@dfrobot.com
     @ data   : 11.09.2017
     @ version: 1.0
     RX(TTL-RS485转接板) -> TX1/D1 (Arduino Leonardo)  TX(TTL-RS485转接板)-> RX1/D0 (Arduino Leonardo)
    **************************************************************************************************************/

unsigned char i = 0, j = 0;
unsigned int  Distance = 0;
unsigned char Rx_DATA[8];
unsigned char CMD[4][6] = {
  {0x55, 0xAA, 0x11, 0x00, 0x02, 0x12},
  {0x55, 0xAA, 0x22, 0x00, 0x02, 0x23},
  {0x55, 0xAA, 0x33, 0x00, 0x02, 0x34},
  {0x55, 0xAA, 0x44, 0x00, 0x02, 0x45},
}; //距离测量命令�

void setup() {
  Serial1.begin(19200);  //使用Serial1与模块通信,波特率为19200
  Serial.begin(19200);   //使用Serial作为数据输出的串口
}

void loop() {
  for (j = 0; j < 4; j++)
  {
    for (i = 0; i < 6; i++) {
      Serial1.write(CMD[j][i]);
    }
    delay(150);  //等待测距结束
    i = 0;
    while (Serial1.available()) { //读取返回数据包(注意:Demo仅供参考,数据包并未做任何校验)
      Rx_DATA[i++] = (Serial1.read());
    }
    Distance = ((Rx_DATA[5] << 8) | Rx_DATA[6]); //取出距离数据
    Serial.print("URM08-RS485[");   //打印距离
    Serial.print(j);
    Serial.print("]get_Dis= ");
    Serial.print(Distance);
    Serial.println("cm");
    Rx_DATA[5] = 0;
    Rx_DATA[6] = 0;
  }
  Serial.print("\r\n\r\n");    //打印换行分割

  delay(300);  //等待测距结束
}

探测角度及灵敏度说明

超声波传感器的物理特性决定了其实际具有不规则的探测区域,因此超声波测距传感器的探测角度难以被准确的定义。在实际使用过程中我们测试发现此该传感器模块的探测区域及灵敏度可能相对于其它超声波传感器要更大,因此在狭窄空间内使用该款传感器可能会出现非理想目标物被检测的情况出现。

我们分别使用了2种参考目标障碍物对多样本产品进行了反复测试,对应目标的参照检测区域如下图示:

直径7.5cm的PVC管检测测试

光滑的平面挡板检测测试

常见问题

如有疑问,欢迎通过qq或者论坛联系我们!

更多问题及有趣的应用,可以 访问论坛 进行查阅或发帖。

更多