为修改I2C版本TFmini的地址提供稳定可靠的流程及可以参考的代码示例。 本次I2C版本TFmini多机联动实验将以Arduino UNO为实验载体,其他载体请参考本文章进行移植开发或使用Arduino UNO更改TFmini地址后使用于其他载体。
使用Arduino UNO依次修改每个TFmini的地址,修改完毕后多机协同测试。本实验将以2台TFmini作为多机测试样品,若连接更多TFmini,只需按照此流程继续修改地址即可。
配置TFmini-I2C的参数时序如上图所示,按照此示意,可知修改任何一个参数,master要发送两个command给slave。
第一个command:
第二个command:
根据操作手册说明,TFmini-I2C版本出场默认从机地址为0x10,修改从机地址后需要重新上电或进行系统复位操作方可生效,所以修改从机地址需要我们对TFmini执行两次指令:修改地址和系统复位。
从机地址保存在寄存器0x0026(十进制38)中,所以修改寄存器的指令可以分解为:
第一个command:
第二个command:
复位指令的时序与其他指令不同,TFmini复位操作只需要向0x00地址直接发送0x06数据即可完成复位,即:
此章节将介绍修改地址、复位及读取指令的代码片段,可直接用于您的Arduino开发环境中。
/**
* @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。
/**
* @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都将复位。
/**
* @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位数据。
每一位数据含义如下:
通过调取数组中第三位至第六位信息则可得到距离及强度值。