(SKU:SEN0310)URM12 ultrasonic sensor(1500cm&RS485)

来自DFRobot Product Wiki
跳转至: 导航搜索
文件:URM08超声波传感器.jpg
URM08-RS485防水超声波传感器

目录

概 述

这是一款针对大量程测距及避障应用设计的超声波传感器,具有长达15米的检测量程,探测角度15°,内置温度补偿,RS485通信接口,适用于液位物位检测或机器人避障等应用。

技术参数

  • 工作电压:DC 9-24V
  • 额定功率:4.8W
  • 有效量程:70 ~ 1500cm
  • 距离分辨率:1cm
  • 距离误差:±1%
  • 温度分辨率:0.1℃
  • 温度误差:±1℃
  • 测量频率:3HZ
  • 工作温度:-10℃~+70℃
  • 工作湿度范围:RH<75%
  • 传感器声学频率:38~42KHz
  • 传感器方向角:15°±2°(-6dB)
  • 防护等级:IP65
  • 通信接口:RS485


接口说明

接口及尺寸示意图

模块接口线序如下:

1、黑色粗线-----屏蔽线

2、黑色细线-----GND

3、白 ------VCC

4、橙 ------RS485-A

5、棕 ------RS485-B




寄存器说明

寄存器一览表
寄存器地址 名称 读写 数据范围 默认值 描述
0x00 模块PID R 0x0000-0xFFFF 0x0001 用于产品校验
0x01 模块ID R 0x0000-0xFFFF 0x0010 用于版本校验[0x0010表示V0.0.1.0]
0x02 模块地址 R/W 0x0001-0x00F7 0x000B 更改传感器地址,需重新上电才会生效 [传感器地址未知时,可通过广播地址0x00做写入寄存器操作,此时传感器不会有数据输出]
0x03 串口参数控制寄存器低位 R/W 0x0000-0xFFFF 0x0005 模块波特率

0x0001---2400 0x0002---4800 0x0003---9600
0x0004---14400 0x0005---19200 0x0006---38400
0x0007---57600 0x0008---115200 Other----115200

0x04 串口参数控制寄存器高位 R/W 0x0000-0xFFFF 0x0001 模块校验位H

0x00--无
0x01--Even
0x02--Odd
other-无
停止位L
0x00--0.5Byte
0x01--1Byte
0x02--1.5Byte
0x03--2Byte
Other--1Byte

0x05 距离寄存器 R 0x0000-0xFFFF 0x0000 模块测得的距离值,LSB代表1CM
0x06 板载温度数据寄存器 R 0x0000-0xFFFF 0x0000 板载温度传感器测得的温度数据,LSB代表0.1摄氏度(有符号数)
0x07 外部温度补偿数据寄存器 R/W 0x0000-0xFFFF 0x0000 当用户不用板载温度传感器作测距温度补偿时,可以写入环境温度数据到该寄存器用于测距温度补偿,LSB代表0.1摄氏度(有符号数)
0x08 控制寄存器 R/W 0x0000-0xFFFF 0x0004 bit0
0-使用板载温度补偿功能
1-使用外部温度补偿功能(需用户写入温度数据至外部温度补偿数据寄存器)
bit1
0-使能温度补偿
1-关闭温度补偿
bit2
0-自动测距
1-被动测距
bit3
被动模式下,向该位写入1,测距一次,300ms后可从距离寄存器读出距离值
自动测距模式下此位未用
bit15-bit4
保留未用

SEN0310寄存器读写示例

