超声波传感器

简介

这是一款开放式双探头超声波测距模块,通信方式为I2C,采用Gravity标准PH2.0-4P立式贴片座接口。该模块兼容arduino、树莓派等各种3.3V或5V逻辑电平的主控板。模块自带温度补偿,平整墙面的有效测距量程为2–500cm,分辨率为1cm,误差约为±1%。 设计150cm、300cm、500cm 三个测距量程可供程序选择切换,更短的量程设置会带来更短的测距周期和更低的测距灵敏度,用户可根据实际使用需求灵活设置。

技术规格

  • 供电电压:3.3V~5.5V DC
  • 工作电流:20mA
  • 工作温度范围:-10℃~+70℃
  • 有效测距量程:2cm~500cm(可设置,最大量程500CM)
  • 分辨率:1cm
  • 精度:1%
  • 方向角:60°
  • 测量频率:50Hz Max
  • 模块尺寸:47mm × 22 mm

接口说明

URM09 V2.0模块

引脚 引脚说明
VCC 电源输入(3.3V-5.5V)
GND 电源地
C I2C时钟线SCL
D I2C数据线SDA

使用教程

URM09是一款简洁实用的超声波传感器,它采用的是I2C通信方式,可以方便的与具有I2C接口的主板时行通信

寄存器表

URM09 Ultrasonic Sensor(Gravity I²C)(V2.0)寄存器一览表

寄存器表

URM09 Ultrasonic Sensor(Gravity I²C)(V3.0)寄存器一览表

寄存器(8bit) 名称 读写 数据范围 默认值 描述
0x00 设备地址 R/W 0x08-0x77 0x11 模块的设备地址
重启后生效
0x01 产品ID R 0x01 用于产品校验
0x02 版本号 R 0x10 用于版本校验(0x10表示V1.0)
0x03
0x04
距离值高位
距离值低位
R
R
0x00
0xFF
0x00
0x00
LSB表示1cm
例:0x64代表100cm
0x05
0x06
温度值高位
温度值低位
R
R
0x00
0xFF
0x00
0x00
实际温度扩大10倍后的值
例:读出的值为0x00fe,则实际温度是0x00fe/10=25.4℃
0x07 配置寄存器 R/W 0x00 bit7(距离测量模式控制位):
0:被动测量,发送一次测距命令,模块测量一次距离并将测量的距离值存入距离寄存器
1:自动测量模式,模块一直在进行距离测量,并不断更新距离寄存器
0x08 命令寄存器 R/W 0x00 被动模式下写0x01到该寄存器,模块进行一次测距,自动测量模式下写入数据无效

注意:新版本已经取消了程序选择切换150cm、300cm、500cm的测距范围,并对测距方案进行了优化,以提高产品的稳定性和探头的兼容性。因此,尽管库中的代码未做相应修改,但使用软件程序来配置测距范围不会产生效果。

硬件连接

将模块通过I2C接口与UNO连接,如图:
URM09连线图

Arduino 距离及温度测量

模块出厂默认为被动测量模式,通过写命令寄存器发送测距命令,模块收到命令后便启动一次测距(测距时间与测距量程有关),当测距完成后,读取距离寄存器便可得到距离值。而温度测量直接读出温度寄存器后,经过简单处理就可以得到测得的温度值。

演示代码

/*!
 * @file PassiveMesure.ino
 * @brief Passive measurement of distance and temperature
 * @n This example is the ultrasonic passive measurement of distance and module temperature and printing on the serial port
 * @copyright Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
 * @license The MIT License (MIT)
 * @author ZhixinLiu(zhixin.liu@dfrobot.com)
 * @version version  V1.2
 * @date 2020-9-30
 * @url https://github.com/DFRobot/DFRobot_URM09
 */
#include "DFRobot_URM09.h"

/* Create a URM09 object to communicate with IIC. */
DFRobot_URM09 URM09;

void setup() {
  Serial.begin(115200);
  /**
   * I2c device number 1-127
   * When the i2c device number is not passed, the default parameter is 0x11
   */
  while(!URM09.begin()){
    Serial.println("I2C device number error ");
    delay(1000);
  }
  /**
   * The module is configured in automatic mode or passive
   *  MEASURE_MODE_AUTOMATIC       automatic mode
   *  MEASURE_MODE_PASSIVE         passive mode
   * The measurement distance is set to 500,300,150 
   *  MEASURE_RANG_500             Ranging from 500 
   *  MEASURE_RANG_300             Ranging from 300 
   *  MEASURE_RANG_150             Ranging from 150 
  */
  URM09.setModeRange(MEASURE_MODE_PASSIVE ,MEASURE_RANG_500);   
  delay(100);
}

