TFmini-I²C版本修改地址与多机联动方案

TFmini-I²C版本修改地址与多机联动方案

目的

为修改I2C版本TFmini的地址提供稳定可靠的流程及可以参考的代码示例。 本次I2C版本TFmini多机联动实验将以Arduino UNO为实验载体,其他载体请参考本文章进行移植开发或使用Arduino UNO更改TFmini地址后使用于其他载体。

原理

使用Arduino UNO依次修改每个TFmini的地址,修改完毕后多机协同测试。本实验将以2台TFmini作为多机测试样品,若连接更多TFmini,只需按照此流程继续修改地址即可。

实验设备

  • Arduino UNO ×1
  • TFmini I2C版 ×2
  • 外部5V电源 ×1
  • 杜邦线 ×N (按需使用)
  • Arduino IDE

接线

  1. 单机修改地址及测试接线图

TFmini-I²C版本修改地址与多机联动方案_第1张图片
在单机测试TFmini及修改地址时,可按照以下表格接线:

TFmini-I²C版本修改地址与多机联动方案_第2张图片

  1. 多机协同测试接线图
    TFmini-I²C版本修改地址与多机联动方案_第3张图片
    在修改地址后进行多机协同测试时,可按照以下表格接线:
    TFmini-I²C版本修改地址与多机联动方案_第4张图片
    注意,此时Arduino的供电将不能满足两台TFmini同时工作,需要给TFmini提供5V,峰值电流800mA的外接电源,并将外界电源和Arduino UNO共地处理。

TFmini I2C版本修改地址指令解读

TFmini-I²C版本修改地址与多机联动方案_第5张图片
配置TFmini-I2C的参数时序如上图所示,按照此示意,可知修改任何一个参数,master要发送两个command给slave。

第一个command:

  • 声明slave地址
  • 声明slave寄存器高八位地址
  • 声明slave寄存器低八位地址
  • 声明将要传输的数据长度

第二个command:

  • 声明slave地址
  • 按照第一个command写入的数据长度依次输入每一位数据值

根据操作手册说明,TFmini-I2C版本出场默认从机地址为0x10,修改从机地址后需要重新上电或进行系统复位操作方可生效,所以修改从机地址需要我们对TFmini执行两次指令:修改地址和系统复位。

1、修改地址指令

从机地址保存在寄存器0x0026(十进制38)中,所以修改寄存器的指令可以分解为:

第一个command:

  • 声明slave地址: 0x10(出厂默认设置)
  • 声明寄存器高八位地址:0x00
  • 声明寄存器低八位地址:0x26
  • 声明数据长度:1

第二个command:

  • 声明slave地址:0x10
  • 写入数据:新的地址值

2、复位指令

复位指令的时序与其他指令不同,TFmini复位操作只需要向0x00地址直接发送0x06数据即可完成复位,即:

  • 声明slave地址:0x00
  • 写入数据:0x06

修改地址及测试流程

TFmini-I²C版本修改地址与多机联动方案_第6张图片
有几个重要的实验节点:

  1. TFmini开箱测试:需要单独测试每个TFmini的出厂默认地址是否正常及数据读取功能是否完好,若有偏差请及时联系相关销售人员及FAE。
  2. 修改TFmini地址:使用Arduino UNO或其他设备,对开箱测试通过的TFmini进行修改TFmini地址的操作。
  3. 新地址测试:使用Arduino UNO或其他设备,测试地址更改后TFmini可否由新地址读取数据。
  4. 单机测试循环直到所有的TFmini地址全部唯一并能够由新地址正常读取距离信息。
  5. 将准备好的TFmini-I2C进行联机测试。(根据实验载体可能需要外部电源 5V DC)

相关代码及解析

此章节将介绍修改地址、复位及读取指令的代码片段,可直接用于您的Arduino开发环境中。

  1. 修改地址代码(Arduino IDE)
