+2 голосов
if(( fd = open("/dev/i2c-1", O_RDWR)) < 0) qDebug()<<("Error failed to open I2C bus /dev/i2c-1.\n");

  bno._HandleBNO =fd;

  bmp280.fd = fd;


  std::cout << "Orientation Sensor Raw Data Test" << std::endl;

  // Initialise the sensor
  if(!bno.begin())
  {
    // There was a problem detecting the BNO055 ... check your connections
    std::cout << "Ooops, no BNO055 detected ... Check your wiring or I2C ADDR!" << std::endl;
    while(1);
  }

  usleep( 1000);

  // Display the current temperature
  int8_t temp = bno.getTemp();
  std::cout << "Current Temperature: "<< (int)temp << " C" << std::endl;


  bno.setExtCrystalUse(true);

  std::cout << "Calibration status values: 0=uncalibrated, 3=fully calibrated"<<std::endl;

  bmp280.BMP280Init();  // Должен инициализироваться последним

    while (1)
    {

      //Вызов функции для датчика ориентации 

      if( ioctl( bno._HandleBNO, I2C_SLAVE, BNO055_ADDRESS_B) != 0) qDebug()<<"Error can't find BNO055 at address [0x%02X].\n", BNO055_ADDRESS_B;

      // Possible vector values can be:
      // - VECTOR_ACCELEROMETER - m/s^2
      // - VECTOR_MAGNETOMETER  - uT
      // - VECTOR_GYROSCOPE     - rad/s
      // - VECTOR_EULER         - degrees
      // - VECTOR_LINEARACCEL   - m/s^2
      // - VECTOR_GRAVITY       - m/s^2
      //imu::Vector<3> euler = bno.getVector(Adafruit_BNO055::VECTOR_LINEARACCEL);

      // Display the floating point data
      //std::cout << "X: " << euler.x() <<  " Y: " << euler.y() << " Z: "<< euler.z() << "\t\t";


      // Quaternion data
      imu::Quaternion quat = bno.getQuat();
      std::cout <<"qW: ";
      std::cout <<quat.w();
      std::cout <<" qX: ";
      std::cout <<quat.y();
      std::cout <<" qY: ";
      std::cout <<quat.x();
      std::cout <<" qZ: ";
      std::cout <<quat.z();
      std::cout <<"\t\t";


      // Display calibration status for each sensor.
      uint8_t system, gyro, accel, mag = 0;
      bno.getCalibration(&system, &gyro, &accel, &mag);
      std::cout<< "CALIBRATIO: Sys=" << (int)system << " Gyro=" << (int) gyro
       << " Accel=" << (int) accel << " Mag=" << (int)mag << std::endl;

      //Вызов функции для барометра

    if( ioctl( bmp280.fd, I2C_SLAVE, BMP280_ADDRESS) != 0) qDebug()<<"Error can't find BMP280 at address [0x%02X].\n", BMP280_ADDRESS;

     std::cout<<bmp280.readBMP280Pressure() << std::endl;
     std::cout<<bmp280.readBMP280Temperature() << std::endl;
     std::cout<<bmp280.get_alttitude() << std::endl;
      

     usleep(100* 1000); //Частота 100Гц
    }

}

Функция ioctl( fd, I2C_SLAVE, BNO055_ADDRESS_B) вызывается в цикле перед обращениями к другому датчику таким образом подставляемый адрес всегда верный. Но насколько это правильно в плане быстродействия?  На микроконтроллерах обычно используется обращение содержащее сразу 2а адреса (устройства и регистра) а потом данные есть ли функции реализующие такую возможность?

закрыто с пометкой: Содержит ошибки
(19 баллов) 5
закрыто
Добро пожаловать на Бредборд! Сайт вопросов и ответов на тему Arduino, Raspberry Pi и хоббийной электроники в целом. Цель Бредборда — быть максимально полезным. Поэтому мы строго следим за соблюдением правил, боремся с холиворами и оффтопиком.
  1. parovoZZ

    102 балл(ов)

  2. Un_ka

    66 балл(ов)

  3. sser

    38 балл(ов)

  4. Тигрыч

    10 балл(ов)

  5. Kiprais

    9 балл(ов)

  6. N08I40K

    8 балл(ов)

Награды месяца
1-е место: Raspberry Pi 3 Model A+
2-е место: Raspberry Pi Zero W
3-е место: Raspberry Pi Zero

...