void loop() {
  URM09.measurement();                         // Send ranging command 
  delay(100);
  int16_t dist = URM09.getDistance();          // Read distance
  float   temp = URM09.getTemperature();       // Read temperature
  Serial.print(dist, DEC); Serial.print(" cm------"); 
  Serial.print(temp, 1); Serial.println(" C");
  delay(100);
}

演示效果
URM09距离及温度读取

Raspberry 距离及温度测量

演示代码

# -*- coding:utf-8 -*-
'''
    # PassiveMeasure.py
    #
    # Connect board with raspberryPi.
    # Make board power and URM09 connection correct.
    # Run this demo.
    #
    # Set the i2c communication device number.
    # Set test mode and distance.
    # Get temperature and distance data.
    #
    # Copyright   [DFRobot](http://www.dfrobot.com), 2016
    # Copyright   GNU Lesser General Public License
    #
    # version  V2.0
    # date  2019-7-09
'''
import sys
import time

import URM09

sys.path.append("../..")
''' Create a URM09 object to communicate with I2C. '''
URM09 = URM09.DFRobot_URM09()
''' Set the i2c device number '''
URM09.begin(0x11)
time.sleep(0.1)
'''
    # The module is configured in automatic mode or passive
    #  _MEASURE_MODE_AUTOMATIC        // automatic mode
    #  _MEASURE_MODE_PASSIVE          // passive mode

    # The measurement distance is set to 500,300,100
    #  _MEASURE_RANG_500              // Ranging from 500
    #  _MEASURE_RANG_300              // Ranging from 300
    #  _MEASURE_RANG_150              // Ranging from 100
'''
URM09.SetModeRange(URM09._MEASURE_MODE_PASSIVE, URM09._MEASURE_RANG_500)
while(1):
    ''' Write command register and send ranging command '''
    URM09.SetMeasurement()
    time.sleep(0.1)
    ''' Read distance register '''
    dist = URM09.i2cReadDistance()
    ''' Read temperature register '''
    temp = URM09.i2cReadTemperature()

    print("Temperature is %.2f .c    " % (temp / 10))
    print("Distance is %d cm         " % dist)
    time.sleep(0.1)

演示结果
URM09距离及温度测量

Mind+ Python模式编程(行空板)

Mind+Python模式为完整Python编程,因此需要能运行完整Python的主控板,此处以行空板为例说明

连接图

操作步骤

1、下载及安装官网最新软件。下载地址:https://www.mindplus.cc 详细教程:Mind+基础wiki教程-软件下载安装

2、切换到“Python模式”。“扩展”中选择“官方库”中的“行空板”和“pinpong库”中的”pinpong初始化“和“I2C超声波测距传感器”。切换模式和加载库的详细操作链接

3、进行编程

4、连接行空板,程序点击运行后,可在终端查看数据。行空板官方文档-行空板快速上手教程 (unihiker.com)

代码编程

以pinpong库为例,行空板官方文档-行空板快速上手教程 (unihiker.com)

#  -*- coding: UTF-8 -*-

# MindPlus
# Python
from pinpong.libs.dfrobot_urm09 import URM09
from pinpong.board import Board
import time


Board().begin()
ult1 = URM09(17)
ult1.set_mode_range(ult1._MEASURE_MODE_AUTOMATIC, ult1._MEASURE_RANG_500)

while True:
    print((str("距离:") + str(ult1.distance_cm())))
    print((str("温度:") + str(ult1.temp_c())))
    time.sleep(1)

探测角度及灵敏度说明

超声波传感器的物理特性决定了其实际具有不规则的探测区域,因此超声波测距传感器的探测角度难以被准确的定义。我们分别使用了2种参考目标障碍物对多样本产品进行了测试,对应目标的参照检测区域如下图示:

疑难解答

如果遇到技术问题,请登陆到我们的售后论坛留言,我们会尽快解答您的问题。

更多问题及有趣的应用,可以 访问论坛 进行查阅或发帖!

更多

DFshopping_car1.png DFRobot商城购买链接