Arduino+ PCA9547pw

Тема в разделе "Arduino & Shields", создана пользователем siriniti, 1 апр 2017.

  1. siriniti

    siriniti Нуб

    Здравствуйте! Пытаюсь собрать такую систему: arduino uno -> PCA9547PW-> 8 accelerometer's troyka-modul (от амперки на базе LIS331dlh). При использовании мультиплексора PCA9547PW, обвязка в соответствии с даташитом ( SCL, SDA, RST через подтягивающие резисторы 10к на питание; SCL, SDA каждого канала тоже, соответственно подтянуты на питание. на + и - питания повесила конденсатор 220нФ). Столкнулась с проблемой: при использовании библиотеки ардуино wire.h и ее стандартных процедур чтение происходит всегда лишь с датчика, подключенного к нулевому каналу. Вывод на монитор информации с других каналов вызывает зависание программы (т.к. они просто не инициализируются). В чем может быть проблема? Нет ли каких-либо лайфхаков по оптимальному аппаратному подключению мультиплексора? Кто-нибудь сталкивался с похожей ситуацией? Может быть у кого-нибудь найдется рабочий пример для arduino?
     
  2. rkit

    rkit Гуру

    А переключаете мультиплексор хоть? Где код?
     
  3. siriniti

    siriniti Нуб

    Код сыроватый, взят на основе примера из интернета
    Код (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();
    }
     
     
  4. rkit

    rkit Гуру

    Переключаете в одном месте на третий, а в другом на пятый канал.
     
  5. siriniti

    siriniti Нуб

    он при любых конфигурациях считывает и отображает информацию с нулевого канала,
     
    Последнее редактирование: 6 апр 2017
  6. siriniti

    siriniti Нуб

    Ну что вообще что ли ни кто не сталкивался с подобными коммутаторами?