test angle measurement LSM6DS3

Dependencies:   ESC IMUfilter LSM6DS3 mbed

main.cpp

Committer:
rsmits
Date:
2018-02-03
Revision:
2:405f8e1a01d3
Parent:
1:0e63617e1965
Child:
3:78cf56b8eb21

File content as of revision 2:405f8e1a01d3:

#include "mbed.h"
#include "esc.h" 
#include "LSM6DS3.h"
#include "IMUfilter.h"

// refresh time. set to 500 for part 2 and 50 for part 4
#define REFRESH_TIME_MS 100
//Gravity at Earth's surface in m/s/s
#define g0 9.812865328f
//Convert from degrees to radians. radians = (degrees*pi)/180
#define toRadians(x) (x * 0.01745329252f)
//Convert from radians to degrees.
#define toDegrees(x) (x * 57.2957795)

const int   LSM6DS3_ADDRESS = 0xD4;
float       DEGREES[3];
float       ACCELERATIONS[3];
float       ANGLES[3];
//const int   LSM6DS3_ADDRESS = 0x69;

Serial      pc(SERIAL_TX, SERIAL_RX); 
AnalogIn    PRESSURE_SENSOR(PA_0);
LSM6DS3     imu(PB_9, PB_8, LSM6DS3_ADDRESS);
IMUfilter   imuFilter(0.1, 10);
Ticker      ScreenTicker; 

//Init Serial port and LSM6DS3 chip
void setup()
{
    // Use the begin() function to initialize the LSM9DS0 library.
    // You can either call it with no parameters (the easy way):
    // SLEEP
//    uint16_t status = imu.begin(imu.G_SCALE_245DPS, imu.A_SCALE_2G,
//                                imu.G_POWER_DOWN, imu.A_POWER_DOWN);
    // LOWEST
//    uint16_t status = imu.begin(imu.G_SCALE_245DPS, imu.A_SCALE_2G,
//                                imu.G_ODR_13_BW_0, imu.A_ODR_13);
    // HIGHEST
//    uint16_t status = imu.begin(imu.G_SCALE_2000DPS, imu.A_SCALE_8G,
//                                imu.G_ODR_1660, imu.A_ODR_6660);
                                
    uint16_t status = imu.begin(imu.G_SCALE_245DPS, imu.A_SCALE_2G,
                                imu.G_ODR_1660, imu.A_ODR_6660);
 
    //Make sure communication is working
    pc.printf("LSM6DS3 WHO_AM_I's returned: 0x%X\r\n", status);
    pc.printf("Should be 0x69\r\n");
}

void screenUpdate(){
    pc.printf("Accel (m/s^2):\r\n");
    pc.printf("AX: %2f\r\n", ACCELERATIONS[0]);
    pc.printf("AY: %2f\r\n", ACCELERATIONS[1]);
    pc.printf("AZ: %2f\r\n", ACCELERATIONS[2]);

    pc.printf("Gyro (degrees/s):\r\n");
    pc.printf("GX: %f\r\n", DEGREES[0]);
    pc.printf("GY: %f\r\n", DEGREES[1]);
    pc.printf("GZ: %2f\r\n", DEGREES[2]);
    
    pc.printf("Angle (degrees):\r\n");
    pc.printf("X: %f\r\n", ANGLES[0]);
    pc.printf("Y: %f\r\n", ANGLES[1]);
    pc.printf("Z: %f\r\n\r\n", ANGLES[2]); 
}
 
int main()
{
    bool started = false;
    while (true){
        
        if(PRESSURE_SENSOR > 0.9f){
            
            if (not started){
                setup();  //Setup sensor and Serial
                pc.printf("\r\n------ LSM6DS3 Demo -----------\r\n");
                started=true;
                ScreenTicker.attach(&screenUpdate, 1);
            }
            
            wait_ms(REFRESH_TIME_MS);     
            imu.readAccel();
            imu.readGyro();
            
            
            DEGREES[0] = imu.gx;
            DEGREES[1] = imu.gy;
            DEGREES[2] = imu.gz;
            
            // m/(s^2) = g0*g
            ACCELERATIONS[0] = g0*imu.ax;
            ACCELERATIONS[1] = g0*imu.ay;
            ACCELERATIONS[2] = g0*imu.az;
                        
            imuFilter.updateFilter(toRadians(imu.gx), toRadians(imu.gy), toRadians(imu.gz), 
                                   g0*imu.ax, g0*imu.ay, g0*imu.az);
            imuFilter.computeEuler();
            
            ANGLES[0] = toDegrees(imuFilter.getRoll());
            ANGLES[1] = toDegrees(imuFilter.getPitch());
            ANGLES[2] = toDegrees(imuFilter.getYaw());            
        }
        else {
            started=false;
            imuFilter.reset();
            ScreenTicker.detach();
        }
    }
}