コード例 #1
0
ファイル: RTIMUSettings.cpp プロジェクト: n1k1tai/quadcopter
bool RTIMUSettings::discoverIMU(int& imuType, unsigned char& slaveAddress)
{
    unsigned char result;
    unsigned char altResult;

    setI2CBus(m_I2CBus);
    if (!I2COpen()) {
        HAL_ERROR1("Failed to open I2C bus %d\n", m_I2CBus);
        return false;
    }

    if (I2CRead(MPU6050_ADDRESS0, MPU6050_WHO_AM_I, 1, &result, "")) {
        if (result == MPU6050_ID) {
            imuType = RTIMU_TYPE_MPU6050;
            slaveAddress = MPU6050_ADDRESS0;
            I2CClose();
            HAL_INFO("Detected MPU6050 at standard address\n");
            return true;
        }
    }

    if (I2CRead(MPU6050_ADDRESS1, MPU6050_WHO_AM_I, 1, &result, "")) {
        if (result == MPU6050_ID) {
            imuType = RTIMU_TYPE_MPU6050;
            slaveAddress = MPU6050_ADDRESS1;
            I2CClose();
            HAL_INFO("Detected MPU6050 at option address\n");
            return true;
        }
    }

    I2CClose();

    HAL_ERROR("No IMU detected\n");
    return false;
}
コード例 #2
0
bool RTIMULSM9DS0::IMUInit()
{
    unsigned char result;

#ifdef LSM9DS0_CACHE_MODE
    m_firstTime = true;
    m_cacheIn = m_cacheOut = m_cacheCount = 0;
#endif
    // set validity flags

    m_imuData.fusionPoseValid = false;
    m_imuData.fusionQPoseValid = false;
    m_imuData.gyroValid = true;
    m_imuData.accelValid = true;
    m_imuData.compassValid = true;
    m_imuData.pressureValid = false;
    m_imuData.temperatureValid = false;
    m_imuData.humidityValid = false;

    //  configure IMU

    m_gyroSlaveAddr = m_settings->m_I2CSlaveAddress;
    if (m_gyroSlaveAddr == LSM9DS0_GYRO_ADDRESS0)
        m_accelCompassSlaveAddr = LSM9DS0_ACCELMAG_ADDRESS0;
    else
        m_accelCompassSlaveAddr = LSM9DS0_ACCELMAG_ADDRESS1;

    m_bus = m_settings->m_I2CBus;

    setCalibrationData(m_settings->m_compassCalValid, m_settings->m_compassCalMin,
                              m_settings->m_compassCalMax);


    //  enable the I2C bus
    setI2CBus(m_bus);
    if (!I2COpen())
        return false;

    //  Set up the gyro

    if (!I2CWrite(m_gyroSlaveAddr, LSM9DS0_GYRO_CTRL5, 0x80, "Failed to boot LSM9DS0"))
        return false;

    if (!I2CRead(m_gyroSlaveAddr, LSM9DS0_GYRO_WHO_AM_I, 1, &result, "Failed to read LSM9DS0 gyro id"))
        return false;

    if (result != LSM9DS0_GYRO_ID) {
        HAL_ERROR1("Incorrect LSM9DS0 gyro id %d\n", result);
        return false;
    }

    if (!setGyroSampleRate())
            return false;

    if (!setGyroCTRL2())
            return false;

    if (!setGyroCTRL4())
            return false;

    //  Set up the accel

    if (!I2CRead(m_accelCompassSlaveAddr, LSM9DS0_WHO_AM_I, 1, &result, "Failed to read LSM9DS0 accel/mag id"))
        return false;

    if (result != LSM9DS0_ACCELMAG_ID) {
        HAL_ERROR1("Incorrect LSM9DS0 accel/mag id %d\n", result);
        return false;
    }

    if (!setAccelCTRL1())
        return false;

    if (!setAccelCTRL2())
        return false;

    if (!setCompassCTRL5())
        return false;

    if (!setCompassCTRL6())
        return false;

    if (!setCompassCTRL7())
        return false;

#ifdef LSM9DS0_CACHE_MODE

    //  turn on gyro fifo

    if (!I2CWrite(m_gyroSlaveAddr, LSM9DS0_GYRO_FIFO_CTRL, 0x3f, "Failed to set LSM9DS0 FIFO mode"))
        return false;
#endif

    if (!setGyroCTRL5())
            return false;

    gyroBiasInit();

    HAL_INFO("LSM9DS0 init complete\n");
    return true;
}
コード例 #3
0
ファイル: RTIMUSettings.cpp プロジェクト: GregMp5/RTIMULib
bool RTIMUSettings::discoverIMU(int& imuType, unsigned char& slaveAddress)
{
    unsigned char result;
    unsigned char altResult;

    setI2CBus(m_I2CBus);
    if (!I2COpen()) {
        HAL_ERROR1("Failed to open I2C bus %d\n", m_I2CBus);
        return false;
    }

    if (I2CRead(MPU9150_ADDRESS0, MPU9150_WHO_AM_I, 1, &result, "")) {
        if (result == MPU9150_ID) {
            imuType = RTIMU_TYPE_MPU9150;
            slaveAddress = MPU9150_ADDRESS0;
            I2CClose();
            HAL_INFO("Detected MPU9150 at standard address\n");
            return true;
        }
    }

    if (I2CRead(MPU9150_ADDRESS1, MPU9150_WHO_AM_I, 1, &result, "")) {
        if (result == MPU9150_ID) {
            imuType = RTIMU_TYPE_MPU9150;
            slaveAddress = MPU9150_ADDRESS1;
            I2CClose();
            HAL_INFO("Detected MPU9150 at option address\n");
            return true;
        }
    }

    if (I2CRead(L3GD20H_ADDRESS0, L3GD20H_WHO_AM_I, 1, &result, "")) {
        if (result == L3GD20H_ID) {
            imuType = RTIMU_TYPE_GD20HM303D;
            slaveAddress = L3GD20H_ADDRESS0;
            I2CClose();
            HAL_INFO("Detected L3GD20H at standard address\n");
            return true;
        } else if (result == LSM9DS0_GYRO_ID) {
            if (I2CRead(LSM9DS0_ACCELMAG_ADDRESS0, LSM9DS0_WHO_AM_I, 1, &altResult, "")) {
                if (altResult == LSM9DS0_ACCELMAG_ID) {
                    imuType = RTIMU_TYPE_LSM9DS0;
                    slaveAddress = LSM9DS0_GYRO_ADDRESS0;
                    I2CClose();
                    HAL_INFO("Detected LSM9DS0 at standard address\n");
                    return true;
                }
            }
        }
    }

    if (I2CRead(L3GD20H_ADDRESS1, L3GD20H_WHO_AM_I, 1, &result, "")) {
        if (result == L3GD20H_ID) {
            imuType = RTIMU_TYPE_GD20HM303D;
            slaveAddress = L3GD20H_ADDRESS1;
            I2CClose();
            HAL_INFO("Detected L3GD20H at option address\n");
            return true;
        } else if (result == LSM9DS0_GYRO_ID) {
            if (I2CRead(LSM9DS0_ACCELMAG_ADDRESS1, LSM9DS0_WHO_AM_I, 1, &altResult, "")) {
                if (altResult == LSM9DS0_ACCELMAG_ID) {
                    imuType = RTIMU_TYPE_LSM9DS0;
                    slaveAddress = LSM9DS0_GYRO_ADDRESS1;
                    I2CClose();
                    HAL_INFO("Detected LSM9DS0 at standard address\n");
                    return true;
                }
            }
        }
    }

    if (I2CRead(L3GD20_ADDRESS0, L3GD20_WHO_AM_I, 1, &result, "")) {
        if (result == L3GD20_ID) {
            imuType = RTIMU_TYPE_GD20M303DLHC;
            slaveAddress = L3GD20_ADDRESS0;
            I2CClose();
            HAL_INFO("Detected L3GD20 at standard address\n");
            return true;
        }
    }

    if (I2CRead(L3GD20_ADDRESS1, L3GD20_WHO_AM_I, 1, &result, "")) {
        if (result == L3GD20_ID) {
            imuType = RTIMU_TYPE_GD20M303DLHC;
            slaveAddress = L3GD20_ADDRESS1;
            I2CClose();
            HAL_INFO("Detected L3GD20 at option address\n");
            return true;
        }
    }

   I2CClose();

    HAL_ERROR("No IMU detected\n");
    return false;
}