Leander Brandl / KeplerBRAIN_V4

Files at this revision

API Documentation at this revision

Comitter:
lbrandl
Date:
Fri Jan 27 13:08:03 2017 +0000
Parent:
4:dfd8d0b5b997
Commit message:
KeplerBRAIN_V4

Changed in this revision

KeplerBRAIN_V4.h Show annotated file Show diff for this revision Revisions of this file
--- a/KeplerBRAIN_V4.h	Tue Nov 15 10:05:50 2016 +0000
+++ b/KeplerBRAIN_V4.h	Fri Jan 27 13:08:03 2017 +0000
@@ -605,6 +605,173 @@
   return wert;
 }
 
+
+// *** I2C BNO055 ***
+
+#define BNO055_ADDR      (0x28 << 1) 
+#define BNO055_CHIP_ID          0x00
+#define BNO055_CHIP_ID_VALUE    0xa0   
+#define BNO055_AXIS_MAP_CONFIG  0x41
+#define BNO055_OPR_MODE         0x3d
+#define CONFIGMODE              0x00
+#define MODE_NDOF               0x0c 
+#define ACCEL_OFFSET_X_LSB      0x55
+#define ACCEL_OFFSET_X_MSB      0x56
+#define ACCEL_OFFSET_Y_LSB      0x57
+#define ACCEL_OFFSET_Y_MSB      0x58
+#define ACCEL_OFFSET_Z_LSB      0x59
+#define ACCEL_OFFSET_Z_MSB      0x5a
+#define MAG_OFFSET_X_LSB        0x5b
+#define MAG_OFFSET_X_MSB        0x5c
+#define MAG_OFFSET_Y_LSB        0x5d
+#define MAG_OFFSET_Y_MSB        0x5e
+#define MAG_OFFSET_Z_LSB        0x5f
+#define MAG_OFFSET_Z_MSB        0x60
+#define GYRO_OFFSET_X_LSB       0x61
+#define GYRO_OFFSET_X_MSB       0x62
+#define GYRO_OFFSET_Y_LSB       0x63
+#define GYRO_OFFSET_Y_MSB       0x64
+#define GYRO_OFFSET_Z_LSB       0x65
+#define GYRO_OFFSET_Z_MSB       0x66
+#define ACCEL_RADIUS_LSB        0x67
+#define ACCEL_RADIUS_MSB        0x68
+#define MAG_RADIUS_LSB          0x69
+#define MAG_RADIUS_MSB          0x6a
+#define BNO055_EULER_H_LSB      0x1a
+#define BNO055_EULER_H_MSB      0x1b
+#define BNO055_EULER_R_LSB      0x1c
+#define BNO055_EULER_R_MSB      0x1d
+#define BNO055_EULER_P_LSB      0x1e
+#define BNO055_EULER_P_MSB      0x1f
+
+void SET_I2C_BNO055()
+{
+  char data[7];
+  char chip_id;
+    
+  char accel_offset_x_lsb_value = 8; 
+  char accel_offset_x_msb_value = 0;
+  char accel_offset_y_lsb_value = 34;
+  char accel_offset_y_msb_value = 0;
+  char accel_offset_z_lsb_value = 7;
+  char accel_offset_z_msb_value = 0;
+
+  char mag_offset_x_lsb_value = 45;
+  char mag_offset_x_msb_value = 255;
+  char mag_offset_y_lsb_value = 116;
+  char mag_offset_y_msb_value = 0;
+  char mag_offset_z_lsb_value = 90;
+  char mag_offset_z_msb_value = 1;
+
+  char gyro_offset_x_lsb_value = 1;
+  char gyro_offset_x_msb_value = 0;
+  char gyro_offset_y_lsb_value = 1;
+  char gyro_offset_y_msb_value = 0;
+  char gyro_offset_z_lsb_value = 0;
+  char gyro_offset_z_msb_value = 0;
+
+  char accel_radius_lsb_value = 0; 
+  char accel_radius_msb_value = 3;
+  char mag_radius_lsb_value = 66;
+  char mag_radius_msb_value = 2;
+    
+  data[0] = BNO055_CHIP_ID;
+  i2c.write(BNO055_ADDR, data, 1, true);
+  i2c.read(BNO055_ADDR, data, 7, false);
+  chip_id = data[0];
+  
+  while (chip_id != BNO055_CHIP_ID_VALUE)
+  {
+    data[0] = BNO055_CHIP_ID;
+    i2c.write(BNO055_ADDR, data, 1, true);
+    i2c.read(BNO055_ADDR, data, 7, false);
+    chip_id = data[0];
+  }
+  
+  data[0] = BNO055_OPR_MODE;
+  data[1] = CONFIGMODE;
+  i2c.write(BNO055_ADDR, data, 2);
+  wait_ms(50);
+  
+  data[0] = BNO055_AXIS_MAP_CONFIG; 
+  data[1] = 0x24; 
+  data[2] = 0x00;
+  i2c.write(BNO055_ADDR, data, 2);
+    
+  data[0] = ACCEL_OFFSET_X_LSB; data[1] = accel_offset_x_lsb_value; i2c.write(BNO055_ADDR, data, 2); wait_ms(20);
+  data[0] = ACCEL_OFFSET_X_MSB; data[1] = accel_offset_x_msb_value; i2c.write(BNO055_ADDR, data, 2); wait_ms(20);
+  data[0] = ACCEL_OFFSET_Y_LSB; data[1] = accel_offset_y_lsb_value; i2c.write(BNO055_ADDR, data, 2); wait_ms(20);
+  data[0] = ACCEL_OFFSET_Y_LSB; data[1] = accel_offset_y_msb_value; i2c.write(BNO055_ADDR, data, 2); wait_ms(20);
+  data[0] = ACCEL_OFFSET_Z_LSB; data[1] = accel_offset_z_lsb_value; i2c.write(BNO055_ADDR, data, 2); wait_ms(20);
+  data[0] = ACCEL_OFFSET_Z_LSB; data[1] = accel_offset_z_msb_value; i2c.write(BNO055_ADDR, data, 2); wait_ms(20);
+   
+  data[0] = MAG_OFFSET_X_LSB; data[1] = mag_offset_x_lsb_value; i2c.write(BNO055_ADDR, data, 2); wait_ms(20);
+  data[0] = MAG_OFFSET_X_MSB; data[1] = mag_offset_x_msb_value; i2c.write(BNO055_ADDR, data, 2); wait_ms(20);
+  data[0] = MAG_OFFSET_Y_LSB; data[1] = mag_offset_y_lsb_value; i2c.write(BNO055_ADDR, data, 2); wait_ms(20);
+  data[0] = MAG_OFFSET_Y_LSB; data[1] = mag_offset_y_msb_value; i2c.write(BNO055_ADDR, data, 2); wait_ms(20);
+  data[0] = MAG_OFFSET_Z_LSB; data[1] = mag_offset_z_lsb_value; i2c.write(BNO055_ADDR, data, 2); wait_ms(20);
+  data[0] = MAG_OFFSET_Z_LSB; data[1] = mag_offset_z_msb_value; i2c.write(BNO055_ADDR, data, 2); wait_ms(20);
+   
+  data[0] = GYRO_OFFSET_X_LSB; data[1] = gyro_offset_x_lsb_value; i2c.write(BNO055_ADDR, data, 2); wait_ms(20);
+  data[0] = GYRO_OFFSET_X_MSB; data[1] = gyro_offset_x_msb_value; i2c.write(BNO055_ADDR, data, 2); wait_ms(20);
+  data[0] = GYRO_OFFSET_Y_LSB; data[1] = gyro_offset_y_lsb_value; i2c.write(BNO055_ADDR, data, 2); wait_ms(20);
+  data[0] = GYRO_OFFSET_Y_LSB; data[1] = gyro_offset_y_msb_value; i2c.write(BNO055_ADDR, data, 2); wait_ms(20);
+  data[0] = GYRO_OFFSET_Z_LSB; data[1] = gyro_offset_z_lsb_value; i2c.write(BNO055_ADDR, data, 2); wait_ms(20);
+  data[0] = GYRO_OFFSET_Z_LSB; data[1] = gyro_offset_z_msb_value; i2c.write(BNO055_ADDR, data, 2); wait_ms(20);
+   
+  data[0] = ACCEL_RADIUS_LSB; data[1] = accel_radius_lsb_value; i2c.write(BNO055_ADDR, data, 2); wait_ms(20);
+  data[0] = ACCEL_RADIUS_MSB; data[1] = accel_radius_msb_value; i2c.write(BNO055_ADDR, data, 2); wait_ms(20);
+  data[0] = MAG_RADIUS_LSB; data[1] = mag_radius_lsb_value; i2c.write(BNO055_ADDR, data, 2); wait_ms(20);
+  data[0] = MAG_RADIUS_MSB; data[1] = mag_radius_msb_value; i2c.write(BNO055_ADDR, data, 2); wait_ms(20);
+   
+  data[0] = BNO055_OPR_MODE;
+  data[1] = MODE_NDOF;
+  i2c.write(BNO055_ADDR, data, 2);
+  wait_ms(10);
+}
+
+int READ_I2C_BNO055_YAW()
+{ 
+  int16_t wert;
+  char data[3];
+  
+  data[0] = BNO055_EULER_H_LSB;
+  i2c.write(BNO055_ADDR, data, 1, true);
+  i2c.read(BNO055_ADDR, data, 2, false);
+  
+  wert = data[1] << 8 | data[0];
+  wert = (double)wert/16;
+  return wert;
+}
+
+int READ_I2C_BNO055_PITCH()
+{ 
+  int16_t wert;
+  char data[3];
+  
+  data[0] = BNO055_EULER_P_LSB;
+  i2c.write(BNO055_ADDR, data, 1, true);
+  i2c.read(BNO055_ADDR, data, 2, false);
+  
+  wert = data[1] << 8 | data[0];
+  wert = (double)wert/16;
+  return wert;
+}
+
+int READ_I2C_BNO055_ROLL()
+{ 
+  int16_t wert;
+  char data[3];
+  
+  data[0] = BNO055_EULER_R_LSB;
+  i2c.write(BNO055_ADDR, data, 1, true);
+  i2c.read(BNO055_ADDR, data, 2, false);
+  
+  wert = data[1] << 8 | data[0];
+  wert = (double)wert/16;
+  return wert;
+}
+
 // *** SPI ***
 
 // PA_6 SPI MISO