Пример #1
0
void setup(void)
{
  // Get particulars for board
  i2cInit(I2CDEV_2);

  // Not sure why the ms5611 needs this, but without this line it doesn't work
  i2cWrite(0,0,0);

  // attempt to initialize barometer
  available = bmp280_init();
} 
Пример #2
0
int main(int argc, char **argv)
{
    signal(SIGINT, sig_handler);
//! [Interesting]

    // Instantiate a BME280 instance using default i2c bus and
    // address.  We use the BMP280 driver to do all of our work, since
    // the BMP280 and the BME280 are identical except for the fact
    // that the BME280 includes a humidity sensor.
    bmp280_context sensor = bmp280_init(BME280_DEFAULT_I2C_BUS,
                                        BME280_DEFAULT_ADDR, -1);

    if (!sensor)
    {
        printf("bmp280_init() failed\n");
        return 1;
    }

    // For SPI, bus 0, you would pass -1 as the address, and a valid pin for CS:
    // bmp280_init(BME280_DEFAULT_SPI_BUS,
    //             -1, 10)

    while (shouldRun)
    {
        // update our values from the sensor
        if (bmp280_update(sensor))
        {
            printf("bmp280_update() failed\n");
            bmp280_close(sensor);
            return 1;
        }

        printf("Compensation Temperature: %f C\n",
               bmp280_get_temperature(sensor));
        printf("Pressure: %f Pa\n", bmp280_get_pressure(sensor));
        printf("Computed Altitude: %f m\n", bmp280_get_altitude(sensor));
        printf("Relative Humidity: %f %%\n\n", bmp280_get_humidity(sensor));

        upm_delay(1);
    }
//! [Interesting]

    printf("Exiting...\n");

    bmp280_close(sensor);

    return 0;
}
static void sensorsDeviceInit(void)
{
  if (isInit)
    return;

  bstdr_ret_t rslt;
  isBarometerPresent = false;

  // Wait for sensors to startup
  vTaskDelay(M2T(SENSORS_STARTUP_TIME_MS));

  /* BMI160 */
  // assign bus read function
  bmi160Dev.read = (bmi160_com_fptr_t)bstdr_burst_read;
  // assign bus write function
  bmi160Dev.write = (bmi160_com_fptr_t)bstdr_burst_write;
  // assign delay function
  bmi160Dev.delay_ms = (bmi160_delay_fptr_t)bstdr_ms_delay;
  bmi160Dev.id = BMI160_I2C_ADDR+1;  // I2C device address

  rslt = bmi160_init(&bmi160Dev); // initialize the device
  if (rslt == BSTDR_OK)
    {
      DEBUG_PRINT("BMI160 I2C connection [OK].\n");
      /* Select the Output data rate, range of Gyroscope sensor
       * ~92Hz BW by OSR4 @ODR=800Hz */
      bmi160Dev.gyro_cfg.odr = BMI160_GYRO_ODR_800HZ;
      bmi160Dev.gyro_cfg.range = SENSORS_BMI160_GYRO_FS_CFG;
      bmi160Dev.gyro_cfg.bw = BMI160_GYRO_BW_OSR4_MODE;

      /* Select the power mode of Gyroscope sensor */
      bmi160Dev.gyro_cfg.power = BMI160_GYRO_NORMAL_MODE;

      /* Select the Output data rate, range of accelerometer sensor
       * ~92Hz BW by OSR4 @ODR=800Hz */
      bmi160Dev.accel_cfg.odr = BMI160_ACCEL_ODR_1600HZ;
      bmi160Dev.accel_cfg.range = SENSORS_BMI160_ACCEL_FS_CFG;
      bmi160Dev.accel_cfg.bw = BMI160_ACCEL_BW_OSR4_AVG1;
      /* Select the power mode of accelerometer sensor */
      bmi160Dev.accel_cfg.power = BMI160_ACCEL_NORMAL_MODE;

      /* Set the sensor configuration */
      rslt |= bmi160_set_sens_conf(&bmi160Dev);
      bmi160Dev.delay_ms(50);

      /* read sensor */
      struct bmi160_sensor_data gyr;
      rslt |= bmi160_get_sensor_data(BMI160_GYRO_ONLY, NULL, &gyr,
                                     &bmi160Dev);
      struct bmi160_sensor_data acc;
      rslt |= bmi160_get_sensor_data(BMI160_ACCEL_ONLY, &acc, NULL,
                                     &bmi160Dev);
    }
  else
    {
      DEBUG_PRINT("BMI160 I2C connection [FAIL].\n");
    }

  /* BMI055 */
  bmi055Dev.accel_id = BMI055_ACCEL_I2C_ADDR;
  bmi055Dev.gyro_id = BMI055_GYRO_I2C_ADDR;
  bmi055Dev.interface = BMI055_I2C_INTF;
  bmi055Dev.read = (bmi055_com_fptr_t)bstdr_burst_read;
  bmi055Dev.write = (bmi055_com_fptr_t)bstdr_burst_write;
  bmi055Dev.delay_ms = (bmi055_delay_fptr_t)bstdr_ms_delay;

  /* BMI055 GYRO */
  rslt = bmi055_gyro_init(&bmi055Dev); // initialize the device
  if (rslt == BSTDR_OK)
    {
      DEBUG_PRINT("BMI055 Gyro I2C connection [OK].\n");
      /* set power mode of gyro */
      bmi055Dev.gyro_cfg.power = BMI055_GYRO_PM_NORMAL;
      rslt |= bmi055_set_gyro_power_mode(&bmi055Dev);
      /* set bandwidth and range of gyro */
      bmi055Dev.gyro_cfg.bw = BMI055_GYRO_BW_116_HZ;
      bmi055Dev.gyro_cfg.range = SENSORS_BMI055_GYRO_FS_CFG;
      rslt |= bmi055_set_gyro_sensor_config(CONFIG_ALL, &bmi055Dev);

      bmi055Dev.delay_ms(50);
      struct bmi055_sensor_data gyr;
      rslt |= bmi055_get_gyro_data(&gyr, &bmi055Dev);
    }
  else
    {
      DEBUG_PRINT("BMI055 Gyro I2C connection [FAIL].\n");
    }

  /* BMI055 ACCEL */
  rslt = bmi055_accel_init(&bmi055Dev); // initialize the device
  if (rslt == BSTDR_OK)
    {
      DEBUG_PRINT("BMI055 Accel I2C connection [OK].\n");
      /* set power mode of accel */
      bmi055Dev.accel_cfg.power = BMI055_ACCEL_PM_NORMAL;
      rslt |= bmi055_set_accel_power_mode(&bmi055Dev);
      /* set bandwidth and range of accel */
      bmi055Dev.accel_cfg.bw = BMI055_ACCEL_BW_125_HZ;
      bmi055Dev.accel_cfg.range = SENSORS_BMI055_ACCEL_FS_CFG;
      rslt |= bmi055_set_accel_sensor_config(CONFIG_ALL, &bmi055Dev);

      bmi055Dev.delay_ms(10);
      struct bmi055_sensor_data acc;
      rslt |= bmi055_get_accel_data(&acc, &bmi055Dev);
    }
  else
    {
      DEBUG_PRINT("BMI055 Accel I2C connection [FAIL].\n");
    }

  /* BMM150 */
  rslt = BSTDR_E_GEN_ERROR;

  /* Sensor interface over I2C */
  bmm150Dev.id = BMM150_DEFAULT_I2C_ADDRESS;
  bmm150Dev.interface = BMM150_I2C_INTF;
  bmm150Dev.read = (bmm150_com_fptr_t)bstdr_burst_read;
  bmm150Dev.write = (bmm150_com_fptr_t)bstdr_burst_write;
  bmm150Dev.delay_ms = bstdr_ms_delay;

  rslt = bmm150_init(&bmm150Dev);

  if (rslt == BMM150_OK){
      bmm150Dev.settings.pwr_mode = BMM150_NORMAL_MODE;
      rslt |= bmm150_set_op_mode(&bmm150Dev);
      bmm150Dev.settings.preset_mode = BMM150_PRESETMODE_HIGHACCURACY;
      rslt |= bmm150_set_presetmode(&bmm150Dev);

      DEBUG_PRINT("BMM150 I2C connection [OK].\n");
      isMagnetometerPresent = true;
  }

  /* BMP280 */
  rslt = BSTDR_E_GEN_ERROR;

  bmp280Dev.bus_read = bstdr_burst_read;
  bmp280Dev.bus_write = bstdr_burst_write;
  bmp280Dev.delay_ms = bstdr_ms_delay;
  bmp280Dev.dev_addr = BMP280_I2C_ADDRESS1;
  rslt = bmp280_init(&bmp280Dev);
  if (rslt == BSTDR_OK)
    {
      isBarometerPresent = true;
      DEBUG_PRINT("BMP280 I2C connection [OK].\n");
      bmp280_set_filter(BMP280_FILTER_COEFF_OFF);
      bmp280_set_oversamp_temperature(BMP280_OVERSAMP_2X);
      bmp280_set_oversamp_pressure(BMP280_OVERSAMP_8X);
      bmp280_set_power_mode(BMP280_NORMAL_MODE);
      bmp280Dev.delay_ms(20); // wait before first read out
      // read out data
      int32_t v_temp_s32;
      uint32_t v_pres_u32;
      bmp280_read_pressure_temperature(&v_pres_u32, &v_temp_s32);
      baroMeasDelayMin = SENSORS_DELAY_BARO;
    }

  varianceSampleTime = -GYRO_MIN_BIAS_TIMEOUT_MS + 1;
  sensorsAccLpfAttFactor = IMU_ACC_IIR_LPF_ATT_FACTOR;

  cosPitch = cosf(configblockGetCalibPitch() * (float) M_PI / 180);
  sinPitch = sinf(configblockGetCalibPitch() * (float) M_PI / 180);
  cosRoll = cosf(configblockGetCalibRoll() * (float) M_PI / 180);
  sinRoll = sinf(configblockGetCalibRoll() * (float) M_PI / 180);

  isInit = true;
}