URM06超声波测距模块

概 述

本产品兼具温度和距离检测两大主要功能,具有内部温度补偿,可准确检测传感器与目标物之间的距离。传感器内部完全密封,采用金属材质外壳,具有防水、防尘、耐腐蚀等优点,可应于各种液位、物位检测及各种壁障应用。高标准器件选型,保证了较短的检测盲区及较大的距离检测范围,在输出数据稳定可靠的前提下更具有超越众多市场同类产品的检测性能。

技术参数

波束角示意图

接口说明

SEN0243_尺寸图_2.jpg 用户可通过PH2.0-4P接头与UART接口连接,线序对应为:

1.红------VCC(电源6-12V)

2.黑------GND(电源负)

3.绿------UART-RX

4.黄------UART-TX

通信说明

出厂参数: 波特率 19200 bps 8N1 出厂地址 0x11

通信命令帧格式为:

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

通信命令一览表:

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

以下测试命令需要用到USB转串口模块,[https://www.dfrobot.com.cn/goods-242.html该模块选购网址]。

读取测量测距

主机通过UART接口向超声波模块发送一帧命令,触发模块开始测距,之后接收模块返回的距离值命令。 测距命令串口演示 例如超声波模块地址为 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(校验和为前几个字节数据相加后去掉高位得到的值)

读取温度

主机通过UART接口读取超声波模块测得的当前温度。 测温命令串口演示 例如超声波模块地址为 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(校验和为前几个字节数据相加后去掉高位得到的值)

设置超声波模块地址

主机通过UART接口设置超声波模块地址。 修改地址命令串口演示 例如设置超声波模块地址为 0x12,则主机发送: 0x55 0xAA 0xAB 0x01 0x55 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(校验和为前几个字节数据相加后去掉高位得到的值)

设置UART通信波特率

主机通过UART接口设置超声波模块通信波特率。 修改波特率命令串口演示 例如设置超声波模块地址为 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-UART测量示例

接线示意图

注意:因为测试代码用到了两个串口,所以这里用的主板为Arduino Leonardo。

距离测量示例

测距示例

|

/**************************************************************************************************************
*This code tests the range finder function of the URM08-UART Waterproof Sonar Range Finder.
*@ author : roker.wang@dfrobot.com
*@ data   : 11.09.2017
*@ version: 1.0
*Pin  RX  -> TX1/D1 (Arduino Leonardo)  Pin  TX  -> 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-UART Waterproof Sonar Range Finder.
*@author :roker.wang@dfrobot.com
*@data  :11.09.2017
*@version:1.0
*Pin  RX  -> TX1/D1 (Arduino Leonardo)  Pin  TX  -> 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-UART连接测量示例

级联示意图

说明:

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

|


级联测距示例

|

/**************************************************************************************************************
*This code tests the Range Finder function of multiple URM08-UART Waterproof Sonar Range Finder
*@ author : roker.wang@dfrobot.com
*@ data   : 11.09.2017
*@ version: 1.0
*Pin  RX  -> TX1/D1 (Arduino Leonardo)  Pin  TX  -> 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-UART[");   //打印距离
 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);  //等待测距结束
}

|}

常见问题

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

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