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а адреса (устройства и регистра) а потом данные есть ли функции реализующие такую возможность?