Port of http://dev.qu.tu-berlin.de/projects/sf-razor-9dof-ahrs to an mbed, tested with a 9DOF Sensor Stick, SEN-10724

Dependencies:   mbed

Revision:
1:e27c4c0b71d8
Parent:
0:9a72d42c0da3
--- a/Sensors.cpp	Tue Dec 27 17:20:06 2011 +0000
+++ b/Sensors.cpp	Wed Dec 28 17:13:14 2011 +0000
@@ -6,161 +6,147 @@
 // Sensor I2C addresses
 #define ACCEL_READ  0xA7
 #define ACCEL_WRITE 0xA6
-#define MAGN_WRITE  0x3C 
-#define MAGN_READ   0x3D 
+#define MAGN_WRITE  0x3C
+#define MAGN_READ   0x3D
 #define GYRO_WRITE  0xD0
 #define GYRO_READ   0xD1
 
-void IMU::I2C_Init()
-{
-  Wire.frequency(100000);
+void IMU::I2C_Init() {
+    Wire.frequency(100000);
 }
 
-void IMU::Accel_Init()
-{
-  char tx[2];
-  tx[0] = 0x2D; // Power register
-  tx[1] = 0x08; // Power register
-  Wire.write(ACCEL_WRITE, tx, 2);
-  wait_ms(5);
-  tx[0] = 0x31; // Data format register
-  tx[1] = 0x08; // Set to full resolution
-  Wire.write(ACCEL_WRITE, tx, 2);
-  wait_ms(5);
-  
-  // Because our main loop runs at 50Hz we adjust the output data rate to 50Hz (25Hz bandwidth)
-  tx[0] = 0x2C;  // Rate
-  tx[1] = 0x09;  // Set to 50Hz, normal operation
-  Wire.write(ACCEL_WRITE, tx, 2);
-  wait_ms(5);
+void IMU::Accel_Init() {
+    char tx[2];
+
+    tx[0] = 0x2D; // Power register
+    tx[1] = 0x08; // Power register
+    Wire.write(ACCEL_WRITE, tx, 2);
+    wait_ms(5);
+
+    tx[0] = 0x31; // Data format register
+    tx[1] = 0x08; // Set to full resolution
+    Wire.write(ACCEL_WRITE, tx, 2);
+    wait_ms(5);
+
+    // Because our main loop runs at 50Hz we adjust the output data rate to 50Hz (25Hz bandwidth)
+    tx[0] = 0x2C;  // Rate
+    tx[1] = 0x09;  // Set to 50Hz, normal operation
+    Wire.write(ACCEL_WRITE, tx, 2);
+    wait_ms(5);
 }
 
 // Reads x, y and z accelerometer registers
-void IMU::Read_Accel()
-{
-  char buff[6];
-  char tx = 0x32;  // Send address to read from
- 
-  Wire.write(ACCEL_WRITE, &tx, 1);
-  
-  if (Wire.read(ACCEL_READ, buff, 6) == 0) // All bytes received?
-  {
-    // No multiply by -1 for coordinate system transformation here, because of double negation:
-    // We want the gravity vector, which is negated acceleration vector.
-    accel[0] = (int)buff[3] << 8 | (int)buff[2]; // X axis (internal sensor y axis)
-    accel[1] = (int)buff[1] << 8 | (int)buff[0]; // Y axis (internal sensor x axis)
-    accel[2] = (int)buff[5] << 8 | (int)buff[4]; // Z axis (internal sensor z axis)
-  }
-  else
-  {
-    num_accel_errors++;
-    if (output_errors) pc.printf("!ERR: reading accelerometer" NEW_LINE);
-  }
+void IMU::Read_Accel() {
+    char buff[6];
+    char tx = 0x32;  // Send address to read from
+
+    Wire.write(ACCEL_WRITE, &tx, 1);
+
+    if (Wire.read(ACCEL_READ, buff, 6) == 0) { // All bytes received?
+        // No multiply by -1 for coordinate system transformation here, because of double negation:
+        // We want the gravity vector, which is negated acceleration vector.
+        accel[0] = (int)buff[3] << 8 | (int)buff[2]; // X axis (internal sensor y axis)
+        accel[1] = (int)buff[1] << 8 | (int)buff[0]; // Y axis (internal sensor x axis)
+        accel[2] = (int)buff[5] << 8 | (int)buff[4]; // Z axis (internal sensor z axis)
+    } else {
+        num_accel_errors++;
+        if (output_errors) pc.printf("!ERR: reading accelerometer" NEW_LINE);
+    }
 }
 
-void IMU::Magn_Init()
-{
-  char tx[2];
-  tx[0] = 0x02; // Mode
-  tx[1] = 0x00; // Set continuous mode (default 10Hz)
-  Wire.write(MAGN_WRITE, tx, 2);
-  wait_ms(5);
+void IMU::Magn_Init() {
+    char tx[2];
+    tx[0] = 0x02; // Mode
+    tx[1] = 0x00; // Set continuous mode (default 10Hz)
+    Wire.write(MAGN_WRITE, tx, 2);
+    wait_ms(5);
 
-  tx[0] = 0x00; // CONFIG_A 
-  tx[1] = 0x18; // Set 50Hz
-  Wire.write(MAGN_WRITE, tx, 2);
-  wait_ms(5);
+    tx[0] = 0x00; // CONFIG_A
+    tx[1] = 0x18; // Set 50Hz
+    Wire.write(MAGN_WRITE, tx, 2);
+    wait_ms(5);
 }
 
-void IMU::Read_Magn()
-{
-  char buff[6];
-  char tx = 0x03;  // Send address to read from 
+void IMU::Read_Magn() {
+    char buff[6];
+    char tx = 0x03;  // Send address to read from
 
-  Wire.write(MAGN_WRITE, &tx, 1);
-  
-  if (Wire.read(MAGN_READ, buff, 6) == 0)  // All bytes received?
-  {
+    Wire.write(MAGN_WRITE, &tx, 1);
+
+    if (Wire.read(MAGN_READ, buff, 6) == 0) { // All bytes received?
 // 9DOF Razor IMU SEN-10125 using HMC5843 magnetometer
 #if HW__VERSION_CODE == 10125
-    // MSB byte first, then LSB; X, Y, Z
-    magnetom[0] = -1 * (((int) buff[2]) << 8) | buff[3];  // X axis (internal sensor -y axis)
-    magnetom[1] = -1 * (((int) buff[0]) << 8) | buff[1];  // Y axis (internal sensor -x axis)
-    magnetom[2] = -1 * (((int) buff[4]) << 8) | buff[5];  // Z axis (internal sensor -z axis)
+        // MSB byte first, then LSB; X, Y, Z
+        magnetom[0] = -1 * (((int) buff[2]) << 8) | buff[3];  // X axis (internal sensor -y axis)
+        magnetom[1] = -1 * (((int) buff[0]) << 8) | buff[1];  // Y axis (internal sensor -x axis)
+        magnetom[2] = -1 * (((int) buff[4]) << 8) | buff[5];  // Z axis (internal sensor -z axis)
 // 9DOF Razor IMU SEN-10736 using HMC5883L magnetometer
 #elif HW__VERSION_CODE == 10736
-    // MSB byte first, then LSB; Y and Z reversed: X, Z, Y
-    magnetom[0] = -1 * (((int) buff[4]) << 8) | buff[5];  // X axis (internal sensor -y axis)
-    magnetom[1] = -1 * (((int) buff[0]) << 8) | buff[1];  // Y axis (internal sensor -x axis)
-    magnetom[2] = -1 * (((int) buff[2]) << 8) | buff[3];  // Z axis (internal sensor -z axis)
+        // MSB byte first, then LSB; Y and Z reversed: X, Z, Y
+        magnetom[0] = -1 * (((int) buff[4]) << 8) | buff[5];  // X axis (internal sensor -y axis)
+        magnetom[1] = -1 * (((int) buff[0]) << 8) | buff[1];  // Y axis (internal sensor -x axis)
+        magnetom[2] = -1 * (((int) buff[2]) << 8) | buff[3];  // Z axis (internal sensor -z axis)
 // 9DOF Sensor Stick SEN-10183 and SEN-10321 using HMC5843 magnetometer
 #elif (HW__VERSION_CODE == 10183) || (HW__VERSION_CODE == 10321)
-    // MSB byte first, then LSB; X, Y, Z
-    magnetom[0] = (((int) buff[0]) << 8) | buff[1];       // X axis (internal sensor x axis)
-    magnetom[1] = -1 * (((int) buff[2]) << 8) | buff[3];  // Y axis (internal sensor -y axis)
-    magnetom[2] = -1 * (((int) buff[4]) << 8) | buff[5];  // Z axis (internal sensor -z axis)
+        // MSB byte first, then LSB; X, Y, Z
+        magnetom[0] = (((int) buff[0]) << 8) | buff[1];       // X axis (internal sensor x axis)
+        magnetom[1] = -1 * (((int) buff[2]) << 8) | buff[3];  // Y axis (internal sensor -y axis)
+        magnetom[2] = -1 * (((int) buff[4]) << 8) | buff[5];  // Z axis (internal sensor -z axis)
 // 9DOF Sensor Stick SEN-10724 using HMC5883L magnetometer
 #elif HW__VERSION_CODE == 10724
-    // MSB byte first, then LSB; Y and Z reversed: X, Z, Y
-    magnetom[0] =  1 * ((int)buff[0] << 8 | (int)buff[1]); // X axis (internal sensor x axis)
-    magnetom[1] = -1 * ((int)buff[4] << 8 | (int)buff[5]); // Y axis (internal sensor -y axis)
-    magnetom[2] = -1 * ((int)buff[2] << 8 | (int)buff[3]); // Z axis (internal sensor -z axis)
+        // MSB byte first, then LSB; Y and Z reversed: X, Z, Y
+        magnetom[0] =  1 * ((int)buff[0] << 8 | (int)buff[1]); // X axis (internal sensor x axis)
+        magnetom[1] = -1 * ((int)buff[4] << 8 | (int)buff[5]); // Y axis (internal sensor -y axis)
+        magnetom[2] = -1 * ((int)buff[2] << 8 | (int)buff[3]); // Z axis (internal sensor -z axis)
 #endif
-  }
-  else
-  {
-    num_magn_errors++;
-    if (output_errors) pc.printf("!ERR: reading magnetometer" NEW_LINE);
-  }
+    } else {
+        num_magn_errors++;
+        if (output_errors) pc.printf("!ERR: reading magnetometer" NEW_LINE);
+    }
 }
 
-void IMU::Gyro_Init()
-{
-  char tx[2];
-  
-  // Power up reset defaults
-  tx[0] = 0x3E; // Power management
-  tx[1] = 0x80; // ?
-  Wire.write(GYRO_WRITE, tx, 2);
-  wait_ms(5);
-  
-  // Select full-scale range of the gyro sensors
-  // Set LP filter bandwidth to 42Hz
-  tx[0] = 0x16; // 
-  tx[1] = 0x1B; // DLPF_CFG = 3, FS_SEL = 3
-  Wire.write(GYRO_WRITE, tx, 2);
-  wait_ms(5);
-  
-  // Set sample rato to 50Hz
-  tx[0] = 0x15; //
-  tx[1] = 0x0A; //  SMPLRT_DIV = 10 (50Hz)
-  Wire.write(GYRO_WRITE, tx, 2);
-  wait_ms(5);
+void IMU::Gyro_Init() {
+    char tx[2];
+
+    // Power up reset defaults
+    tx[0] = 0x3E; // Power management
+    tx[1] = 0x80; // ?
+    Wire.write(GYRO_WRITE, tx, 2);
+    wait_ms(5);
 
-  // Set clock to PLL with z gyro reference
-  tx[0] = 0x3E;
-  tx[1] = 0x00;
-  Wire.write(GYRO_WRITE, tx, 2);
-  wait_ms(5);
+    // Select full-scale range of the gyro sensors
+    // Set LP filter bandwidth to 42Hz
+    tx[0] = 0x16; //
+    tx[1] = 0x1B; // DLPF_CFG = 3, FS_SEL = 3
+    Wire.write(GYRO_WRITE, tx, 2);
+    wait_ms(5);
+
+    // Set sample rato to 50Hz
+    tx[0] = 0x15; //
+    tx[1] = 0x0A; //  SMPLRT_DIV = 10 (50Hz)
+    Wire.write(GYRO_WRITE, tx, 2);
+    wait_ms(5);
+
+    // Set clock to PLL with z gyro reference
+    tx[0] = 0x3E;
+    tx[1] = 0x00;
+    Wire.write(GYRO_WRITE, tx, 2);
+    wait_ms(5);
 }
 
 // Reads x, y and z gyroscope registers
-void IMU::Read_Gyro()
-{
-  char buff[6];
-  char tx = 0x1D; // Sends address to read from
-  
-  Wire.write(GYRO_WRITE, &tx, 1);
-  
-  if (Wire.read(GYRO_READ, buff, 6) == 0)  // All bytes received?
-  {
-    gyro[0] = -1 * ((int)buff[2] << 8 | (int)buff[3]);   // X axis (internal sensor -y axis)
-    gyro[1] = -1 * ((int)buff[0] << 8 | (int)buff[1]);   // Y axis (internal sensor -x axis)
-    gyro[2] = -1 * ((int)buff[4] << 8 | (int)buff[5]);   // Z axis (internal sensor -z axis)
-  }
-  else
-  {
-    num_gyro_errors++;
-    if (output_errors) pc.printf("!ERR: reading gyroscope" NEW_LINE);
-  }
+void IMU::Read_Gyro() {
+    char buff[6];
+    char tx = 0x1D; // Sends address to read from
+
+    Wire.write(GYRO_WRITE, &tx, 1);
+
+    if (Wire.read(GYRO_READ, buff, 6) == 0) { // All bytes received?
+        gyro[0] = -1 * ((int)buff[2] << 8 | (int)buff[3]);   // X axis (internal sensor -y axis)
+        gyro[1] = -1 * ((int)buff[0] << 8 | (int)buff[1]);   // Y axis (internal sensor -x axis)
+        gyro[2] = -1 * ((int)buff[4] << 8 | (int)buff[5]);   // Z axis (internal sensor -z axis)
+    } else {
+        num_gyro_errors++;
+        if (output_errors) pc.printf("!ERR: reading gyroscope" NEW_LINE);
+    }
 }