(SKU:SEN0304)URM09 Ultrasonic Sensor(Gravity I²C)(V1.0)超声波传感器

来自DFRobot Product Wiki
跳转至: 导航搜索
URM 37 V4.0.JPG

目录

简介

这是一款开放式双探头超声波测距模块,通信方式为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%
  • 测量频率:50Hz Max
  • 模块尺寸:47mm × 22 mm

接口说明

URM09 V1.0模块


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

使用教程

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

URM09 Ultrasonic Sensor(Gravity I²C)(V1.0)寄存器

URM09 Ultrasonic Sensor(Gravity I²C)(V1.0)寄存器一览表
寄存器(8bit) 名称 读写 数据范围 默认值 描述
0x00 设备地址 R/W 0x08-0x77 0x11 I2C从机地址,默认地址为0x11,改变地址后,模块重新上电后新地址才生效
0x01 产品ID R 0x01 用于产品校验
0x02 版本号 R 0x10 用于版本校验[0x10表示V1.0]
0x03

0x04

距离值高位

距离值低位

R

R

0x00-0xFF

0x00-0xFF

0x00

0x00

LSB表示1CM 例:0x64代表100CM
0x05

0x06

温度值高位

温度值低位

R

R

0x00-0xFF

0x00-0xFF

0x00

0x00

实际温度扩大10倍后的值。例:读出的值为0x00fe,则实际温度为0x00fe / 10 = 25.4℃
0x07 配置寄存器 R/W 0x00 bit7(距离测量模式控制位):

0:被动测量,发送一次测距命令,模块测量一次距离并将测量的距离值存入距离寄存器
1:自动测量模式,模块一直在进行距离测量,并不断更新距离寄存器
bit6:保留
bit5-bit4(最大测量距离设置位):
00:150CM(测量周期约20MS)
01:300CM(测量周期约30MS)
10:500CM(测量周期约40MS)

0x08 命令寄存器 R/W 0x00 被动模式下写0X01到该寄存器,模块进行一次测距,自动测量模式下写入数据无效




硬件连接

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

URM09连线图

设置模块I2C地址

模块出厂默认I2C地址为0x11,用户可以根据需要修改I2C地址(更改地址后需重新上电,新地址才生效),示例如下;
演示代码

URM09设置地址
// # Editor     : roker
// # Date       : 15.11.2018

// # Product name: URM V5.0 ultrasonic sensor
// # Product SKU : SEN0304
// # Version     : 1.0

#include <Wire.h>

unsigned char txbuf[10] = {0};
unsigned char rxbuf[10] = {0};
unsigned char addr0 = 0x11;

typedef enum {

  SLAVEADDR_INDEX = 0,
  PID_INDEX,
  VERSION_INDEX ,

  DIST_H_INDEX,
  DIST_L_INDEX,

  TEMP_H_INDEX,
  TEMP_L_INDEX,

  CFG_INDEX,
  CMD_INDEX,
  REG_NUM

} regindexTypedef;

#define    MEASURE_MODE_PASSIVE    (0x00)
#define    MEASURE_RANG_500        (0x20)
#define    CMD_DISTANCE_MEASURE    (0x01)

void setup() {
  Wire.begin(); // join i2c bus (address optional for master)
  Serial.begin(9600); 
  txbuf[0] =  0x12;
  delay(100);
}

void i2cWriteBytes(unsigned char addr_t, unsigned char Reg , unsigned char *pdata, unsigned char datalen )
{
  Wire.beginTransmission(addr_t); // transmit to device #8
  Wire.write(Reg);              // sends one byte

  for (uint8_t i = 0; i < datalen; i++) {
    Wire.write(*pdata);
    pdata++;
  }

  Wire.endTransmission();    // stop transmitting
}

void i2cReadBytes(unsigned char addr_t, unsigned char Reg , unsigned char Num )
{
  unsigned char i = 0;
  Wire.beginTransmission(addr_t); // transmit to device #8
  Wire.write(Reg);              // sends one byte
  Wire.endTransmission();    // stop transmitting
  Wire.requestFrom(addr_t, Num);
  while (Wire.available())   // slave may send less than requested
  {
    rxbuf[i] = Wire.read();
    i++;
  }

}