/**
 * @Description: Modify TFmini address from @Addr to @value
 * Params:
 *        @Addr: current address of TFmini, ie 0x10
 *        @value: new address, ie 0x11
 */
void SET_TFMini_I2CAddr(byte Addr, byte value) {
  //Start a command, declare @Addr, Reg_H, Reg_L, DATA Length
  Wire.beginTransmission(Addr); // Begin a transmission to the I2C Slave device with the given address.
  Wire.write(0); // Reg's Address_H
  Wire.write(38); // Reg's Address_L , OCT 38 == HEX 0x26
  Wire.write(1); // Data Length
  Wire.endTransmission(0);  // Send a START Sign
  //Start a command, store new value to Addr
  Wire.beginTransmission(Addr); // Begin a transmission to the I2C Slave device with the given address.
  Wire.write(value); // I2C new Address
  Wire.endTransmission(1);  // Send a STOP Sign
  Serial.print("Set Addr ");
  Serial.print(Addr);
  Serial.print(" as ");
  Serial.print(value);
  Serial.print(".\r\n");
  delay(500);
}

此段代码入参为:
Addr (byte),用于声明TFmini当前地址。
value (byte),用于声明TFmini新地址。
代码中发送了两段通信,第一段用于声明slave地址,寄存器低八位,寄存器高八位和数据长度。第二段用于将数据写入slave。

  1. 复位代码(Arduino IDE)
/**
 * @Description: Reset TFmini
 */
void RESET_I2CBus() {
  //send 0x06 to address 0x00
  Wire.beginTransmission(0);
  Wire.write(6);
  Wire.endTransmission(1);
  delay(1000);
}

此段代码不需要声明输入和输出,调用时将会向0x00地址写入0x06,重置I2CBus,所有连接在此BUS上的TFmini都将复位。

  1. 读取数据代码(Arduino IDE)
/**
 * @Description: Get and print reading data from TFmini
 *  data_0  data_1 data_2 data_3 data_4     data_5     data_6
 *  Trigger   0    Dist_L Dist_H Strength_L Strength_H  Mode
 */
void GetAndPrintTFminiData(byte Addr) {
  byte rx_Num;
  byte rx_buf[7] = {0};
  byte i = 0;

  //Start a command, tell TFmini at Addr to measure distance
  Wire.beginTransmission(Addr); // Begin a transmission to the I2C Slave device with the given address.
  Wire.write(1); // Reg's Address_H
  Wire.write(2); // Reg's Address_L
  Wire.write(7); // Data Length
  Wire.endTransmission(0);  // Send a START Sign
  
  // Wire.requestFrom(AA,BB);receive the data form slave.
  // AA: Slave Address ; BB: Data Bytes
  rx_Num = Wire.requestFrom(Addr, 7);

  // Wire.available: Retuens the number of bytes available for retrieval with read().
  while ( Wire.available())
  {
    rx_buf[i] = Wire.read(); // received one byte
    i++;
  }
      // OUTPUT
  Serial.print("Addr in OCT = ");
  Serial.print(Addr);
  Serial.print(":TrigFlag= ");
  Serial.print(rx_buf[0]);
  Serial.print(",Dist= ");
  Serial.print(rx_buf[2] | (rx_buf[3] << 8));
  Serial.print(",Strength= ");
  Serial.print(rx_buf[4] | (rx_buf[5] << 8));
  Serial.print(",Inttime= ");
  Serial.print(rx_buf[6]);
  Serial.print("\r\n");
}

此段代码的入参为:
Addr, byte,用于声明将要从Addr地址的TFmini读取数据
代码中发送了一次命令,接收了一次回复。
发送:发送时,向Addr地址的TFmini的寄存器0x0102发送0x07。
接收:声明长度为7的数组用来保存TFmini返回的7位数据。
每一位数据含义如下:
在这里插入图片描述
通过调取数组中第三位至第六位信息则可得到距离及强度值。

你可能感兴趣的:(TFmini,多机联动,修改地址)