Здравствуйте! Пытаюсь собрать такую систему: arduino uno -> PCA9547PW-> 8 accelerometer's troyka-modul (от амперки на базе LIS331dlh). При использовании мультиплексора PCA9547PW, обвязка в соответствии с даташитом ( SCL, SDA, RST через подтягивающие резисторы 10к на питание; SCL, SDA каждого канала тоже, соответственно подтянуты на питание. на + и - питания повесила конденсатор 220нФ). Столкнулась с проблемой: при использовании библиотеки ардуино wire.h и ее стандартных процедур чтение происходит всегда лишь с датчика, подключенного к нулевому каналу. Вывод на монитор информации с других каналов вызывает зависание программы (т.к. они просто не инициализируются). В чем может быть проблема? Нет ли каких-либо лайфхаков по оптимальному аппаратному подключению мультиплексора? Кто-нибудь сталкивался с похожей ситуацией? Может быть у кого-нибудь найдется рабочий пример для arduino?
Код сыроватый, взят на основе примера из интернета Код (C++): // библитоека для работы I²C #include <Wire.h> // библиотека для работы с модулями IMU #include <troyka-imu.h> #include <lis331dlh.h> #define MUX 0xE4 //Multiplexer Address // создаём объект для работы с акселерометром LIS331DLH_TWI accel_1(0x18); void setup() { // открываем последовательный порт Wire.begin(); Serial.begin(9600); // выводим сообщение о начале инициализации Serial.println("Begin init..."); mux(0); accel_1.begin(); mux(3); accel_1.begin(); } void loop() { mux(0); Serial.print("Accelerometer 1"); Serial.println(""); Serial.print(accel_1.readGX());// вывод направления и величины ускорения по оси X Serial.print("\t\t"); Serial.print(accel_1.readGY());// вывод направления и величины ускорения по оси Y Serial.print("\t\t"); Serial.print(accel_1.readGZ());// вывод направления и величины ускорения по оси Z Serial.print("\t\t"); Serial.println(""); mux(5); Wire.requestFrom(0xE5,1); while(Wire.available()) { char c = Wire.read(); Serial.print(c); } Serial.print("Accelerometer 2"); Serial.println(""); Serial.print(accel_1.readGX());// вывод направления и величины ускорения по оси X Serial.print("\t\t"); Serial.print(accel_1.readGY());// вывод направления и величины ускорения по оси Y Serial.print("\t\t"); Serial.print(accel_1.readGZ());// вывод направления и величины ускорения по оси Z Serial.print("\t\t"); Serial.println(""); delay(1000); } void mux(byte channel) { Wire.beginTransmission(MUX); Wire.write(channel); //set to selected channel Wire.endTransmission(); }