SEN0310

概 述

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

技术参数

接口说明

接口及尺寸示意图

模块接口线序如下:

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

2、白 ------VCC

3、黑色细线-----GND

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

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

寄存器说明

地址 数量 名称 读写 数据范围 默认值 数据说明
0x00 1 模块PID寄存器 R 0x0000-0xFFFF 0x0001 该位用于产品校验[可实现模块类型的检测]
0x01 1 模块VID寄存器 R 0x0000-0xFFFF 0x0010 该位用于版本校验[0x0010表示V0.0.1.0]
0x02 1 模块地址寄存器 R/W 0x0001-0x00F7 0x000B [传感器地址未知时,可通过广播地址0x00做写入寄存器操作,此时传感器不会有数据输出]
0x03 1 串口参数控制寄存器1 R/W 0x0000-0xFFFF 0x0005 模块波特率
0x0001---2400
0x0003---9600
0x0004---14400
0x0005---19200
0x0006---38400
0x0007---57600
0x0008---115200
Other----115200
0x04 1 串口参数控制寄存器2 R/W 0x0000-0xFFFF 0x0001 模块校验位H    停止位L
0x00--无        0x00--0.5Byte
0x01--Even      0x01--1Byte
0x02--Odd      0x02--1.5Byte
Other--无       0x03--2Byte
                Other--1Byte
0x05 1 距离寄存器 R 0x0000-0xFFFF 0x0000 模块测得的距离值LSB代表1CM
0x06 1 板载温度数据寄存器 R 0x0000-0xFFFF 0x0000 板载温度传感器测得的温度数据LSB代表0.1摄氏度(有符号数)
0x07 1 外部温度补偿数据寄存器 R/W 0x0000-0xFFFF 0x0000 写入环境温度数据到该寄存器用于外部温度补偿LSB代表0.1摄氏度(有符号数)
0x08 1 控制寄存器 R/W 0x0000-0xFFFF 0x0004 bit1:0
00-使用板载温度补偿功能
01-使用外部温度补偿功能(需用户写入温度数据至外部温度补偿数据寄存器)
1x-不使用温度补偿功能
bit2
0-自动测距
1-被动测距
bit3
被动模式下,向该位写入1,测距一次,300ms后可从距离寄存器读出距离值,自动测距模式下此位未用

SEN0310寄存器读写示例

准备

库安装

接线示意图

读取测量距离示例

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

/**************************************************************************************************************
*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 DFRobot商城购买链接