Arduino开发实例SR04TSR04M 防水超声波传感器驱动
Arduino开发实例-SR04T/SR04M 防水超声波传感器驱动
SR04T/SR04M 防水超声波传感器驱动
本文展示如何通过SR04T 防水超声波传感器获取距离数据。 本文还将讨论该模块的工作原理以及将数据处理。
1、SR04T/SR04M介绍
SR04T/SR04M超声波测距模块可提供21cm-600cm的非接触式距离感测功能,测距精度可达高到3mm;模块包括收发一体的超声波传感器与控制电路组成。

SR04T/SR04M的引脚如下:

- 5V :电源输入引脚。
- RX: 充当模块的触发引脚。 为了启动数据采样,需要在该引脚上发送一个 10us 脉冲。
- TX: 模块的输出引脚。 将触发信号发送给模块后,模块发送一个输出脉冲,对应于波从障碍物反弹回来的时间。
- GND: 模块的接地引脚,用于完成模块的电源电路以及为信号提供接地参考。
- SWIM:未使用
- RST: 未使用
2、SR04T/SR04M工作原理
超声波传感器的工作原理是发射频率太高而人类听不见的声波。 然后他们等待声音反射回来,根据所需时间计算距离。 这类似于雷达如何测量无线电波在击中物体后返回所需的时间。 该过程的表示可以如下:

特别是在SR04T/SR04M防水型超声波传感器模块中,该模块向超声波单元发送一个40Khz脉冲,然后将回波信号发送到一系列运算放大器放大接收信号,该接收信号由板载处理 STM8 微控制器最终在回波引脚上生成输出脉冲。 该脉冲的持续时间与传感器接收超声波回波所用的时间相同。
使用传感器接收回波信号所用的时间作为“T”,我们可以使用公式计算传感器与障碍物之间的距离:
测
量
距
离
声
波
速
度
(
S
p
e
e
d
)
×
回
波
信
号
时
间
(
T
)
2
测量距离 = \frac{声波速度(Speed) \times 回波信号时间(T)}{2}
测量距离=2声波速度(Speed)×回波信号时间(T)
SR04T/SR04M模块包括收发一体的超声波传感器与控制电路组成:

- SM8 Controller:模块上的主要微控制器,它执行所有信号处理并控制传感器的操作模式。 控制器还产生操作超声波传感器单元所需的 40Khz 频率脉冲,然后读取输出回波信号,为用户提供可用数据。
- LMV324 Op-Amp:LMV324 运算放大器 IC 在板上具有 4 级运算放大器,它们彼此级联以处理回波信号。 由于接收到的回波信号在本质上通常会非常减弱,因此我们将其通过运算放大器的这 4 个阶段,然后将其馈送到微控制器以对信号进行后处理和计算。
- Transformer Core:变压器铁芯用于将 40Khz Square 调到可在超声波单元上运行的电压。 用户可以对其进行微调以获得更精确的读数。
- Ultrasonic Unit Connector:用于将模块连接到超声波单元。
- R27 Jumper:PCB 上有一个称为 R27 跳线的小空间,通过在该跳线上放置不同值的电阻,我们可以控制超声波模块的操作模式。
SR04T/SR04M的6种操作模式如下:

模式0:Moode=open 即是不用焊接。该模式说明如下
1)、基本工作原理:
- 采用IO口TRIG触发测距,给最少10us的高电平信呈。
- 模块自动发送8个40khz的方波,自动检测是否有信号返回;
- 有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(348M/S))/2;
- 模块被触发测距后,如果接收不到回波(原因超过所测范围或是探头没有正对被测物),ECHO口会在40MS后自动变为低电平,标志着此次测量结束,不论成功与否。
2)、超声波时序图:

