libreria aggiornata

Committer:
max_mbed
Date:
Mon Jan 23 22:27:11 2017 +0000
Revision:
0:30cd7984fb5b
Aggiunto funzionamento con interrupt che stampa solo ogni tanto. Si nota che funziona perch? l'angolo ? giusto, ma non basta per sistemare la posizione. Si potrebbe testare leggendo l'accelerazione per vedere se davvero campiona meglio. DA ORDINARE.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
max_mbed 0:30cd7984fb5b 1 #pragma once
max_mbed 0:30cd7984fb5b 2 //Includes
max_mbed 0:30cd7984fb5b 3 #include "mbed.h"
max_mbed 0:30cd7984fb5b 4 #include "vector.h"
max_mbed 0:30cd7984fb5b 5 //Defines
max_mbed 0:30cd7984fb5b 6 #define G 9.81
max_mbed 0:30cd7984fb5b 7 #define FULLSCALEBIT 65536
max_mbed 0:30cd7984fb5b 8 #define LSM6DS0_ADDRESS 0b11010110 // Device address when ADO = 0
max_mbed 0:30cd7984fb5b 9 //Registers
max_mbed 0:30cd7984fb5b 10 #define WHO_AM_I 0x0F
max_mbed 0:30cd7984fb5b 11 #define CTRL_REG1_G 0x10 //Startup Register to turn on both AX and G
max_mbed 0:30cd7984fb5b 12 #define BW_G 0
max_mbed 0:30cd7984fb5b 13 #define FS_G 3
max_mbed 0:30cd7984fb5b 14 #define ODR_G 5
max_mbed 0:30cd7984fb5b 15 #define CTRL_REG6_XL 0x20 //Startup Register to turn on only AX
max_mbed 0:30cd7984fb5b 16 #define BW_XL 0
max_mbed 0:30cd7984fb5b 17 #define BW_SCAL_ODR 2
max_mbed 0:30cd7984fb5b 18 #define FS_XL 3
max_mbed 0:30cd7984fb5b 19 #define ODR_XL 5
max_mbed 0:30cd7984fb5b 20 #define INT_CTRL 0x0C //Interrupt register enabler
max_mbed 0:30cd7984fb5b 21 #define INT_DRDY_XL 0
max_mbed 0:30cd7984fb5b 22 #define INT_FSS5 5
max_mbed 0:30cd7984fb5b 23 #define INT_GEN_CFG_XL 0x06
max_mbed 0:30cd7984fb5b 24 #define AOI_XL 7
max_mbed 0:30cd7984fb5b 25 #define ZHIE_XL 5
max_mbed 0:30cd7984fb5b 26 #define INT_GEN_SRC_XL 0x26
max_mbed 0:30cd7984fb5b 27 #define IA_XL 7
max_mbed 0:30cd7984fb5b 28 #define XL_XL 0
max_mbed 0:30cd7984fb5b 29
max_mbed 0:30cd7984fb5b 30 #define CTRL_REG3_G 0x12 //Gyro HPF
max_mbed 0:30cd7984fb5b 31 #define CTRL_REG7_XL 0x21 //Acc HPF
max_mbed 0:30cd7984fb5b 32
max_mbed 0:30cd7984fb5b 33 #define OUT_X_XL 0x28 //X of Accelerometer
max_mbed 0:30cd7984fb5b 34 #define OUT_Y_XL 0x2A //Y of Accelerometer
max_mbed 0:30cd7984fb5b 35 #define OUT_Z_XL 0x2C //Z of Accelerometer
max_mbed 0:30cd7984fb5b 36 #define OUT_X_G 0x18 //alfa of gyroscope
max_mbed 0:30cd7984fb5b 37 #define OUT_Y_G 0x1A //beta of gyroscope
max_mbed 0:30cd7984fb5b 38 #define OUT_Z_G 0x1C //gamma of gyroscope
max_mbed 0:30cd7984fb5b 39 //Standard definitions
max_mbed 0:30cd7984fb5b 40 #define LSM6DS0_ACCELERO_RANGE_2G 0
max_mbed 0:30cd7984fb5b 41 #define LSM6DS0_ACCELERO_RANGE_4G 2
max_mbed 0:30cd7984fb5b 42 #define LSM6DS0_ACCELERO_RANGE_8G 3
max_mbed 0:30cd7984fb5b 43 #define LSM6DS0_ACCELERO_RANGE_16G 1
max_mbed 0:30cd7984fb5b 44
max_mbed 0:30cd7984fb5b 45 #define LSM6DS0_REG6XL_ODR_XL_PD 0 //Default Value
max_mbed 0:30cd7984fb5b 46 #define LSM6DS0_REG6XL_ODR_XL_10HZ 1
max_mbed 0:30cd7984fb5b 47 #define LSM6DS0_REG6XL_ODR_XL_50HZ 2
max_mbed 0:30cd7984fb5b 48 #define LSM6DS0_REG6XL_ODR_XL_119HZ 3
max_mbed 0:30cd7984fb5b 49 #define LSM6DS0_REG6XL_ODR_XL_238HZ 4
max_mbed 0:30cd7984fb5b 50 #define LSM6DS0_REG6XL_ODR_XL_476HZ 5
max_mbed 0:30cd7984fb5b 51 #define LSM6DS0_REG6XL_ODR_XL_952HZ 6
max_mbed 0:30cd7984fb5b 52
max_mbed 0:30cd7984fb5b 53 #define LSM6DS0_REG6XL_BW_XL_408HZ 0
max_mbed 0:30cd7984fb5b 54 #define LSM6DS0_REG6XL_BW_XL_211HZ 1
max_mbed 0:30cd7984fb5b 55 #define LSM6DS0_REG6XL_BW_XL_105HZ 2
max_mbed 0:30cd7984fb5b 56 #define LSM6DS0_REG6XL_BW_XL_50HZ 3
max_mbed 0:30cd7984fb5b 57
max_mbed 0:30cd7984fb5b 58 #define LSM6DS0_GYRO_RANGE_245 0
max_mbed 0:30cd7984fb5b 59 #define LSM6DS0_GYRO_RANGE_500 1
max_mbed 0:30cd7984fb5b 60 #define LSM6DS0_GYRO_RANGE_2000 3
max_mbed 0:30cd7984fb5b 61
max_mbed 0:30cd7984fb5b 62 #define LSM6DS0_REG6G_ODR_XL_PD 0 //Default Value
max_mbed 0:30cd7984fb5b 63 #define LSM6DS0_REG6G_ODR_XL_14_9HZ 1
max_mbed 0:30cd7984fb5b 64 #define LSM6DS0_REG6G_ODR_XL_59_5HZ 2
max_mbed 0:30cd7984fb5b 65 #define LSM6DS0_REG6G_ODR_XL_119HZ 3
max_mbed 0:30cd7984fb5b 66 #define LSM6DS0_REG6G_ODR_XL_238HZ 4
max_mbed 0:30cd7984fb5b 67 #define LSM6DS0_REG6G_ODR_XL_476HZ 5
max_mbed 0:30cd7984fb5b 68 #define LSM6DS0_REG6G_ODR_XL_952HZ 6
max_mbed 0:30cd7984fb5b 69
max_mbed 0:30cd7984fb5b 70
max_mbed 0:30cd7984fb5b 71
max_mbed 0:30cd7984fb5b 72 class LSM6DS0 {
max_mbed 0:30cd7984fb5b 73 public:
max_mbed 0:30cd7984fb5b 74 /*CONSTRUCTOR:
max_mbed 0:30cd7984fb5b 75 * Create itself the i2c serial line
max_mbed 0:30cd7984fb5b 76 */
max_mbed 0:30cd7984fb5b 77 LSM6DS0(PinName sda, PinName scl);
max_mbed 0:30cd7984fb5b 78 /*Test connection through the WHO_AM_I register.
max_mbed 0:30cd7984fb5b 79 * return true if the value read correspond to the register
max_mbed 0:30cd7984fb5b 80 */
max_mbed 0:30cd7984fb5b 81 int enableAcceleroInterrupt(void);
max_mbed 0:30cd7984fb5b 82 bool testConnection( void );
max_mbed 0:30cd7984fb5b 83 /*turn on only the Accelerometer with default value:
max_mbed 0:30cd7984fb5b 84 * METTERE I DEFAULT + COMMENTARE!!!!
max_mbed 0:30cd7984fb5b 85 */
max_mbed 0:30cd7984fb5b 86 int turnOnAccelerometer(char Odr, char range, char bw);
max_mbed 0:30cd7984fb5b 87 /* turn on both ACc and gyro with default values:
max_mbed 0:30cd7984fb5b 88 * ODR = 238 Hz, Range = 500dps, BW_filter = 63 Hz
max_mbed 0:30cd7984fb5b 89 * Look at the datasheet to set the new values
max_mbed 0:30cd7984fb5b 90 * Return 0 on success, non 0 otherwise
max_mbed 0:30cd7984fb5b 91 */
max_mbed 0:30cd7984fb5b 92 int turnOnAccGyro(char Odr = 0b100, char range = 0b01, char bw = 0b10);
max_mbed 0:30cd7984fb5b 93 /*
max_mbed 0:30cd7984fb5b 94 * Very slow ODR for testing
max_mbed 0:30cd7984fb5b 95 */
max_mbed 0:30cd7984fb5b 96 int turnOnTestSlow(void);
max_mbed 0:30cd7984fb5b 97 /*
max_mbed 0:30cd7984fb5b 98 * Very fast ODR for testing
max_mbed 0:30cd7984fb5b 99 */
max_mbed 0:30cd7984fb5b 100 int turnOnTestFast(void);
max_mbed 0:30cd7984fb5b 101 /*
max_mbed 0:30cd7984fb5b 102 * Set the i2c comunication frequency in Hz
max_mbed 0:30cd7984fb5b 103 */
max_mbed 0:30cd7984fb5b 104 int setI2CSpeed(int frequency);
max_mbed 0:30cd7984fb5b 105
max_mbed 0:30cd7984fb5b 106 char getAcceleroRange(void);
max_mbed 0:30cd7984fb5b 107 int getAcceleroRaw(int16_t *data);
max_mbed 0:30cd7984fb5b 108 int getAccelero(Vector* v);
max_mbed 0:30cd7984fb5b 109 int getGyroRaw(int16_t * data);
max_mbed 0:30cd7984fb5b 110 int getGyro(Vector* v, bool after_calibration = true);
max_mbed 0:30cd7984fb5b 111 /* Read both accelerometer and gyro in m/s^2 and dps.
max_mbed 0:30cd7984fb5b 112 *The data are stored this way:
max_mbed 0:30cd7984fb5b 113 -acc[0] = Acc_x
max_mbed 0:30cd7984fb5b 114 -acc[1] = Acc_y
max_mbed 0:30cd7984fb5b 115 -acc[2] = Acc_z
max_mbed 0:30cd7984fb5b 116 -gyro[0] = Ang_x
max_mbed 0:30cd7984fb5b 117 -gyro[1] = Ang_y
max_mbed 0:30cd7984fb5b 118 -gyro[2] = Ang_z
max_mbed 0:30cd7984fb5b 119 */
max_mbed 0:30cd7984fb5b 120 int getAccGyro(Vector *acc, Vector *gyro, bool after_gyro_calibration = true);
max_mbed 0:30cd7984fb5b 121 /*i2c serial line writer.
max_mbed 0:30cd7984fb5b 122 * return 0 on success, non 0 otherwise
max_mbed 0:30cd7984fb5b 123 */
max_mbed 0:30cd7984fb5b 124 int write( char address, char data);
max_mbed 0:30cd7984fb5b 125 int read( char adress, char *data);
max_mbed 0:30cd7984fb5b 126 int read( char adress, char *data, int length);
max_mbed 0:30cd7984fb5b 127 int gyroCalibration(int max_iteration);
max_mbed 0:30cd7984fb5b 128 int acceleroCalibration(double *data, int max_iteration);
max_mbed 0:30cd7984fb5b 129
max_mbed 0:30cd7984fb5b 130 private:
max_mbed 0:30cd7984fb5b 131 I2C i2c;
max_mbed 0:30cd7984fb5b 132 char currentAcceleroRange;
max_mbed 0:30cd7984fb5b 133 char currentGyroRange;
max_mbed 0:30cd7984fb5b 134 Vector gyro_offset;
max_mbed 0:30cd7984fb5b 135 };