简介
这是一款基于机器人自动控制应用而设计的超声波避障传感器,针对目前市场上对于超声波传感器盲区大、测量角度大、响应时间长、安装适配性差等问题而着重设计,测量范围可达5m,具备了盲区小、测量角度小、响应时间短、过滤同频干扰、体积小、安装适配性高、防尘防水、寿命长、可靠性高等一系列优点。
结合异体声波处理技术,能识别并过滤异体声波,输出数据更加稳定可靠,使得超声波传感器一定程度上降低了超声波同频干扰的概率,满足了用户对于机器人自动控制领域复杂环境的应用需求。
传感数RS4585输出,用户可搭配Arduino的TTL转RS485扩展板(DFR0259)使用,广泛应用于机器人避障、自动控制、停车管理系统、安检门检测、门禁系统、物体接近与存在检测等。
技术规格
- 测距范围:3~500cm
- 测距精度:1+(S*0.3%)cm
- 工作电压:3.3~24V
- 工作电流:≤10mA
- 通讯方式:RS485
- 输出响应时间:15-750ms
- 上电延迟工作时间:≤1000ms
- 检测角度:30~60°
- 工作温度:-25°C~65°C
- 工作湿度:65%~80%RH
- 存储温度:-30°C~80°C
- 存储湿度:65%~90%RH
引脚示意图
标号 | 名称 | 功能描述 |
---|---|---|
红线 | VCC | 电源输入正极 |
黑线 | GND | 电源接地线 |
黄线 | B | RS485 B线 |
白线 | A | RS485 A线 |
尺寸图
安装开孔建议图
Modbus协议说明
1、默认通讯参数
数据位 | 停止位 | 奇偶校验 | 波特率 |
---|---|---|---|
8 | 1 | 无 | 默认115200 |
2、Modbus协议参数
模式 | 校验 | 传感器地址 | 读功能码 | 写功能码 |
---|---|---|---|---|
Modbus-RTU | CRC-16/Modbus | 可设置,默认0x01 | 0x03 | 0x06 |
3、Modbus协议格式
用户机为主机设备,该传感器为从机设备。
主机发送(读):
名称 | 设备地址 | 功能码0x03 | 寄存器地址 | 寄存器数量 | CRC16校验 |
---|---|---|---|---|---|
长度(Byte) | 1 | 1 | 2 | 2 | 2 |
从机回应(读):
名称 | 设备地址 | 功能码0x03 | 返回字节数 | 数据区 | CRC16校验 |
---|---|---|---|---|---|
长度(Byte) | 1 | 1 | 1 | N | 2 |
主机发送(写):
名称 | 设备地址 | 功能码0x03 | 寄存器地址 | 数据区 | CRC16校验 |
---|---|---|---|---|---|
长度(Byte) | 1 | 1 | 2 | 2 | 2 |
从机回应(写):
名称 | 设备地址 | 功能码0x03 | 寄存器地址 | 数据区 | CRC16校验 |
---|---|---|---|---|---|
长度(Byte) | 1 | 1 | 2 | 2 | 2 |
4、Modbus寄存器
寄存器数据为高字节在前,低字节在后。
- Modbus寄存器表一
权限 | 地址 | 功能 | 数据类型 | 说明 |
---|---|---|---|---|
只读 | 0x0100 | 处理值 | 无符号整型,16位 | 收到指令后启动测距,经算法处理后,输出距离值,单位:mm,响应时间约 300~750ms(量程不同而有差异) |
只读 | 0x0101 | 实时值 | 无符号整型,16位 | 模组收到指令后启动测距一次,输出实时距离值,单位:mm,响应时间约 15~140ms(量程不同而有差异) |
只读 | 0x0102 | 温度 | 无符号整型,16位 | 单位:0.1℃,分辨率:0.5℃,响应时间约 40~140ms(量程不同而有差异) |
只读 | 0x010A | 回波时间 | 无符号整型,16位 | 模组收到指令后启动测距一次,输出实时回波时间,单位:us,此值除以 5.75 即得到 mm 单位的距离值,响应时间约 40~140ms(量程不同而有差异) |
- Modbus寄存器表二
权限 | 地址 | 功能 | 数据类型 | 说明 |
---|---|---|---|---|
读写 | 0x0200 | 从机地址 | 无符号整型,16位 | 范围:0x01~0xFE(默认 0x01),0xFF 为广播地址 |
读写 | 0x0201 | 波特率 | 无符号整型,16位 | 串口波特率(默认 115200),单位:bps,设置后立即生效,寄存器值对应的波特率如下:0x0002: 4800,0x0003: 9600,0x0004: 14400,0x0005: 19200,0x0006: 38400,0x0007: 57600,0x0008: 76800,0x0009: 115200 |
读写 | 0x0205 | 开关输出极性 | 无符号整型,16位 | 设置开关量输出极性,仅开关量模式有效;0x00:负输出,小于门限值输出低;0x01:正输出,小于门限值输出高(默认) |
读写 | 0x0206 | 设置开关量门阀值 | 无符号整型,16位 | 设置开关量门限值,单位:mm,范围:30~5000mm,仅开关量模式有效 |
读写 | 0x0208 | 检测角度等级 | 无符号整型,16位 | 角度等级可设置为 1~4 级,(默认第 4级);等级越大,检测角度越大,感应越灵敏,反之越小。1-单角度约 40°,双角度水平角度约45°,垂直角度约 60°;2-单角度约 45°,双角度水平角度约50°,垂直角度约 65°;3-单角度约 55°,双角度水平角度约55°,垂直角度约 70°;4-单角度约 65°,双角度水平角度约65°,垂直角度约 80°; |
读写 | 0x0209 | 输出距离值数据单位 | 无符号整型,16位 | 受控/自动输出协议距离值单位,0x00-mm,0x01-us(此值除以 5.75 即得到 mm 单位的距离值),仅对 UART 自动和 UART 受控模式有效 |
读写 | 0x021A | 电源降噪等级 | 无符号整型,16位 | 电源降噪等级分为 1~5 级(默认为 1),以适用于不同电源供电的场景;等级越高,对噪声抑制越大,同时整体角度也会受影响,等级越高角度受影响情况更大。不同等级说明:1-适用于电池供电的场合;2-适用于 USB 供电等有一定高频噪音的场合;3-适用于较长距离 USB 供电的场合;4-适用于开关电源供电的场合;5-适用于开关电源供电、环境干扰复杂的场合,一般不推荐使用; |
读写 | 0x021F | 量程等级 | 无符号整型,16位 | 测距量程等级 1~5(默认为 5),量程范围:1-约 50cm,2-约 150cm,3-约 250cm,4-约 350cm,5-约 500cm |
- 波特率对单包通讯时长的影响
序号 | 波特率 | 通讯时长 |
---|---|---|
1 | 4800 | 16ms |
2 | 9600 | 8ms |
3 | 14400 | 5.6ms |
4 | 19200 | 4ms |
5 | 38400 | 2.4ms |
6 | 57600 | 1.6ms |
7 | 76800 | 0.8ms |
8 | 115200 | 0.6ms |
注释:波特率越高单包通讯时间越短。
5、Modbus通讯举例
例1:读取处理值数据
主机:01 03 01 00 00 01 85 F6
从机:01 03 02 02 F2 38 A1
说明:传感器地址为0x01,处理距离值为0x02F2,转换成十进制为754mm。
例2:读取实时值数据
主机:01 03 01 01 00 01 D4 36
从机:01 03 02 02 EF F8 A8
说明:传感器地址为0x01,实时距离值为0x02EF,转换成十进制为751mm。
例3:读取温度值数据
主机:01 03 01 02 00 01 24 36
从机:01 03 02 01 2C B8 09
说明:传感器地址为0x01,实时温度值为0x012C,转换成十进制为30.0℃。
例4:修改从机地址
主机:01 06 02 00 00 05 48 71
从机:01 06 02 00 00 05 48 71
说明:传感器地址由0x01修改为0x05。
例5:读取波特率
主机:01 03 02 01 00 01 D4 72
从机:01 03 02 00 03 F8 45
说明:读取波特率,读取到的波特率是:9600bps
例6:设置波特率
主机:01 06 02 01 00 03 99 B3
从机:01 06 02 01 00 03 99 B3
说明:设置波特率为 9600bps
使用教程
准备
- 硬件
Arduino UNO x1
超声波测距传感器(5m) x1
- 软件
Arduino IDE,点击下载 Arduino IDE
接线图
烧录代码前,请将扩展板的收发模式开关切换到AUTO,运行/编译开关切换到OFF,烧录代码后,运行/编译开关切换到ON,串口波特率选择115200
示例代码
uint8_t Com[8] = {0x01,0x03,0x01,0x01,0x00,0x01,0xd4,0x36};
void setup()
{
Serial.begin(115200); //初始化串口
}
void loop()
{
int Distance =readDistance();
Serial.print("Distance = ");
Serial.print(Distance);
Serial.println(" mm");
delay(500);
}
int readDistance(void)
{
uint8_t Data[10] = {0};
uint8_t ch = 0;
bool flag = 1;
int Distance = 0;
while (flag) {
delay(100);
Serial.write(Com, 8);
delay(10);
if (readN(&ch, 1) == 1) {
if (ch == 0x01) {
Data[0] = ch;
if (readN(&ch, 1) == 1) {
if (ch == 0x03) {
Data[1] = ch;
if (readN(&ch, 1) == 1) {
if (ch == 0x02) {
Data[2] = ch;
if (readN(&Data[3], 4) == 4) {
if (CRC16_2(Data, 5) == (Data[5] * 256 + Data[6])) {
Distance = Data[3] * 256 + Data[4];
//Serial.println(Distance);
flag = 0;
}
}
}
}
}
}
}
}
Serial.flush();
}
return Distance;
}
uint8_t readN(uint8_t *buf, size_t len)
{
size_t offset = 0, left = len;
int16_t Tineout = 500;
uint8_t *buffer = buf;
long curr = millis();
while (left) {
if (Serial.available()) {
buffer[offset] = Serial.read();
offset++;
left--;
}
if (millis() - curr > Tineout) {
break;
}
}
return offset;
}
unsigned int CRC16_2(unsigned char *buf, int len)
{
unsigned int crc = 0xFFFF;
for (int pos = 0; pos < len; pos++)
{
crc ^= (unsigned int)buf[pos];
for (int i = 8; i != 0; i--)
{
if ((crc & 0x0001) != 0)
{
crc >>= 1;
crc ^= 0xA001;
}
else
{
crc >>= 1;
}
}
}
crc = ((crc & 0x00ff) << 8) | ((crc & 0xff00) >> 8);
return crc;
}
串口查看传感器检测到的距离值
常见问题
还没有客户对此产品有任何问题,欢迎通过 qq 或者论坛联系我们!
更多问题及有趣的应用,可以访问论坛进行查阅或发帖