A01NYUB防水超声波传感器

概述

超声波测距是通过发射超声波,并计算传感器收到回声的时间差,从而得出传感器到目标物体距离的一种方法。 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连接图

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的串口上

树莓派串口映射教程.pdf

ESP32平台应用

ESP32连接图

SEN0313连接图

示例代码

#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);
}

更多