I2c хаб амперки и иму bmi160

Тема в разделе "Arduino & Shields", создана пользователем Kirill, 2 мар 2022.

  1. Kirill

    Kirill Нуб

    Доброго времени суток. Возникла проблема при подключении ИМУ сенсора BMI160 через Амперковский I2C хаб. Хаб запускается, но при запуске кода i2cHubScanner.ino с вики Амперки не видит никаких устройств. При запуске своего кода хаб запускается, пытается инициировать имушку, но имушка падает. Использовал библиотеки TroykaI2CHub Амперки и BMI160-Arduino-master от hanyazou. Хаб и имушки точно живые. Хаб проверял с помощью акселерометра на LIS331 от Амперки и того же i2cHubScanner.ino, BMI160 - напрямую с ардуины через I2C. Понятия не имею в чем дело.
    Еще один вопрос касаемо частоты измерений. При подключении имушек напрямую через I2C к ардуине уперся в потолок в 215Гц на стандартных настройках. В BMI160-Arduino-master есть много всего интересного, в том числе настройка частоты измерений. Номинально, потолок измерений - 3.2кГц. Но метод почему-то не работает.
    Подскажите, пожалуйста, в чем может быть проблема и, по возможности, как исправить. Спасибо

    Код (C++):
    // библиотека для работы с I²C хабом
    #include <TroykaI2CHub.h>
    #include <BMI160Gen.h>

    #define channels 8

    const int add = 0x70;
    const int select_pin = 10;

    BMI160GenClass sensor1;
    BMI160GenClass sensor2;
    BMI160GenClass sensor3;

    // создаём объект для работы с хабом
    // адрес по умолчанию 0x70
    TroykaI2CHub splitter;

    int address_list[channels];

    // можно создавать несколько объектов с разными адресами
    // подробнее читайте на:
    // http://wiki.amperka.ru/продукты:troyka-i2c-hub

    void setup() {
      // открываем последовательный порт
      Serial.begin(115200);
      // ждём открытия порта
      while (!Serial) {
      }
      // печатаем сообщение об успешной инициализации Serial-порта
      Serial.println("Serial init OK");
      // начало работы с I²C хабом
      splitter.begin();
      //  Wire.begin();
      for (int i = 0; i < channels; i++) {
        splitter.setBusChannel(i);
        // выводим номер канала
        Serial.print("Set channel ");
        Serial.print(i);
        Serial.println(":");

        sensor1.begin(BMI160GenClass::I2C_MODE, add, select_pin);
      }
      //  sensor2.begin(BMI160GenClass::I2C_MODE, i2c_addr_2, select_pin);

      Serial.println("Splitter init OK");

      // ждём одну секунду
      delay(1000);
    }

    void loop() {
      int gxRaw[2], gyRaw[2], gzRaw[2];         // raw gyro values
      int axRaw[2], ayRaw[2], azRaw[2];         // raw accel values

      float gx[2], gy[2], gz[2];         // final gyro values
      float ax[2], ay[2], az[2];         // final accel values

      for (int i = 0; i < channels; i++) {
        //    byte state = 1;
        if (i > 1) {
          continue;
        }
        splitter.setBusChannel(i);

        // read raw gyro measurements from device
        sensor1.readGyro(gxRaw[i], gyRaw[i], gzRaw[i]);

        // read raw accel measurements from device
        sensor1.readAccelerometer(axRaw[i], ayRaw[i], azRaw[i]);

        // calculate the gyro and accel
        ax[i] = convertRawAccel(axRaw[i]);
        ay[i] = convertRawAccel(ayRaw[i]);
        az[i] = convertRawAccel(azRaw[i]);

        gx[i] = convertRawGyro(gxRaw[i]);
        gy[i] = convertRawGyro(gyRaw[i]);
        gz[i] = convertRawGyro(gzRaw[i]);

        Serial.print("Channel ");
        Serial.print(i);
        Serial.print(": ");
        Serial.print(gx[i]);
        Serial.print("\t");
        Serial.print(gy[i]);
        Serial.print("\t");
        Serial.print(gz[i]);
        Serial.print("\t");
        Serial.print(ax[i]);
        Serial.print("\t");
        Serial.print(ay[i]);
        Serial.print("\t");
        Serial.print(az[i]);
        Serial.println();

      }
    }


    void startScanerI2C()
    {
      // переменная состояние ответа
      byte state;
      // переменная хранения текущего адреса
      byte address;
      // переменная для хранения количества найденых I²C устройств
      int countDevices = 0;
      // печатем о начале поиска
      Serial.println("Scanning...");
      // перебираем по очереди все адреса от 0 до 127
      for (address = 1; address < 127; address++ ) {
        // начинаем передачу данных по текущем адресу
        Wire.beginTransmission(address);
        // завершаем передачу данных
        state = Wire.endTransmission();
        // если пришедший байт равен нулю
        if (state == 0) {
          // на адресе есть устройство
          // печатаем об этом
          Serial.print("I2C device found at address 0x");
          // если адрес меньше 16, печатем ноль
          if (address < 16) {
            Serial.print("0");
          }
          // печатаем текущий адрес в 16 разрядной системе исчесления
          Serial.print(address, HEX);
          Serial.println("  !");
          // инкрементируем кол-во найденых устройств
          countDevices++;
        }
      }
      // если не найдено ни одного I²C устройства
      // печатаем об этом
      if (countDevices == 0) {
        Serial.println("No I²C devices found");
      } else {
        // печатаем о завершении процесса
        Serial.println("Done");
      }
    }

    float convertRawGyro(int gRaw) {
      // since we are using 250 degrees/seconds range
      // -250 maps to a raw value of -32768
      // +250 maps to a raw value of 32767

      float g = (gRaw * 250.0) / 32768.0;

      return g;
    }

    float convertRawAccel(int aRaw) {
      // since we are using +/-2g range
      // -2g maps to a raw value of -32768
      // +2g maps to a raw value of 32767

      float a = (aRaw * 19620.0) / 32768.0;  //mm/s^2

      return a;
    }
     

    Вложения:

    • schematic.png
      schematic.png
      Размер файла:
      307,4 КБ
      Просмотров:
      26