模式1:Mode=47K (或直接短接M1位)UART自动输出
UART 自动输出方式按 UART 通信格式输出测量距离值(十六进制数),本方式无需外加触发信号,模块每100ms 可自动测量一次, 每次测量完成在 TX 引脚输出测量距离值。
(1)引脚定义
| 序号 | 标号 | 引脚说明 | 备注 |
|---|---|---|---|
| 2 | TX | UART输出引脚 | |
| 3 | RX | 无 |
(2)通信协议
| UART | 波特率 | 校验位 | 数据位 | 停止位 |
|---|---|---|---|---|
| TTL | 9600 bps | N | 8 | 1 |
(3)格式说明
| 帧数据 | 说明 | 字节 |
|---|---|---|
| 帧头 | 固定为0XFF | 1字节 |
| H_DATA | 距离数据的高8位 | 1字节 |
| L_DATA | 距离数据的低8位 | 1字节 |
| SUM | 数据校验和 | 1字节 |
注:校验和只保留累加数值的低8位
例如:
产品应答 FF 07 A1 A7
其中校验码SUM=A7=(0x07+0xA1+0Xff)&0x00ff
0x07 为距离的高位数据;
0xA1 为距离的低位数据;
距离值为 0x07A1; 转换成十进制为1953; 单位为: 毫米
注:模块在盲区内输出最近的距离值约21cm,如果模块测量不到数据或是超出距离范围输出0。Led上电进后进入工作模式就自动以100MS频闪。
模式2:Mode=120K(或直接短接M2位)UART受控输出
UART 受控输出方式按 UART 通信格式输出测量距离值(十六进制数),本方式需在RX脚加触发指令0X55信号,模块每收到一次指令则测量一次, 每次测量完成在 TX 引脚输出测量距离值。指令触发周期要大于60MS
(1)引脚定义
| 序号 | 标号 | 引脚说明 | 备注 |
|---|---|---|---|
| 2 | TX | UART输出引脚 | |
| 3 | RX | UART受控接收脚(指令0X55) |
(2)通信协议
| UART | 波特率 | 校验位 | 数据位 | 停止位 |
|---|---|---|---|---|
| TTL | 9600 bps | N | 8 | 1 |
(3)格式说明
| 帧数据 | 说明 | 字节 |
|---|---|---|
| 帧头 | 固定为0XFF | 1字节 |
| H_DATA | 距离数据的高8位 | 1字节 |
| L_DATA | 距离数据的低8位 | 1字节 |
| SUM | 数据校验和 | 1字节 |
注:校验和只保留累加数值的低8位
例如:
产品应答 FF 07 A1 A7
其中校验码SUM=A7=(0x07+0xA1+0Xff)&0x00ff
0x07 为距离的高位数据;
0xA1 为距离的低位数据;
距离值为 0x07A1; 转换成十进制为1953; 单位为: 毫米
注:模块在盲区内输出最近的距离值约21cm,如果模块测量不到数据或是超出距离范围输出0。Led上电进后进入工作模式每触发一次指令灯就会亮,频率与触发周期相同,灯每触发两次才会完成翻转为灭。
模式3:Mode=200K高电平(PWM)脉宽自动输出
脉宽PWM自动输出下,模块以200MS的周期自动测量,并在测后输出与距离相对应的脉宽宽度高电平。计算距离方式参考模式1
(1)引脚定义
| 序号 | 标号 | 引脚说明 | 备注 |
|---|---|---|---|
| 2 | Trig | - | |
| 3 | Echo | 高电平脉宽输出 |
模式4:Mode=360K低功耗(PWM)高电平脉宽受控输出
低功耗模式下,模块的关门狗禁用,此模式适合使用电池供电用户,静电功耗小于70UA,工作测距方法同模式一一样。
(1)引脚定义
| 序号 | 标号 | 引脚说明 | 备注 |
|---|---|---|---|
| 2 | Trig | 触发控制引脚 | |
| 3 | Echo | 高电平脉宽输出 |
模式5:Mode=470K开关量输出
工作说明 模块出厂会设定一个门限值,默认为1.5米。模块每200ms进行一次测距,当检测到目标的距离值小于设定的门限值,Echo引脚输出高电平,当前检测的距离 值大于设定的门限值,Echo引脚输出低电平,为了提高稳定性,出厂默认连续2次检测到目标的距离值小于设定的门限值判定为检测的目标距离小于设定的门限值;模块Echo引脚只输出高低电平信号,无驱动能力。应用时应加三极管驱动继电器等。如有特殊要求需要修改门限值 或其他设定,采购时需特别说明。
(1)引脚定义
| 序号 | 标号 | 引脚说明 | 备注 |
|---|---|---|---|
| 2 | Trig | - | |
| 3 | Echo | 开关量高电平输出脚 | 有障碍为H,反之L |
3、驱动实现
本次使用如下驱动库:
驱动示例代码如下:
1 | #include <NewPing.h> |
文章来源: https://iotsmart.blog.csdn.net/article/details/127993431