KS103测距模块很牛

  • 内容
  • 评论
  • 相关

KS103测距模块电气特性

KS103超声波测距模块

  1. 工作电压:3.0V~5.5V 直流电源
  2. 工作时瞬间最大电流:10.6mA@5.0V
  3. 工作电流:1.6-2.7 mA@5.0V
  4. 休眠时最大耗电量:500uA@5.0V, typical (串口模式时不休眠)
  5. 功耗:使用纳瓦技术省电,5s 未收到 I2C 控制指令自动进入 uA 级休眠,并可随时被主机 I2C 控制指令唤醒。
  6. 工作模式:I2C总线或TTL

KS103测距模块与SRF08模块的对比

KS103测距模块是深圳导向技术有限公司的一款机器人视距模块,纯国产精品自主知识产权,受国家专利保护。SRF08/SRF10原版为进口产品,价格较高。因此KS103有较高的较高性价比。下表为两者的性能对比图,可以看出KS103测距模块在测试范围、测量精度、反应时间、功耗等方面有明显优势。

对比内容 SRF08/SRF10(原版) KS103
温度补偿功能 高精度温度补偿功能
工作电压 5V 3.0V-5.5V
工作电流 30mA@5V 1.6-2.7mA@5V
工作时瞬间最大电流 50mA@5V 10.6mA@5V
休眠时最大耗电量: 3mA@5V 500μA(0.5mA)@5.0V
最小探测距离 3cm 1cm
最大探测距离 6m 6m
工作频率 40KHz 40KHz
广播地址0x00 支持 不支持
工作温度范围 0℃~+70℃ 0℃~+70℃
接口 标准的I2C接口 标准的I2C接口
可修改的I2C地址 16个 20个
波束宽度 72度 75度
尺寸 长43mm×宽20mm×高17mm 长42mm×宽20mm×高17mm
增益 32 steps 47 steps
自动低功耗休眠
距离最高探测精度 43mm 1mm
距离最短探测时间 66ms 1ms
智能识别探测是否结束
高精温度探测 有/精度0.0625℃
光强探测耗时 66ms 1ms
价格/RMB 555 168

KS103测距模块的工作方式

与SRF02/08等模块类似,KS103模块的引脚上标识有:VCC、SDA/TX(SDA)、SCL/RX(SCL)、GND 及 MODE。MODE 引脚为 I2C 模式与 TTL 串口模式设置引脚,该引脚悬空时,模块工 作 于 I2C 模 式 ; 在加电前将 MODE 引 脚 接 0V 地 时 ,模块工作于 TTL 串口模式。下图为I2C模式的模块连接图。

KS103测距模块的I2C 模式连接图

当工作于I2C模式时,模块需要四根线来完成控制,VCC引脚连接+5V(3.0~5.5V),GND 引脚用于连接电源地,SDA/TX 引脚是 I2C通信的数据线,SCL/RX 引脚是 I2C 通信的时钟线。SCL 及 SDA 线均需要由主机接一个阻值为 1~10K 上拉电阻VCC。KS103的 I2C 通信速率建议不要高于 100kbit/s。

KS103模块的默认I2C地址为 0xe8,使用中可根据实际情况将地址修改为:0xd0, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xde, 0xe0, 0xe2, 0xe4, 0xe6, 0xe8, 0xea, 0xec, 0xee, 0xf8, 0xfa,0xfc, 0xfe这20个地址,但不能使用0xf0-0xf2-0xf4-0xf6,这 4 个地址保留用于 I2C 从机的10 位地址。当控制端主机设备只支持 7 位的 I2C 从机地址时,需要将 8 位地址右移 1 位来使用。例如,KS103模块默认地址是 0xe8,对应 7 位的地址为 0x74。在一条I2C总线上支持20个模块同时工作。

KS103测距模块工作于TTL 串口模式时,须在加电前将MODE引脚置0。相对于I2C工作模式,当采用TTL 串口模式时模块需要 5 根线来完成控制,分别是 VCC引脚用于连接+5V(3.0~5.5V 范围),GND引脚用于连接电源地,SDA/TX引脚连接 MCU 或 USB 转 TTL 模块的 RXD,SCL/RX 引脚连接 MCU 或USB 转 TTL 模块的 TXD。如下图TTL串口模式连接图:

KS103测距模块工作于TTL串口模式

KS103默认的串口地址为 0xe8,可以修改为 20 种地址中的任何一个:0xd0, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xde, 0xe0, 0xe2, 0xe4, 0xe6, 0xe8, 0xea, 0xec, 0xee, 0xf8, 0xfa, 0xfc, 0xfe。需要注意 0xf0, 0xf2, 0xf4,0xf6与 工作于I2C 模式时的限制一样不能作为串口地址。此外,根据串口协议规定,串口通信均是一对一的方式进行,因此建议使用TTL串口模式时,串口总线上最好只备 1 块KS103即可,最多不能超过两块。

KS103模块的例程

基于IIC模式的程序:

#include
                          // Software serial pin for tx
#define KS103ADDR 0x74    // Address of the 0xe8  选择串口地址,共有20个
#define Reg 0x02          // Command byte 选择02探测指令
byte highByte = 0x00;     // Stores high byte from ranging
byte lowByte = 0x00;      // Stored low byte from ranging
void setup()
{
  
  Serial.begin(9600);
  Wire.begin();          //链接线路                          
  delay(100);            // Waits to make sure everything is powered up before sending or receiving data

  Wire.beginTransmission(KS103ADDR);             // Start communticating with KS103
  Wire.write(Reg);                               // Send Reg
  Wire.write(0x71);                              // Send 0x72 to set USB Power 三级降噪
  Wire.endTransmission();
   
}
void loop()
{
  
  int rangeData = getRange();                      // Calls a function to get range

  Serial.println(rangeData);
  delay(100);                                      // Wait before looping
}

int getRange(){                                    // This function gets a ranging from the SRF08
  
  int range = 0; 

  Wire.beginTransmission(KS103ADDR);               // Start communticating with SRF08
  Wire.write(Reg);                                 // Send Command Byte
  Wire.write(0xb4);                                // Send 0xb0 to start a ranging(0-5m)
  Wire.endTransmission();
  
  delay(100);                                     // Wait for ranging to be complete
  
  Wire.beginTransmission(KS103ADDR);              // start communicating with SRFmodule
  Wire.write(Reg);                                // Call the register for start of ranging data
  Wire.endTransmission();

  Wire.requestFrom(KS103ADDR, 2);                 // Request 2 bytes from SRF module
  while(Wire.available() < 2);                    // Wait for data to arrive
  highByte = Wire.read();                         // Get high byte
  lowByte = Wire.read();                          // Get low byte
  //Serial.println (lowByte, DEC); 
  range = ((highByte << 8) + lowByte)/10;         // Put them together
  
  return(range);                                  // Returns Range
}

测试结果如下图:
ks103基于Arduino的测试图