准备

  • 硬件
    • 1 x Arduino Leonardo控制板(RS485转TTL需要占用一个串口,推荐使用两个串口以上的设备,示例中用的是Arduino Leonardo,由于Arduino Modbus协议会占用较大内存,所以建议使用Arduino Mega2560控制板
    • 1 x Arduino TTL转485扩展板
    • 1 x 直流电源(模块需要DC24V外接供电)
    • 1 x USB数据线(USB数据线一端连接Arduino板USB口,另一端连接至电脑USB口)
  • 软件
    • Arduino IDE, 点击下载Arduino IDE
    • 在IDE中打开Library Manager(Ctrl+Shift+I),找到并安装ArduinoModbus和ArduinoRS485两个库
库安装
  • 硬件接线示意图
接线示意图

读取测量距离示例

该示例演示了被动测距模式下的测距功能。

测距示例
/**************************************************************************************************************
*This code tests the range finder function of the URM12 ultrasonic sensor(1500cm&RS485)
*@ author : roker.wang@dfrobot.com
*@ data   : 30.09.2019
*@ version: 1.0
**************************************************************************************************************/
#include <ArduinoModbus.h>
#include <ArduinoRS485.h>

#define slave_addr   0x0b

#define TEMP_CONFIG_BIT       (0x03)
#define MEASURE_MODE_BIT      (0x01 << 2)
#define MEASURE_TRIG_BIT      (0x01 << 3)

typedef enum
{
  PID,
  VID,
  SLAVE_ADDR,
  COM_BAUDRATE,
  COM_PARITY_STOP,
  DISTANCE,
  INTERNAL_TEMP,
  EXTERN_TEMP,
  CR
} regindex;

volatile uint16_t cr_t = 0;

uint16_t read_data(uint16_t addr_t, uint16_t reg)
{
  uint16_t data_t;
  if (!ModbusRTUClient.requestFrom(addr_t, HOLDING_REGISTERS, reg, 1))
  {
    Serial.print("failed to read registers! ");
    Serial.println(ModbusRTUClient.lastError());
    data_t = 0xffff;
  }
  else
  {
    data_t =  ModbusRTUClient.read();
  }
  return data_t;
}


uint16_t write_data(uint16_t addr_t, uint16_t reg, uint16_t data)
{

  if (!ModbusRTUClient.holdingRegisterWrite(addr_t, reg, data))
  {
    Serial.print("Failed to write coil! ");
    Serial.println(ModbusRTUClient.lastError());
    return 0;
  }
  else
    return 1;
}

void setup() {
  ModbusRTUClient.begin(19200);
  Serial.begin(9600);
  cr_t |= MEASURE_MODE_BIT;// Set bit2
  cr_t &= ~(uint16_t)TEMP_CONFIG_BIT;//internal temp compensation
  write_data(slave_addr, CR, cr_t); //write CR
  delay(100);
}
volatile  uint16_t dist_t;
void loop() {
  cr_t |= MEASURE_TRIG_BIT;//Set bit3
  write_data(slave_addr, CR, cr_t); //write CR
  delay(300);// delay 300ms
  dist_t = read_data(slave_addr,DISTANCE);

  Serial.print("distance = ");
  Serial.print(dist_t, 1);
  Serial.println("cm");
}

读取板载温度传感器数据示例

测温示例
/**************************************************************************************************************
*This code tests the temperature measurement function of the URM12 ultrasonic sensor(1500cm&RS485)
*@ author : roker.wang@dfrobot.com
*@ data   : 30.09.2019
*@ version: 1.0
*RX(TTL-RS485转接板) -> TX1/D1 (Arduino Leonardo)  TX(TTL-RS485转接板)-> RX1/D0 (Arduino Leonardo)
**************************************************************************************************************/
#include <ArduinoModbus.h>
#include <ArduinoRS485.h>

#define slave_addr   0x0b

typedef enum
{
  PID,
  VID,
  SLAVE_ADDR,
  COM_BAUDRATE,
  COM_PARITY_STOP,
  DISTANCE,
  INTERNAL_TEMP,
  EXTERN_TEMP,
  CR
} regindex;

uint16_t read_data(uint16_t addr_t, uint16_t reg)
{
  uint16_t data_t;
  if (!ModbusRTUClient.requestFrom(addr_t, HOLDING_REGISTERS, reg, 1))
  {
    Serial.print("failed to read registers! ");
    Serial.println(ModbusRTUClient.lastError());
    data_t = 0xffff;
  }
  else
  {
    data_t =  ModbusRTUClient.read();
  }
  return data_t;
}


uint16_t write_data(uint16_t addr_t, uint16_t reg, uint16_t data)
{

  if (!ModbusRTUClient.holdingRegisterWrite(addr_t, reg, data))
  {
    Serial.print("Failed to write coil! ");
    Serial.println(ModbusRTUClient.lastError());
    return 0;
  }
  else
    return 1;
}

void setup() {
  Serial.begin(9600);
  ModbusRTUClient.begin(19200);
}

volatile float temp;

void loop() {
  temp =  read_data(slave_addr,INTERNAL_TEMP) / 10.0;
  Serial.print("internal temp = ");
  Serial.print(temp,1);
  Serial.println("C");
  delay(500);
}

修改模块地址

修改地址示例
/**************************************************************************************************************
*This code tests the address modification function of the URM12 ultrasonic sensor(1500cm&RS485)
*@ author : roker.wang@dfrobot.com
*@ data   : 30.09.2019
*@ version: 1.0
*RX(TTL-RS485转接板) -> TX1/D1 (Arduino Leonardo)  TX(TTL-RS485转接板)-> RX1/D0 (Arduino Leonardo)
**************************************************************************************************************/
#include <ArduinoModbus.h>
#include <ArduinoRS485.h>

#define addr_public   0x00

typedef enum
{
  PID,
  VID,
  SLAVE_ADDR,
  COM_BAUDRATE,
  COM_PARITY_STOP,
  DISTANCE,
  INTERNAL_TEMP,
  EXTERN_TEMP,
  CR
} regindex;

uint16_t cr_t = 0;

uint16_t read_data(uint16_t addr_t, uint16_t reg)
{
  uint16_t data_t;
  if (!ModbusRTUClient.requestFrom(addr_t, HOLDING_REGISTERS, reg, 1))
  {
    Serial.print("failed to read registers! ");
    Serial.println(ModbusRTUClient.lastError());
    data_t = 0xffff;
  }
  else
  {
    data_t =  ModbusRTUClient.read();
  }
  return data_t;
}


uint16_t write_data(uint16_t addr_t, uint16_t reg, uint16_t data)
{

  if (!ModbusRTUClient.holdingRegisterWrite(addr_t, reg, data))
  {
    //Serial.print("Failed to write coil! ");
    //Serial.println(ModbusRTUClient.lastError());
    return 0;
  }
  else
    return 1;
}



void setup() {
  Serial.begin(9600);
  ModbusRTUClient.begin(19200);
  delay(3000);
}
volatile uint16_t addr, res;
void loop() {
  addr = 0x11;
  res = write_data(addr_public, SLAVE_ADDR, addr);
  Serial.print("The device address has been modified as ");

  Serial.print(addr);
  Serial.println(".please power off and restart the device");
  while (1);
}

修改模块波特率

修改波特率示例
/**************************************************************************************************************
*This code tests the baudrate modification function of the URM12 ultrasonic sensor(1500cm&RS485)
*@ author : roker.wang@dfrobot.com
*@ data   : 30.09.2019
*@ version: 1.0
*RX(TTL-RS485转接板) -> TX1/D1 (Arduino Leonardo)  TX(TTL-RS485转接板)-> RX1/D0 (Arduino Leonardo)
**************************************************************************************************************/
#include <ArduinoModbus.h>
#include <ArduinoRS485.h>

#define  addr_default    0x0B
#define  baudrate_default   19200

typedef enum
{
  PID,
  VID,
  SLAVE_ADDR,
  COM_BAUDRATE,
  COM_PARITY_STOP,
  DISTANCE,
  INTERNAL_TEMP,
  EXTERN_TEMP,
  CR
} regindex;

uint16_t cr_t = 0;

uint16_t read_data(uint16_t addr_t, uint16_t reg)
{
  uint16_t data_t;
  if (!ModbusRTUClient.requestFrom(addr_t, HOLDING_REGISTERS, reg, 1))
  {
    Serial.print("failed to read registers! ");
    Serial.println(ModbusRTUClient.lastError());
    data_t = 0xffff;
  }
  else
  {
    data_t =  ModbusRTUClient.read();
  }
  return data_t;
}


uint16_t write_data(uint16_t addr_t, uint16_t reg, uint16_t data)
{

  if (!ModbusRTUClient.holdingRegisterWrite(addr_t, reg, data))
  {
    Serial.print("Failed to write coil! ");
    Serial.println(ModbusRTUClient.lastError());
    return 0;
  }
  else
    return 1;
}

void setup() {
  Serial.begin(9600);
  ModbusRTUClient.begin(baudrate_default);
  delay(3000);
}
volatile uint16_t baudrate_index, res;
void loop() {
  
  baudrate_index = 3;//0x0001---2400   0x0002---4800 0x0003---9600   0x0004---14400 
                     //0x0005---19200  0x0006---38400 0x0007---57600 0x0008---115200 Other----115200             
  res = write_data(addr_default, COM_BAUDRATE, baudrate_index);
  if(res)
    Serial.print("The baudrate has been modified as 9600.please power off and restart the device");
  while (1);
}

探测角度及灵敏度说明

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

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

常见问题

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

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


更多


DFshopping car1.png [Link DFRobot商城购买链接]

个人工具
名字空间

变换
操作
导航
工具箱