概述
超声波测距是通过发射超声波,并计算传感器收到回声的时间差,从而得出传感器到目标物体距离的一种方法。 A01NYUB是一款防水的超声波测距模块,有效测量距离7.5米,可直接兼容3.3V或者5V控制设备,例如Arduino,树莓派等。A01NYUB平均工作电流小于15mA,绝大部分控制器IO端口便可以为A01NYUB模块提供工作电流。
它采用封闭式收发一体式超声波探头,具有一定的防尘防水能力,能够在潮湿、恶劣的测量环境中工作。外形小巧,质量轻盈,这为你的安装也带来了便利。预留2.54间距-4P接口,采用UART通信方式,能够适应更多系统架构的二次开发与应用。 A01NYUB防水超声波传感器各项参数都经过我们长时间严格的实验测定和优化,具有一流的测距响应速度、稳定性、灵敏度及低功耗。如果您的产品或设计对超声波传感器性能有着近乎苛刻的要求,那么A01NYUB绝对是您的最佳选择。
技术参数
- 工作电压:3.3~5V
- 平均电流:<15mA
- 盲区距离:0-28cm
- 平面物体量程:28-750cm
- 分辨率: 1mm
- 输出方式:UART串口
- 工作周期:100ms
- 探头中心频率:40K±1.0K
- 工作温度:-15~60℃
- 存储温度:-25~80℃
- 防水等级:IP67
功能特点
- 防护等级高
- 抗干扰强
- 数据输出稳定可靠
- 功耗低
- 抗静电强
- 工作温度宽
- 测量精度高
- 体积小,安装便捷
安装尺寸
接口定义
引脚说明
引脚编号 | 名称 | 功能描述 |
---|---|---|
1 | VCC | 电源输入引脚 |
2 | GND | 电源接地引脚 |
3 | RX | 处理值与实时值输出选择引脚 |
4 | TX | UART输出引脚 |
UART输出说明
UART通信说明
当触发输入引线“RX”悬空或者输入高电平时,模块按照处理值输出,数据更稳定,响应时间为150-300ms;当输入低电平时模块按照实时值输出,响应时间为150ms。
UART | 数据位 | 停止位 | 奇偶校验 | 波特率 |
---|---|---|---|---|
TTL电平 | 8 | 1 | 无 | 9600bps |
UART输出格式
帧数据 | 说明 | 字节 |
---|---|---|
帧头 | 固定为0xFF | 1字节 |
DATA_H | 距离数据高8位 | 1字节 |
DATA_L | 距离数据低8位 | 1字节 |
SUM | 通讯校验和 | 1字节 |
UART输出举例
帧头 | DATA_H | DATA_L | SUM |
---|---|---|---|
0xFF | 0x07 | 0xA1 | 0xA7 |
注:校验和只保留累加数值的低8位;
SUM =(帧头+ Data_H+ Data_L)&0x00FF
=(0XFF + 0X07 + 0XA1)&0x00FF
=0XA7;
距离值=Data_H\*256+ Data_L=0X07A1;
转换成十进制等于1953;
表示当前测量的距离值为1953毫米
Arduino平台应用
准备工作
- Arduino UNO
- UNO IO传感器扩展板
- A01NYUB超声波传感器
- 4P连接线一根
软件
- Arduino IDE 版本1.6.8 点击下载Arduino IDE
Arduino连接图
示例代码
/*
@File : DFRobot_Distance_A01.ino
@Brief : This example use A01NYUB ultrasonic sensor to measure distance
With initialization completed, We can get distance value
@Copyright [DFRobot](https://www.dfrobot.com),2016
GUN Lesser General Pulic License
@version V1.0
@data 2019-8-28
*/
#include <SoftwareSerial.h>
SoftwareSerial mySerial(11, 10); // RX, TX
unsigned char data[4] = {};
float distance;
void setup()
{
Serial.begin(57600);
mySerial.begin(9600);
}
void loop()
{
do {
for (int i = 0; i < 4; i++)
{
data[i] = mySerial.read();
}
} while (mySerial.read() == 0xff);
mySerial.flush();
if (data[0] == 0xff)
{
int sum;
sum = (data[0] + data[1] + data[2]) & 0x00FF;
if (sum == data[3])
{
distance = (data[1] << 8) + data[2];
if (distance > 280)
{
Serial.print("distance=");
Serial.print(distance / 10);
Serial.println("cm");
} else
{
Serial.println("Below the lower limit");
}
} else Serial.println("ERROR");
}
delay(150);
}
树莓派平台应用
准备工作
- 树莓派4B
- 树莓派 IO扩展板
- A01NYUB超声波传感器
- 4P连接线一根
树莓派连接图
示例代码
下载超声波库文件
# -*- coding:utf-8 -*-
'''
# demo_get_distance.py
#
# Connect board with raspberryPi.
# Run this demo.
#
# Connect A01 to UART
# get the distance value
#
# Copyright [DFRobot](https://www.dfrobot.com), 2016
# Copyright GNU Lesser General Public License
#
# version V1.0
# date 2019-8-31
'''
import time
from DFRobot_RaspberryPi_A02YYUW import DFRobot_A02_Distance as Board
board = Board()
def print_distance(dis):
if board.last_operate_status == board.STA_OK:
print("Distance %d mm" % dis)
elif board.last_operate_status == board.STA_ERR_CHECKSUM:
print("ERROR")
elif board.last_operate_status == board.STA_ERR_SERIAL:
print("Serial open failed!")
elif board.last_operate_status == board.STA_ERR_CHECK_OUT_LIMIT:
print("Above the upper limit: %d" % dis)
elif board.last_operate_status == board.STA_ERR_CHECK_LOW_LIMIT:
print("Below the lower limit: %d" % dis)
elif board.last_operate_status == board.STA_ERR_DATA:
print("No data!")
if __name__ == "__main__":
dis_min = 0 # Minimum ranging threshold: 0mm
dis_max = 7500 # Highest ranging threshold: 7500mm
board.set_dis_range(dis_min, dis_max)
while True:
distance = board.getDistance()
print_distance(distance)
time.sleep(0.3) # Delay time < 0.6s
注:从树莓派3开始,树莓派有2个串口,默认被映射到板载蓝牙串口,需要通过设置将串口重新映射到GPIO的串口上
ESP32平台应用
ESP32连接图
示例代码
#include <HardwareSerial.h>
HardwareSerial mySerial(1);
unsigned char data[4] = {};
float distance;
void setup()
{
mySerial.begin(9600, SERIAL_8N1, 0, 4);
Serial.begin(115200);
}
void loop()
{
do {
for (int i = 0; i < 4; i++)
{
data[i] = mySerial.read();
}
} while (mySerial.read() == 0xff);
mySerial.flush();
if (data[0] == 0xff)
{
int sum;
sum = (data[0] + data[1] + data[2]) & 0x00FF;
if (sum == data[3])
{
distance = (data[1] << 8) + data[2];
if (distance > 280)
{
Serial.print("distance=");
Serial.print(distance / 10);
Serial.println("cm");
} else
{
Serial.println("Below the lower limit");
}
} else Serial.println("ERROR");
}
delay(150);
}