ICM20602_I2C(invensense)---stm32f767zi

Dependents:   IMU_fusion_9DOF

Fork of NTOUEE-mbed-I2C_MPU6500 by Richard Kuo

Files at this revision

API Documentation at this revision

Comitter:
sarahbest
Date:
Wed Jul 19 07:56:49 2017 +0000
Parent:
1:b8d0e8f53e6c
Commit message:
icm20602 ouput 7 variables: acc 3, gyro 3, temp

Changed in this revision

icm20602_i2c.cpp Show annotated file Show diff for this revision Revisions of this file
icm20602_i2c.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show diff for this revision Revisions of this file
mbed-os.lib Show diff for this revision Revisions of this file
mpu6500.cpp Show diff for this revision Revisions of this file
mpu6500.h Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/icm20602_i2c.cpp	Wed Jul 19 07:56:49 2017 +0000
@@ -0,0 +1,178 @@
+#include "mbed.h"
+#include "icm20602_i2c.h"
+//Serial pc1(USBTX,USBRX); 
+I2C  ICM20602_i2c(D14,D15); // I2C0_SDA, I2C0_SCL
+
+// Acc Full Scale Range  +-2G 4G 8G 16G 
+enum Ascale
+{
+    AFS_2G=0,  
+    AFS_4G,
+    AFS_8G,
+    AFS_16G
+};
+
+// Gyro Full Scale Range +-250 500 1000 2000 Degrees per second
+enum Gscale
+{
+    GFS_250DPS=0,   
+    GFS_500DPS,
+    GFS_1000DPS,
+    GFS_2000DPS
+};
+
+// Scale resolutions per LSB for the sensors
+float aRes, gRes; 
+int Ascale = AFS_2G;
+int Gscale = GFS_1000DPS;
+
+void ICM20602_WriteByte(uint8_t ICM20602_reg, uint8_t ICM20602_data)
+{
+    char data_out[2];
+    data_out[0]=ICM20602_reg;
+    data_out[1]=ICM20602_data;
+    ICM20602_i2c.write(ICM20602_slave_addr, data_out, 2, 0);
+}
+
+uint8_t ICM20602_ReadByte(uint8_t ICM20602_reg)
+{
+    char data_out[1], data_in[1];
+    data_out[0] = ICM20602_reg;
+    ICM20602_i2c.write(ICM20602_slave_addr, data_out, 1, 1);
+    ICM20602_i2c.read(ICM20602_slave_addr, data_in, 1, 0);
+    return (data_in[0]);
+}
+
+// Communication test: WHO_AM_I register reading 
+void ICM20602::whoAmI()
+{
+    uint8_t whoAmI = ICM20602_ReadByte(ICM20602_WHO_AM_I);   // Should return 0x68
+    pc.printf("I AM ICM20602: 0x%x \r\n",whoAmI);
+    
+    if(whoAmI==0x12)//0x68)
+    {
+        pc.printf("ICM20602 is online... \r\n");  
+//        led2=1;
+//        ledToggle(2);
+    }
+    else
+    {
+        pc.printf("Could not connect to ICM20602 \r\nCheck the connections... \r\n");  
+//        toggler1.attach(&toggle_led1,0.1);     // toggles led1 every 100 ms
+    }  
+    
+}
+
+void ICM20602::init()
+{
+    ICM20602_i2c.frequency(400000);    
+    ICM20602_WriteByte(ICM20602_PWR_MGMT_1, 0x00);    // CLK_SEL=0: internal 8MHz, TEMP_DIS=0, SLEEP=0 
+    ICM20602_WriteByte(ICM20602_SMPLRT_DIV, 0x07);  // Gyro output sample rate = Gyro Output Rate/(1+SMPLRT_DIV)
+    ICM20602_WriteByte(ICM20602_CONFIG, 0x01); //176Hz     // set TEMP_OUT_L, DLPF=3 (Fs=1KHz):0x03
+//    ICM20602_WriteByte(ICM20602_GYRO_CONFIG, 0x00); // bit[4:3] 0=+-250d/s,1=+-500d/s,2=+-1000d/s,3=+-2000d/s :0x18
+//    ICM20602_WriteByte(ICM20602_ACCEL_CONFIG, 0x00);// bit[4:3] 0=+-2g,1=+-4g,2=+-8g,3=+-16g, ACC_HPF=On (5Hz):0x01
+    setAccRange(Ascale);
+    setGyroRange(Gscale);
+}
+
+int16_t ICM20602::getAccXvalue()
+{
+    uint8_t LoByte, HiByte;
+    LoByte = ICM20602_ReadByte(ICM20602_ACCEL_XOUT_L); // read Accelerometer X_Low  value
+    HiByte = ICM20602_ReadByte(ICM20602_ACCEL_XOUT_H); // read Accelerometer X_High value
+    return((HiByte<<8) | LoByte);
+//    pc1.printf("accx:%d,%d\r\n",HiByte,LoByte);  // send data to matlab
+}
+
+int16_t ICM20602::getAccYvalue()
+{
+    uint8_t LoByte, HiByte;
+    LoByte = ICM20602_ReadByte(ICM20602_ACCEL_YOUT_L); // read Accelerometer X_Low  value
+    HiByte = ICM20602_ReadByte(ICM20602_ACCEL_YOUT_H); // read Accelerometer X_High value
+    return ((HiByte<<8) | LoByte);
+}
+
+int16_t ICM20602::getAccZvalue()
+{
+    uint8_t LoByte, HiByte;
+    LoByte = ICM20602_ReadByte(ICM20602_ACCEL_ZOUT_L); // read Accelerometer X_Low  value
+    HiByte = ICM20602_ReadByte(ICM20602_ACCEL_ZOUT_H); // read Accelerometer X_High value
+    return ((HiByte<<8) | LoByte);
+}
+
+int16_t ICM20602::getGyrXvalue()
+{
+    uint8_t LoByte, HiByte;
+    LoByte = ICM20602_ReadByte(ICM20602_GYRO_XOUT_L); // read Accelerometer X_Low  value
+    HiByte = ICM20602_ReadByte(ICM20602_GYRO_XOUT_H); // read Accelerometer X_High value
+    return ((HiByte<<8) | LoByte);
+}
+
+int16_t ICM20602::getGyrYvalue()
+{
+    uint8_t LoByte, HiByte;
+    LoByte = ICM20602_ReadByte(ICM20602_GYRO_YOUT_L); // read Accelerometer X_Low  value
+    HiByte = ICM20602_ReadByte(ICM20602_GYRO_YOUT_H); // read Accelerometer X_High value
+    return ((HiByte<<8) | LoByte);
+}
+
+int16_t ICM20602::getGyrZvalue()
+{
+    uint8_t LoByte, HiByte;
+    LoByte = ICM20602_ReadByte(ICM20602_GYRO_ZOUT_L); // read Accelerometer X_Low  value
+    HiByte = ICM20602_ReadByte(ICM20602_GYRO_ZOUT_H); // read Accelerometer X_High value
+    return ((HiByte<<8) | LoByte);
+}
+
+int16_t ICM20602::getIMUTemp()
+{
+    uint8_t LoByte, HiByte;
+    LoByte = ICM20602_ReadByte(ICM20602_TEMP_OUT_L); // read Accelerometer X_Low  value
+    HiByte = ICM20602_ReadByte(ICM20602_TEMP_OUT_H); // read Accelerometer X_High value
+    return ((HiByte<<8) | LoByte);
+}
+
+
+// Calculates Acc resolution
+float ICM20602::setAccRange(int Ascale)
+{
+    switch(Ascale)
+    {
+        case AFS_2G:
+            aRes = 2.0/32768.0;
+            break;
+        case AFS_4G:
+            aRes = 4.0/32768.0;
+            break;
+        case AFS_8G:
+            aRes = 8.0/32768.0;
+            break;
+        case AFS_16G:
+            aRes = 16.0/32768.0;
+            break;         
+    }
+    ICM20602_WriteByte(ICM20602_ACCEL_CONFIG, Ascale<<3);// bit[4:3] 0=+-2g,1=+-4g,2=+-8g,3=+-16g, ACC_HPF=On (5Hz)
+    return aRes;
+}
+
+// Calculates Gyro resolution
+float ICM20602::setGyroRange(int Gscale)
+{
+    switch(Gscale)
+    {
+        case GFS_250DPS:
+            gRes = 250.0/32768.0;
+            break;
+        case GFS_500DPS:
+            gRes = 500.0/32768.0;
+            break;
+        case GFS_1000DPS:
+            gRes = 1000.0/32768.0;
+            break;
+        case GFS_2000DPS:
+            gRes = 2000.0/32768.0;
+            break;
+    }
+    ICM20602_WriteByte(ICM20602_GYRO_CONFIG, Gscale<<3); // bit[4:3] 0=+-250d/s,1=+-500d/s,2=+-1000d/s,3=+-2000d/s
+    return gRes;
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/icm20602_i2c.h	Wed Jul 19 07:56:49 2017 +0000
@@ -0,0 +1,131 @@
+#define ICM20602_SELF_TEST_X_ACCEL  0x0D
+#define ICM20602_SELF_TEST_Y_ACCEL  0x0E    
+#define ICM20602_SELF_TEST_Z_ACCEL  0x0F
+//#define SELF_TEST_A      0x10
+#define ICM20602_XG_OFFS_USRH     0x13  // User-defined trim values for gyroscope; supported in MPU-6050?
+#define ICM20602_XG_OFFS_USRL     0x14
+#define ICM20602_YG_OFFS_USRH     0x15
+#define ICM20602_YG_OFFS_USRL     0x16
+#define ICM20602_ZG_OFFS_USRH     0x17
+#define ICM20602_ZG_OFFS_USRL     0x18
+#define ICM20602_SMPLRT_DIV       0x19
+#define ICM20602_CONFIG           0x1A
+#define ICM20602_GYRO_CONFIG      0x1B
+#define ICM20602_ACCEL_CONFIG     0x1C
+#define ICM20602_ACCEL_CONFIG2    0x1D  // Free-fall
+#define ICM20602_LP_MODE_CFG      0x1E  // Free-fall
+#define ICM20602_ACCEL_WOM_THR    0x1F  // Motion detection threshold bits [7:0]
+//#define MOT_DUR          0x20  // Duration counter threshold for motion interrupt generation, 1 kHz rate, LSB = 1 ms
+//#define ZMOT_THR         0x21  // Zero-motion detection threshold bits [7:0]
+//#define ZRMOT_DUR        0x22  // Duration counter threshold for zero motion interrupt generation, 16 Hz rate, LSB = 64 ms
+#define ICM20602_FIFO_EN          0x23
+//#define I2C_MST_CTRL     0x24   
+//#define I2C_SLV0_ADDR    0x25
+//#define I2C_SLV0_REG     0x26
+//#define I2C_SLV0_CTRL    0x27
+//#define I2C_SLV1_ADDR    0x28
+//#define I2C_SLV1_REG     0x29
+//#define I2C_SLV1_CTRL    0x2A
+//#define I2C_SLV2_ADDR    0x2B
+//#define I2C_SLV2_REG     0x2C
+//#define I2C_SLV2_CTRL    0x2D
+//#define I2C_SLV3_ADDR    0x2E
+//#define I2C_SLV3_REG     0x2F
+//#define I2C_SLV3_CTRL    0x30
+//#define I2C_SLV4_ADDR    0x31
+//#define I2C_SLV4_REG     0x32
+//#define I2C_SLV4_DO      0x33
+//#define I2C_SLV4_CTRL    0x34
+//#define I2C_SLV4_DI      0x35
+#define ICM20602_FSYNC_INT        0x36
+#define ICM20602_INT_PIN_CFG      0x37
+#define ICM20602_INT_ENABLE       0x38
+//#define DMP_INT_STATUS   0x39  // Check DMP interrupt
+#define ICM20602_INT_STATUS       0x3A
+#define ICM20602_ACCEL_XOUT_H     0x3B
+#define ICM20602_ACCEL_XOUT_L     0x3C
+#define ICM20602_ACCEL_YOUT_H     0x3D
+#define ICM20602_ACCEL_YOUT_L     0x3E
+#define ICM20602_ACCEL_ZOUT_H     0x3F
+#define ICM20602_ACCEL_ZOUT_L     0x40
+#define ICM20602_TEMP_OUT_H       0x41
+#define ICM20602_TEMP_OUT_L       0x42
+#define ICM20602_GYRO_XOUT_H      0x43
+#define ICM20602_GYRO_XOUT_L      0x44
+#define ICM20602_GYRO_YOUT_H      0x45
+#define ICM20602_GYRO_YOUT_L      0x46
+#define ICM20602_GYRO_ZOUT_H      0x47
+#define ICM20602_GYRO_ZOUT_L      0x48
+//#define EXT_SENS_DATA_00 0x49
+//#define EXT_SENS_DATA_01 0x4A
+//#define EXT_SENS_DATA_02 0x4B
+//#define EXT_SENS_DATA_03 0x4C
+//#define EXT_SENS_DATA_04 0x4D
+//#define EXT_SENS_DATA_05 0x4E
+//#define EXT_SENS_DATA_06 0x4F
+#define ICM20602_SELF_TEST_X_GYRO 0x50
+#define ICM20602_SELF_TEST_y_GYRO 0x51
+#define ICM20602_SELF_TEST_z_GYRO 0x52
+//#define EXT_SENS_DATA_10 0x53
+//#define EXT_SENS_DATA_11 0x54
+//#define EXT_SENS_DATA_12 0x55
+//#define EXT_SENS_DATA_13 0x56
+//#define EXT_SENS_DATA_14 0x57
+//#define EXT_SENS_DATA_15 0x58
+//#define EXT_SENS_DATA_16 0x59
+//#define EXT_SENS_DATA_17 0x5A
+//#define EXT_SENS_DATA_18 0x5B
+//#define EXT_SENS_DATA_19 0x5C
+//#define EXT_SENS_DATA_20 0x5D
+//#define EXT_SENS_DATA_21 0x5E
+//#define EXT_SENS_DATA_22 0x5F
+//#define EXT_SENS_DATA_23 0x60
+//#define MOT_DETECT_STATUS 0x61
+//#define I2C_SLV0_DO      0x63
+//#define I2C_SLV1_DO      0x64
+//#define I2C_SLV2_DO      0x65
+//#define I2C_SLV3_DO      0x66
+//#define I2C_MST_DELAY_CTRL 0x67
+#define ICM20602_SIGNAL_PATH_RESET  0x68
+#define ICM20602_ACCEL_INTEL_CTRL   0x69
+#define ICM20602_USER_CTRL        0x6A  // Bit 7 enable DMP, bit 3 reset DMP
+#define ICM20602_PWR_MGMT_1       0x6B  // Device defaults to the SLEEP mode
+#define ICM20602_PWR_MGMT_2       0x6C
+//#define DMP_BANK         0x6D  // Activates a specific bank in the DMP
+//#define DMP_RW_PNT       0x6E  // Set read/write pointer to a specific start address in specified DMP bank
+//#define DMP_REG          0x6F  // Register in DMP from which to read or to which to write
+//#define DMP_REG_1        0x70
+//#define DMP_REG_2        0x71
+#define ICM20602_FIFO_COUNTH      0x72
+#define ICM20602_FIFO_COUNTL      0x73
+#define ICM20602_FIFO_R_W         0x74
+#define ICM20602_WHO_AM_I         0x75 // Should return 0x68
+
+// Using the GY-521 breakout board, I set ADO to 0 by grounding through a 4k7 resistor
+// Seven-bit device address is 110100 for ADO = 0 and 110101 for ADO = 1
+#define ADO 0
+#if ADO
+#define ICM20602_slave_addr 0x69<<1  // Device address when ADO = 1
+#else
+#define ICM20602_slave_addr 0x68<<1  // Device address when ADO = 0
+#endif
+
+#define IMU_ONE_G 9.80665
+//#define ICM20602_slave_addr          0xD0
+extern float aRes, gRes; 
+extern Serial pc;
+
+class ICM20602 {
+    public:
+        void    whoAmI();
+        void    init();
+        int16_t getAccXvalue();
+        int16_t getAccYvalue();
+        int16_t getAccZvalue();
+        int16_t getGyrXvalue();
+        int16_t getGyrYvalue();
+        int16_t getGyrZvalue();
+        int16_t getIMUTemp();
+        float   setAccRange(int Ascale);
+        float   setGyroRange(int Gscale);
+};
\ No newline at end of file
--- a/main.cpp	Wed Oct 26 03:08:46 2016 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,26 +0,0 @@
-/// using NuMaker-PFM-NUC472 I2C0 to read 3-axis accelerometer & 3-axis gyroscope (MPU6500)
-#include "mbed.h"
-#include "mpu6500.h"
-
-I2C i2c0(PC_9, PA_15); // I2C0_SDA, I2C0_SCL
-
-MPU6500 IMU; // on-board IMU is MPU6500
-
-int main() {
-    int16_t accX,  accY,  accZ;
-    int16_t gyroX, gyroY, gyroZ;
-
-    i2c0.frequency(400000);    
-    IMU.initialize();
-    
-    while(true) {
-       accX = IMU.getAccelXvalue();
-       accY = IMU.getAccelYvalue();
-       accZ = IMU.getAccelZvalue();
-       gyroX= IMU.getGyroXvalue();
-       gyroY= IMU.getGyroYvalue();
-       gyroZ= IMU.getGyroZvalue();
-       printf("Acc: %6d, %6d, %6d, ",   accX, accY, accZ);
-       printf("Gyro:%6d, %6d, %6d\n\r", gyroX, gyroY, gyroZ);       
-    }
-}
--- a/mbed-os.lib	Wed Oct 26 03:08:46 2016 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-https://github.com/ARMmbed/mbed-os/#e435a07d9252f133ea3d9f6c95dfb176f32ab9b6
--- a/mpu6500.cpp	Wed Oct 26 03:08:46 2016 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,78 +0,0 @@
-#include "mbed.h"
-#include "mpu6500.h"
-
-I2C  mpu6500_i2c(PC_9, PA_15); // I2C0_SDA, I2C0_SCL
-
-void MPU6500_WriteByte(uint8_t MPU6500_reg, uint8_t MPU6500_data)
-{
-    char data_out[2];
-    data_out[0]=MPU6500_reg;
-    data_out[1]=MPU6500_data;
-    mpu6500_i2c.write(MPU6500_slave_addr, data_out, 2, 0);
-}
-
-uint8_t MPU6500_ReadByte(uint8_t MPU6500_reg)
-{
-    char data_out[1], data_in[1];
-    data_out[0] = MPU6500_reg;
-    mpu6500_i2c.write(MPU6500_slave_addr, data_out, 1, 1);
-    mpu6500_i2c.read(MPU6500_slave_addr, data_in, 1, 0);
-    return (data_in[0]);
-}
-
-void MPU6500::initialize()
-{
-    MPU6500_WriteByte(MPU6500_PWR_MGMT_1, 0x00);    // CLK_SEL=0: internal 8MHz, TEMP_DIS=0, SLEEP=0 
-    MPU6500_WriteByte(MPU6500_SMPLRT_DIV, 0x07);  // Gyro output sample rate = Gyro Output Rate/(1+SMPLRT_DIV)
-    MPU6500_WriteByte(MPU6500_CONFIG, 0x06);      // set TEMP_OUT_L, DLPF=2 (Fs=1KHz)
-    MPU6500_WriteByte(MPU6500_GYRO_CONFIG, 0x18); // bit[4:3] 0=+-250d/s,1=+-500d/s,2=+-1000d/s,3=+-2000d/s
-    MPU6500_WriteByte(MPU6500_ACCEL_CONFIG, 0x01);// bit[4:3] 0=+-2g,1=+-4g,2=+-8g,3=+-16g, ACC_HPF=On (5Hz)
-}
-
-int16_t MPU6500::getAccelXvalue()
-{
-    uint8_t LoByte, HiByte;
-    LoByte = MPU6500_ReadByte(MPU6500_ACCEL_XOUT_L); // read Accelerometer X_Low  value
-    HiByte = MPU6500_ReadByte(MPU6500_ACCEL_XOUT_H); // read Accelerometer X_High value
-    return((HiByte<<8) | LoByte);
-}
-
-int16_t MPU6500::getAccelYvalue()
-{
-    uint8_t LoByte, HiByte;
-    LoByte = MPU6500_ReadByte(MPU6500_ACCEL_YOUT_L); // read Accelerometer X_Low  value
-    HiByte = MPU6500_ReadByte(MPU6500_ACCEL_YOUT_H); // read Accelerometer X_High value
-    return ((HiByte<<8) | LoByte);
-}
-
-int16_t MPU6500::getAccelZvalue()
-{
-    uint8_t LoByte, HiByte;
-    LoByte = MPU6500_ReadByte(MPU6500_ACCEL_ZOUT_L); // read Accelerometer X_Low  value
-    HiByte = MPU6500_ReadByte(MPU6500_ACCEL_ZOUT_H); // read Accelerometer X_High value
-    return ((HiByte<<8) | LoByte);
-}
-
-int16_t MPU6500::getGyroXvalue()
-{
-    uint8_t LoByte, HiByte;
-    LoByte = MPU6500_ReadByte(MPU6500_GYRO_XOUT_L); // read Accelerometer X_Low  value
-    HiByte = MPU6500_ReadByte(MPU6500_GYRO_XOUT_H); // read Accelerometer X_High value
-    return ((HiByte<<8) | LoByte);
-}
-
-int16_t MPU6500::getGyroYvalue()
-{
-    uint8_t LoByte, HiByte;
-    LoByte = MPU6500_ReadByte(MPU6500_GYRO_YOUT_L); // read Accelerometer X_Low  value
-    HiByte = MPU6500_ReadByte(MPU6500_GYRO_YOUT_H); // read Accelerometer X_High value
-    return ((HiByte<<8) | LoByte);
-}
-
-int16_t MPU6500::getGyroZvalue()
-{
-    uint8_t LoByte, HiByte;
-    LoByte = MPU6500_ReadByte(MPU6500_GYRO_ZOUT_L); // read Accelerometer X_Low  value
-    HiByte = MPU6500_ReadByte(MPU6500_GYRO_ZOUT_H); // read Accelerometer X_High value
-    return ((HiByte<<8) | LoByte);
-}
--- a/mpu6500.h	Wed Oct 26 03:08:46 2016 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,113 +0,0 @@
-#define MPU6500_SELF_TEST_X_GYRO    0x00 
-#define MPU6500_SELF_TEST_Y_GYRO    0x01
-#define MPU6500_SELF_TEST_Z_GYRO    0x02
-#define MPU6500_SELF_TEST_X_ACCEL   0x0D
-#define MPU6500_SELF_TEST_Y_ACCEL   0x0E
-#define MPU6500_SELF_TEST_Z_ACCEL   0x0F
-#define MPU6500_XG_OFFSET_H         0x13
-#define MPU6500_XG_OFFSET_L         0x14
-#define MPU6500_YG_OFFSET_H         0x15
-#define MPU6500_YG_OFFSET_L         0x16
-#define MPU6500_ZG_OFFSET_H         0x17
-#define MPU6500_ZG_OFFSET_L         0x18
-#define MPU6500_SMPLRT_DIV          0x19
-#define MPU6500_CONFIG              0x1A
-#define MPU6500_GYRO_CONFIG         0x1B
-#define MPU6500_ACCEL_CONFIG        0x1C
-#define MPU6500_ACCEL_CONFIG2       0x1D
-#define MPU6500_LP_ACCEL_ODR        0x1E
-#define MPU6500_WOM_THR             0x1F
-#define MPU6500_FIFO_EN             0x23
-#define MPU6500_I2C_MST_CTRL        0x24
-#define MPU6500_I2C_SLV0_ADDR       0x25
-#define MPU6500_I2C_SLV0_REG        0x26
-#define MPU6500_I2C_SLV0_CTRL       0x27
-#define MPU6500_I2C_SLV1_ADDR       0x28
-#define MPU6500_I2C_SLV1_REG        0x29
-#define MPU6500_I2C_SLV1_CTRL       0x2A
-#define MPU6500_I2C_SLV2_ADDR       0x2B
-#define MPU6500_I2C_SLV2_REG        0x2C
-#define MPU6500_I2C_SLV2_CTRL       0x2D
-#define MPU6500_I2C_SLV3_ADDR       0x2E
-#define MPU6500_I2C_SLV3_REG        0x2F
-#define MPU6500_I2C_SLV3_CTRL       0x30
-#define MPU6500_I2C_SLV4_ADDR       0x31
-#define MPU6500_I2C_SLV4_REG        0x32
-#define MPU6500_I2C_SLV4_DO         0x33
-#define MPU6500_I2C_SLV4_CTRL       0x34
-#define MPU6500_I2C_SLV4_DI         0x35
-#define MPU6500_I2C_MST_STATUS      0x36
-#define MPU6500_INT_PIN_CFG         0x37
-#define MPU6500_INT_ENABLE          0x38
-#define MPU6500_INT_STATUS          0x3A
-#define MPU6500_ACCEL_XOUT_H        0x3B
-#define MPU6500_ACCEL_XOUT_L        0x3C
-#define MPU6500_ACCEL_YOUT_H        0x3D
-#define MPU6500_ACCEL_YOUT_L        0x3E
-#define MPU6500_ACCEL_ZOUT_H        0x3F
-#define MPU6500_ACCEL_ZOUT_L        0x40
-#define MPU6500_TEMP_OUT_H          0x41
-#define MPU6500_TEMP_OUT_L          0x42
-#define MPU6500_GYRO_XOUT_H         0x43
-#define MPU6500_GYRO_XOUT_L         0x44
-#define MPU6500_GYRO_YOUT_H         0x45
-#define MPU6500_GYRO_YOUT_L         0x46
-#define MPU6500_GYRO_ZOUT_H         0x47
-#define MPU6500_GYRO_ZOUT_L         0x48
-#define MPU6500_EXT_SENS_DATA_00    0x49
-#define MPU6500_EXT_SENS_DATA_01    0x4A
-#define MPU6500_EXT_SENS_DATA_02    0x4B
-#define MPU6500_EXT_SENS_DATA_03    0x4C
-#define MPU6500_EXT_SENS_DATA_04    0x4D
-#define MPU6500_EXT_SENS_DATA_05    0x4E
-#define MPU6500_EXT_SENS_DATA_06    0x4F
-#define MPU6500_EXT_SENS_DATA_07    0x50
-#define MPU6500_EXT_SENS_DATA_08    0x51
-#define MPU6500_EXT_SENS_DATA_09    0x52
-#define MPU6500_EXT_SENS_DATA_10    0x53
-#define MPU6500_EXT_SENS_DATA_11    0x54
-#define MPU6500_EXT_SENS_DATA_12    0x55
-#define MPU6500_EXT_SENS_DATA_13    0x56
-#define MPU6500_EXT_SENS_DATA_14    0x57
-#define MPU6500_EXT_SENS_DATA_15    0x58
-#define MPU6500_EXT_SENS_DATA_16    0x59
-#define MPU6500_EXT_SENS_DATA_17    0x5A
-#define MPU6500_EXT_SENS_DATA_18    0x5B
-#define MPU6500_EXT_SENS_DATA_19    0x5C
-#define MPU6500_EXT_SENS_DATA_20    0x5D
-#define MPU6500_EXT_SENS_DATA_21    0x5E
-#define MPU6500_EXT_SENS_DATA_22    0x5F
-#define MPU6500_EXT_SENS_DATA_23    0x60
-#define MPU6500_I2C_SLV0_DO         0x63
-#define MPU6500_I2C_SLV1_DO         0x64
-#define MPU6500_I2C_SLV2_DO         0x65
-#define MPU6500_I2C_SLV3_DO         0x66
-#define MPU6500_I2C_MST_DELAY_CTRL  0x67
-#define MPU6500_SIGNAL_PATH_RESET   0x68
-#define MPU6500_ACCEL_INTEL_CTRL    0x69
-#define MPU6500_USER_CTRL           0x6A
-#define MPU6500_PWR_MGMT_1          0x6B
-#define MPU6500_PWR_MGMT_2          0x6C
-#define MPU6500_FIFO_COUNT_H        0x72
-#define MPU6500_FIFO_COUNT_L        0x73
-#define MPU6500_FIFO_R_W            0x74
-#define MPU6500_WHO_AM_I            0x75
-#define MPU6500_XA_OFFSET_H         0x77
-#define MPU6500_XA_OFFSET_L         0x78
-#define MPU6500_YA_OFFSET_H         0x79
-#define MPU6500_YA_OFFSET_L         0x7A
-#define MPU6500_ZA_OFFSET_H         0x7D
-#define MPU6500_ZA_OFFSET_L         0x7E
-
-#define MPU6500_slave_addr          0xD0
-
-class MPU6500 {
-    public:
-        void    initialize();
-        int16_t getAccelXvalue();
-        int16_t getAccelYvalue();
-        int16_t getAccelZvalue();
-        int16_t getGyroXvalue();
-        int16_t getGyroYvalue();
-        int16_t getGyroZvalue();
-};
\ No newline at end of file