Library containing Crazyflie 2.0 sensors drivers: - LPS25H (barometer) - MPU9250 (IMU) - PMW3901 (optical flow) - VL53L0X (range)

Dependents:   Drones-Controlador controladoatitude_cteste Drone_Controlador_Atitude optical_test

LPS25H/LPS25H.cpp

Committer:
fbob
Date:
2018-10-17
Revision:
15:e07de535b86f
Parent:
8:930aa9d0f5ae

File content as of revision 15:e07de535b86f:

#include "LPS25H.h"

/** Class constructor */
LPS25H::LPS25H(PinName sda, PinName scl) : i2c(sda, scl)
{
}

/** Init barometer */
bool LPS25H::init()
{
    // Setup I2C bus
    setup_i2c();

    // Test I2C bus
    if (test_i2c()) {
        // Setup accelerometer and gyroscope configurations
        setup_baro();
        return true;
    } else {
        return false;
    }
}
/** Read barometer */
void LPS25H::read()
{
    read_baro();
}

/** Setup barometer */
void LPS25H::setup_baro()
{
    //
    write_reg(CTRL_REG1, 0b10110000);
}


/** Setup I2C bus */
void LPS25H::setup_i2c()
{
    // Setup I2C bus frequency to 100kHz
    i2c.frequency(400000);
}

/** Test I2C bus */
bool LPS25H::test_i2c()
{
    // Read device identity
    uint8_t device_id = read_reg(WHO_AM_I);

    // Check if device identity is 0xBD
    if (device_id == 0xBD) {
        return true;
    } else {
        return false;
    }
}

/** Read barometer */
void LPS25H::read_baro()
{    
    // Read raw data (three 8 bit data)
    uint8_t p_raw_xl = read_reg(PRESS_OUT_XL);
    uint8_t p_raw_l = read_reg(PRESS_OUT_L);
    uint8_t p_raw_h = read_reg(PRESS_OUT_H);

    // Reassemble the data (one 24 bit data)
    int32_t p_raw = (p_raw_h << 16 ) | (p_raw_l << 8 ) | p_raw_xl;
    
    // Convert raw data to SI units [hPa]
    p = p_raw / 4096.0;
    
    // Calculate altitude [m] from pressure [hPa]
    z = 44330.8f*(1.0f-pow((p/1025.0f),0.190263f));
}

/** Write data into register on MPU9250 I2C bus address */
void LPS25H::write_reg(uint8_t reg, uint8_t data)
{
    // Register address and data that will be writed
    char i2c_reg_data[2] = {reg, data};

    // Point to register address and write data
    i2c.write(LPS25H_ADDRESS, i2c_reg_data, 2);
}

/** Read data from register on MPU9250 I2C bus address */
char LPS25H::read_reg(uint8_t reg)
{
    // Register address
    char i2c_reg[1] = {reg};
    // Data that will be readed
    char i2c_data[1];

    // Point to register address
    i2c.write(LPS25H_ADDRESS, i2c_reg, 1);
    // Read data
    i2c.read(LPS25H_ADDRESS, i2c_data, 1);

    // Return readed data
    return i2c_data[0];
}