请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:TCA9548A 工具与软件:
您好、我尝试从18个 IMU 中读取数据。 IMU 都具有相同的地址、因此我使用的是 TCA9548A。 在我的设置中、我需要一个初级多路复用器和三个次级多路复用器。 次级多路复用器将连接在初级多路复用器的通道0、1和2上。 我的第一个次级多路复用器将连接8个 IMU。 我的第二个次级多路复用器将连接8个 IMU。 我的第三个次级多路复用器将连接2个 IMU。 我遇到了 Arduino 代码问题、可以单独与每个 IMU 进行对话。 我可以听到 IMU 1-8的声音、但不能听到9-18的声音。 这是我的代码的简介和设置环路。 我的问题是、我如何请求初级多路复用器上的通道1、然后次级多路复用器上的通道3从 IMU 12读取数据? 谢谢!
#include
#include
#include
#define PRIMARY_TCA_ADDR 0x70 //第一个多路复用器的地址
#define SECONDARY_TCA_ADDR1 0x71 //第二级多路复用器1的地址
#define SECONDARY_TCA_ADDR2 0x72 //第二级多路复用器2的地址
#define SECONDARY_TCA_ADDR3 0x73 //二级多路复用器3的地址
Adafruit_BNO055 BNO = Adafruit_BNO055 (55、0x28);
//用于选择多路复用器上的通道
void selectChannel (uint8_t tca_addr、uint8_t channel){
Wire.beginTransmission(tca_addr);
wire.write (1 << channel);//通过位转换选择通道
Wire.endTransmission ();
}
void setup(){
Serial.begin(115200);
Wire.begin();
//初始化所有 IMU
//在主多路复用器上通过通道0、1、2进行循环
对于(int primary = 0;primary < 3;primary++){
selectChannel (PRIMARY_TCA_ADDR、PRIMARY);
delay(10);
uint8_t secondary_tca_addr_temp;
if (PRIMARY = 0){SECONDARY_TCA_ADDR_temp = SECONDARY_TCA_ADDR1;}
否则、如果(PRIMARY = 1){SECONDARY_TCA_ADDR_temp = SECONDARY_TCA_ADDR2;}
否则、如果(PRIMARY = 2){SECONDARY_TCA_ADDR_temp = SECONDARY_TCA_ADDR3;}
//循环通过辅助多路复用器上的所有通道
对于(int secondary = 0;secondary < 8;secondary ++){
//跳过通道未在最后一个多路复用器上使用
如果((主要=2)&&(次要>1)){
休息;
}
selectChannel (secondary_tca_addr_temp、secondary);
delay (20);//留出 I2C 器件唤醒的时间
如果(!bno.begin ()){
serial.print ("IMU ");serial.print (primary * 8 + secondary + 1);
serial.println ("未检测到。");
delay(10);
}
否则{
bno.setExtCrystalUse(true);//使用外部晶体以获得更高的精度
serial.print ("IMU ");serial.print (primary * 8 + secondary + 1);
serial.println ("检测到。");
}
}
}
}