void loop() {
  uint8_t addr;
  
  i2cReadBytes(addr0, SLAVEADDR_INDEX , 1 );//读取从机地址寄存器
  addr = rxbuf[0];
  Serial.print("the old i2c slave address is ");
  Serial.print("0x");
  Serial.println(addr, HEX);
  delay(10);
  
  i2cWriteBytes(addr0, SLAVEADDR_INDEX , &txbuf[0], 1 ); // 将新地址0x12写入地址寄存器
  delay(100);
  i2cReadBytes(addr0, SLAVEADDR_INDEX , 1 );//读取从机地址寄存器
  addr = rxbuf[0];
  Serial.print("the new i2c slave address is ");
  Serial.print("0x");
  Serial.println(addr, HEX);
  while(1);
}

距离及温度测量

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

演示代码

URM09距离及温度读取
// # Editor     : roker
// # Date       : 15.11.2018

// # Product name: URM V5.0 ultrasonic sensor
// # Product SKU : SEN0304
// # Version     : 1.0

#include <Wire.h>

unsigned char txbuf[10] = {0};
unsigned char rxbuf[10] = {0};


typedef enum {

  SLAVEADDR_INDEX = 0,
  PID_INDEX,
  VERSION_INDEX ,

  DIST_H_INDEX,
  DIST_L_INDEX,

  TEMP_H_INDEX,
  TEMP_L_INDEX,

  CFG_INDEX,
  CMD_INDEX,
  REG_NUM

} regindexTypedef;

#define    MEASURE_MODE_PASSIVE    (0x00)
#define    MEASURE_RANG_500        (0x20)
#define    CMD_DISTANCE_MEASURE    (0x01)


unsigned char addr0 = 0x11;

void setup() {
  Wire.begin(); // join i2c bus (address optional for master)
  Serial.begin(9600); // join i2c bus (address optional for master)
  txbuf[0] =  (MEASURE_MODE_PASSIVE | MEASURE_RANG_500);//模块配置为被动模式,测距范围设置为500CM
  i2cWriteBytes(addr0, CFG_INDEX , &txbuf[0], 1 );//
  delay(100);
}

void i2cWriteBytes(unsigned char addr_t, unsigned char Reg , unsigned char *pdata, unsigned char datalen )
{
  Wire.beginTransmission(addr_t); // transmit to device #8
  Wire.write(Reg);              // sends one byte

  for (uint8_t i = 0; i < datalen; i++) {
    Wire.write(*pdata);
    pdata++;
  }

  Wire.endTransmission();    // stop transmitting
}

void i2cReadBytes(unsigned char addr_t, unsigned char Reg , unsigned char Num )
{
  unsigned char i = 0;
  Wire.beginTransmission(addr_t); // transmit to device #8
  Wire.write(Reg);              // sends one byte
  Wire.endTransmission();    // stop transmitting
  Wire.requestFrom(addr_t, Num);
  while (Wire.available())   // slave may send less than requested
  {
    rxbuf[i] = Wire.read();
    i++;
  }

}


unsigned char i = 0, x = 0;
void loop() {
  int16_t  dist, temp;
  txbuf[0] = CMD_DISTANCE_MEASURE;

  i2cWriteBytes(addr0, CMD_INDEX , &txbuf[0], 1 );//写命令寄存器,发送测距命令
  delay(100);

  i2cReadBytes(addr0, DIST_H_INDEX , 2 );//读取距离寄存器
  dist = ((uint16_t)rxbuf[0] << 8) + rxbuf[1];

  i2cReadBytes(addr0, TEMP_H_INDEX , 2 );//读取温度寄存器
  temp = ((uint16_t)rxbuf[0] << 8) + rxbuf[1];

  Serial.print(dist, DEC);
  Serial.print("cm");
  Serial.print("------");

  Serial.print((float)temp / 10, 1);
  Serial.println("℃");

}


疑难解答

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


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


更多


DFshopping car1.png DFRobot商城购买链接

个人工具
名字空间

变换
操作
导航
工具箱