libreria aggiornata

LSM6DS0.h

Committer:
max_mbed
Date:
2017-01-23
Revision:
1:0b38c9475429
Parent:
0:30cd7984fb5b

File content as of revision 1:0b38c9475429:

#pragma once
//Includes
#include "mbed.h"
#include "vector.h"
//Defines
#define G 9.81
#define FULLSCALEBIT 65536
#define LSM6DS0_ADDRESS 0b11010110  // Device address when ADO = 0
//Registers
#define WHO_AM_I        0x0F
#define CTRL_REG1_G     0x10    //Startup Register to turn on both AX and G
    #define BW_G            0
    #define FS_G            3
    #define ODR_G           5
#define CTRL_REG6_XL    0x20    //Startup Register to turn on only AX
    #define BW_XL           0
    #define BW_SCAL_ODR     2
    #define FS_XL           3
    #define ODR_XL          5
#define INT_CTRL        0x0C    //Interrupt register enabler
    #define INT_DRDY_XL     0 
    #define INT_FSS5       5
#define INT_GEN_CFG_XL  0x06
    #define AOI_XL      7
    #define ZHIE_XL     5 
#define INT_GEN_SRC_XL 0x26
    #define IA_XL 7
    #define XL_XL 0

#define CTRL_REG3_G                 0x12    //Gyro HPF
#define CTRL_REG7_XL                0x21    //Acc HPF

#define OUT_X_XL        0x28  //X of Accelerometer
#define OUT_Y_XL        0x2A  //Y of Accelerometer
#define OUT_Z_XL        0x2C  //Z of Accelerometer
#define OUT_X_G         0x18  //alfa of gyroscope
#define OUT_Y_G         0x1A  //beta of gyroscope
#define OUT_Z_G         0x1C  //gamma of gyroscope
//Standard definitions
#define LSM6DS0_ACCELERO_RANGE_2G   0
#define LSM6DS0_ACCELERO_RANGE_4G   2
#define LSM6DS0_ACCELERO_RANGE_8G   3
#define LSM6DS0_ACCELERO_RANGE_16G  1

#define LSM6DS0_REG6XL_ODR_XL_PD    0 //Default Value
#define LSM6DS0_REG6XL_ODR_XL_10HZ  1
#define LSM6DS0_REG6XL_ODR_XL_50HZ  2
#define LSM6DS0_REG6XL_ODR_XL_119HZ 3
#define LSM6DS0_REG6XL_ODR_XL_238HZ 4
#define LSM6DS0_REG6XL_ODR_XL_476HZ 5
#define LSM6DS0_REG6XL_ODR_XL_952HZ 6

#define LSM6DS0_REG6XL_BW_XL_408HZ  0
#define LSM6DS0_REG6XL_BW_XL_211HZ  1
#define LSM6DS0_REG6XL_BW_XL_105HZ  2
#define LSM6DS0_REG6XL_BW_XL_50HZ   3

#define LSM6DS0_GYRO_RANGE_245      0
#define LSM6DS0_GYRO_RANGE_500      1
#define LSM6DS0_GYRO_RANGE_2000     3

#define LSM6DS0_REG6G_ODR_XL_PD     0 //Default Value
#define LSM6DS0_REG6G_ODR_XL_14_9HZ 1
#define LSM6DS0_REG6G_ODR_XL_59_5HZ 2
#define LSM6DS0_REG6G_ODR_XL_119HZ  3
#define LSM6DS0_REG6G_ODR_XL_238HZ  4
#define LSM6DS0_REG6G_ODR_XL_476HZ  5
#define LSM6DS0_REG6G_ODR_XL_952HZ  6 



class LSM6DS0 {
    public:
    /*CONSTRUCTOR:
     * Create itself the i2c serial line
     */
    LSM6DS0(PinName sda, PinName scl);
    /*Test connection through the WHO_AM_I register.
     * return true if the value read correspond to the register
     */
    int enableAcceleroInterrupt(void);
    bool testConnection( void );
    /*turn on only the Accelerometer with default value:
     * METTERE I DEFAULT + COMMENTARE!!!!
     */
    int turnOnAccelerometer(char Odr, char range, char bw);
    /* turn on both ACc and gyro with default values:
     * ODR = 238 Hz, Range = 500dps, BW_filter = 63 Hz
     * Look at the datasheet to set the new values 
     * Return 0 on success, non 0 otherwise
     */
    int turnOnAccGyro(char Odr = 0b100, char range = 0b01, char bw = 0b10);
    /* 
     * Very slow ODR for testing
     */
    int turnOnTestSlow(void);
    /* 
     * Very fast ODR for testing
     */
    int turnOnTestFast(void);
    /* 
     * Set the i2c comunication frequency in Hz
     */
    int setI2CSpeed(int frequency); 
    
    char    getAcceleroRange(void);
    int     getAcceleroRaw(int16_t *data);
    int     getAccelero(Vector* v);
    int     getGyroRaw(int16_t * data);
    int     getGyro(Vector* v, bool after_calibration = true);
    /* Read both accelerometer and gyro in m/s^2 and dps.
     *The data are stored this way:
        -acc[0] = Acc_x
        -acc[1] = Acc_y
        -acc[2] = Acc_z
        -gyro[0] = Ang_x 
        -gyro[1] = Ang_y
        -gyro[2] = Ang_z
     */
    int getAccGyro(Vector *acc, Vector *gyro, bool after_gyro_calibration = true);
    /*i2c serial line writer.
     * return 0 on success, non 0 otherwise
     */     
    int write( char address, char data);
    int read( char adress, char *data);
    int read( char adress, char *data, int length);
    int gyroCalibration(int max_iteration);
    int acceleroCalibration(double *data, int max_iteration);    
    
    private:
     I2C i2c;
     char currentAcceleroRange;
     char currentGyroRange;
     Vector gyro_offset;
};