Introduction
What is an ultrasonic distance sensor?
Our ultrasonic distance sensor is a ranging directional sensor equipped with an IC chip. The distance from the sensor to an obstacle can be calculated by the time difference between sending an ultrasonic signal and receiving that reflected sound. Ultrasonic sensors are widely applied to various industries and robot control areas, and offer convenient control and high efficiency in real time data feedback.
URM08-RS485 waterproof sonar range finder from DFRobot is an ultrasonic distance sensor designed for professional industry controls and robotic controls. The sensor is equipped with distance and temperature measurement functions. Additionaly, the built-in temperature compensation greatly enhances the accuracy of distance measurement.
The internal elements of the sensor are completely sealed. The sensor adopts all metal outer case, which makes it able to protect against dust, water and corrosion. In the end the sensor has high standard device selections, a much narrower blind area and wider distance detection range.
URM08-RS485 employs RS485 communication interface, and supports modbus protocol and cascaded control functions. This ultrasonic distance sensor is very suitable for a liquid level monitoring system or obstacle avoidance applications.
Specification
- Operating Voltage: 6V-12V DC
- Operating Current: 250 mA
- Effective Range: 35~550 cm
- Distance Resolution: 1cm
- Distance Accuracy: ±1%
- Temperature Resolution: 0.1°C
- Temperature Accuracy: ±1°C
- Recommended Measurement Period: 100ms
- Operating Temperature Range: -10°C~+70°C
- Operating Humidity Range: RH <75%
- Acoustic Frequency: 38 ~ 42KHz
- Beam Angle: ≤60 °C
- Protection Level: IP65
- Interface: RS485
Interface Description
Users can connect the sensor via PH2.0-4P joint and RS485 interface, the corresponding wiring order is as below:
- Red------VCC (Power Supply: 6-12V)
- Black------GND(-)
- Green------ RS485-A
- Yellow------ RS485-B
Communication Protocol
Factory parameters:
- Serial parameters: 19200 (bps) 8N1
- Factory address: 0x11
Communication Command Frame Format:
Header | Address | Data Length | Command | Data | Checksum |
---|---|---|---|---|---|
0x55 | 0xAA | 1 byte | 1 byte | Data 1~Data n | 1 byte |
Commands List:
Read distance | Read temperature | Set address | Set baud rate |
---|---|---|---|
0x02 | 0x03 | 0x55 | 0x08 |
Note: the following test operation needs an USB-to-RS485 converter. Visit the website to shop.
Read Distance
The host sends a frame command to the ultrasonic module through the RS485 interface to trigger the module to start detecting, and then receives the distance value command returned by the module.
For example, if the address of the ultrasonic module is 0x11, the host sends: 0x55 0xAA 0x11 0x00 0x02 0x12// Read measured distance [ 55 AA 11 00 02 12 ]
Description:
Frame header --------- 0x55
Frame header --------- 0xAA
Device address ----- 0x11
Data length ----- 0x00
Command --------- 0x02
Checksum ------- 0x12
The ultrasonic module returns data as: 0x55 0xAA 0x11 0x02 0x02 0x00 0xCA 0xDE
Description:
Frame header --------- 0x55
Frame header --------- 0xAA
Local address ----- 0x11
Data length ----- 0x02
Command --------- 0x02
Distance High ----- 0x00
Distance low ----- 0xCA (Distance value 0x00CA unit is centimeter, that is, 202 cm in decimal)
Checksum ------- 0xDE
Read Temperature
The host reads the current temperature measured by the ultrasonic module via the RS485 interface.
For example, if the ultrasonic module address is 0x11, the host sends: 0x55 0xAA 0x11 0x00 0x03 0x13// Read the current temperature [ 55 AA 11 00 03 13 ]
Description:
Frame header --------- 0x55
Frame header --------- 0xAA
Device address ----- 0x11
Data length ----- 0x00
Command --------- 0x03
Checksum ------- 0x13
The ultrasonic module returns data as: 0x55 0xAA 0x11 0x02 0x03 0x01 0x13 0x29
Description:
Frame header --------- 0x55
Frame header --------- 0xAA
Local address ----- 0x11
Data length ----- 0x02
Command --------- 0x03
Temperature high ----- 0x01
Temperature low ----- 0x13 (temperature value 0x0113, 27.5 degrees. Note: T = Returned value/10)
Checksum ------- 0x29
Set the Address of the Ultrasonic Module
The host sets the ultrasonic module address via the RS485 interface.
For example, set the ultrasonic module address 0x12, the host sends: 0x55 0xAA 0xAB 0x01 0x55 0x12 0x12// Set ultrasonic address [ 55 AA AB 01 55 12 12 ]
Description:
Frame header --------- 0x55
Frame header --------- 0xAA
Device address ----- 0xAB (0xAB for the broadcast address, that is, all the common address of the module, you can use 0xAB to replace the device’s address if you are not sure about the current Address)
Data length ----- 0x01
Command --------- 0x55
Set the address ----- 0x12 (set the device address to 0x12)
Checksum ------- 0x12
If it succeeds, the ultrasonic module return command as 0x55 0xAA 0x12 0x01 0x55 0xCC 0x33
Description:
Frame header --------- 0x55
Frame header --------- 0xAA
Device address ----- 0x12 (modified device address)
Data length ----- 0x01
Command --------- 0x55
Operation status ----- 0xCC (0xCC - operation completed 0xEE - operation failed)
Checksum ------- 0x33
Set the RS485 Communication Baud Rate
The host sets the ultrasonic module communication baud rate via the RS485 interface.
For example, if the address of the ultrasonic module is set to 0x11, the host sends: 0x55 0xAA 0x11 0x01 0x08 0x0B 0x24 //Set baudrate to 256000bps [ 55 AA 11 01 08 0B 24 ]
Description:
Frame header --------- 0x55
Frame header --------- 0xAA
Device address ----- 0x11
Data length ----- 0x01
Command --------- 0x08
Baud rate selection --- 0x0B
Checksum ------- 0x24
If the setting is successful, the ultrasonic module returns the command as: 0x55 0xAA 0x11 0x01 0x08 0xCC 0xE5
Description:
Frame header --------- 0x55
Frame header --------- 0xAA
Device address ----- 0x11
Data length ----- 0x01
Command --------- 0x08
Operation status ----- 0xCC (0xCC - operation completed 0xEE - operation failed)
Checksum ------- 0xE5
Baud rate Selection List:
1200bps | 2400bps | 4800bps | 9600bps | 14400bps | 19200bps | 28800bps | 38400bps | 57600bps | 115200bps | 128000bps | 256000bps |
---|---|---|---|---|---|---|---|---|---|---|---|
0x00 | 0x01 | 0x02 | 0x03 | 0x04 | 0x05 | 0x06 | 0x07 | 0x08 | 0x09 | 0x0A | 0x0B |
For example, when the device address is 0x11 by default, the baud rate setting command is as follows:
55 AA 11 01 08 00 19 //Set the baud rate 1200bps
55 AA 11 01 08 01 1A //Set the baud rate 2400bps
55 AA 11 01 08 02 1B //Set the baud rate 4800bps
55 AA 11 01 08 03 1C //Set the baud rate 9600bps
55 AA 11 01 08 04 1D //Set the baud rate 14400bps
55 AA 11 01 08 05 1E //Set the baud rate 19200bps
55 AA 11 01 08 06 1F //Set the baud rate 28800bps
55 AA 11 01 08 07 20 //Set the baud rate 38400bps
55 AA 11 01 08 08 21 //Set the baud rate 57600bps
55 AA 11 01 08 09 22 //Set the baud rate 115200bps
55 AA 11 01 08 0A 23 //Set the baud rate 128000bps
55 AA 11 01 08 0B 24 //Set the baud rate 256000bps
Tutorial (Measurement by Single URM08-RS485)
Requirements
- Hardware
- DFRobot Leonardo with Xbee Socket (Arduino Compatible) x 1 (RS485 transfer to TTL will occupy 1 serial port, therefore devices with more than 2 serial ports are recommended, e.g. Leonardo)
- RS485 Shield for Arduino x1
- 7.4V Lithium Battery(6~12V external power supply is needed) x1
- Software
- Arduino IDE (Version requirements: V1.6.+), [https://www.arduino.cc/en/software| Click to Download Arduino IDE from Arduino®]
Connection Diagram
NOTE: Because Leonardo UART communication needs converted to RS485, here we used RS485 expansion board.
Tutorial 1 Distance Measurement
Sample code
/**************************************************************************************************************
*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 converter) -> TX1/D1 (Arduino Leonardo) TX(TTL-RS485 converter)-> RX1/D0 (Arduino Leonardo)
**************************************************************************************************************/
#define header_H 0x55 //Frame header
#define header_L 0xAA //Frame header
#define device_Addr 0x11 //Module address
#define data_Length 0x00 //Data length
#define get_Dis_CMD 0x02 //Distance measurement commands
#define checksum (header_H+header_L+device_Addr+data_Length+get_Dis_CMD) //Checksum
//#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}; //Distance measurement command packet
void setup() {
Serial1.begin(19200); //Communicate with module via Serial1, set baud rate to 19200
Serial.begin(19200); //Set Serial as a serial port of data output
//pinMode(CE,OUTPUT);
}
void loop() {
//TX_EN() ;
for(i=0;i<6;i++){
Serial1.write(CMD[i]);
}
// RX_EN() ;
delay(150); //Wait for the end of distance measurement
i=0;
while (Serial1.available()){ //Read return data package (NOTE: Demo is just for your reference, the data package haven't be calibrated yet)
Rx_DATA[i++]=(Serial1.read());
}
Distance=((Rx_DATA[5]<<8)|Rx_DATA[6]); //Get the distance data
Serial.print(Distance); //Print distance
Serial.println("cm");
}
Tutorial 2 Temperature Measurement
Sample code
/**************************************************************************************************************
*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 converter) -> TX1/D1 (Arduino Leonardo) TX(TTL-RS485 converter)-> RX1/D0 (Arduino Leonardo)
**************************************************************************************************************/
#define header_H 0x55 //Frame header
#define header_L 0xAA //Frame header
#define device_Addr 0x11 //Module address
#define data_Length 0x00 //Data length
#define get_Temp_CMD 0x03 //A temperature measurement command
#define checksum (header_H+header_L+device_Addr+data_Length+get_Temp_CMD) //Checksum
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}; //temperature measurement command packet
void setup() {
Serial1.begin(19200); //Communicate with module via Serial1, set baud rate to 19200
Serial.begin(19200); //Set Serial to serial port of data output
}
void loop() {
for(i=0;i<6;i++){
Serial1.write(CMD[i]);
}
delay(50); //Wait data to return
i=0;
while (Serial1.available()){ //Read return data package (NOTE: Demo is just for your reference, the data package haven't be calibrated yet)
Rx_DATA[i++]=(Serial1.read());
}
temperature=((Rx_DATA[5]<<8)|Rx_DATA[6]); //Get temperature(10 times temperature value here)
Serial.print(temperature/10); //Print temperature
Serial.print('.');
Serial.print(temperature%10);
Serial.println("C");
}
Tutorial (Measurement by Multiple URM08-RS485s)
Note: Connect the mutiple RUM08-RS485 modules to serial bus, then set different addresses for each URM08 mdoule before using.(There are four URM08 sensor in this sample, set their address to: 0x11, 0x22, 0x33, 0x44)
Sample Code
/**************************************************************************************************************
*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 converter) -> TX1/D1 (Arduino Leonardo) TX(TTL-RS485 converter)-> 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},
}; //Distance measurement command packet
void setup() {
Serial1.begin(19200); //Communicate with module via Serial1, set baud rate to 19200
Serial.begin(19200); //Set Serial to serial port of data output
}
void loop() {
for(j=0;j<4;j++)
{
for(i=0;i<6;i++){
Serial1.write(CMD[j][i]);
}
delay(150); //Wait for the end of distance measurement
i=0;
while (Serial1.available()){ //Read return data package (NOTE: Demo is just for your reference, the data package haven't be calibrated yet)
Rx_DATA[i++]=(Serial1.read());
}
Distance=((Rx_DATA[5]<<8)|Rx_DATA[6]); //Get the distance data
Serial.print("URM08-RS485["); //Print distance
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"); //Print (\r\n\r\n);(\r\n\r\n) are new line characters to get better format
delay(300); //Wait for the end of distance measurement
}
Detetion Angle and Sensitivity
Normally, the detection area of an ultrasonic sensor is irregular and hard to define due to its physical characteristics. In actual use, we found that the detection area and sensitivity of this sensor may be larger than other ultrasonic sensors. Therefore, when the sensor is used in a narrow space, a non-target object may be detected.
We used two kinds of reference target obstacles to repeatedly test many sample products. The reference detection area of the corresponding target is as follows:
Test on PVC pipe with a diameter of 7.5cm
Test on smooth flat panel
FAQ
The product supports Modbus-RTU protocol. For any questions, advice or cool ideas to share, please visit the DFRobot Forum