     Reads the IMU's gyro
     @return rate in degrees / ms
 */
-float readGyro() {
+float readGyro(char dim) {
   if (imu.gyroAvailable()) {
     imu.readGyro();
   }
-  return imu.calcGyro(imu.gz) - calibratedOffset;
-}
+  switch (dim) {
+  case 'x':
+    return imu.calcGyro(imu.gx) - calibrationOffset[0];
+    break;
+  case 'y':
+    return imu.calcGyro(imu.gy) - calibrationOffset[1];
+    break;
+  case 'z':
+    return imu.calcGyro(imu.gz) - calibrationOffset[2];
+    break;
+  default:
+    return 0;
+    break;
+  } 
+}
+
 
 
 /**

const int motorUpdateRate = 50; // gyro sample rate
const int calibrationSamples = 1000;

// Initial calibration value
float calibratedOffset;

// Indicator LED
const int LED = 13;

    @param number of calibration samples
    @returns degrees of gyro drift per second
*/
void zeroGyro() {
  float gyroSum;
  char active_dim; 
  digitalWrite(LED, HIGH);
  for (int j = 0; j < 3; j++) {
    active_dim = dims[j];
    gyroSum = 0;
    for (int i = 0; i < calibrationSamples; i++) {
      gyroSum += readGyro(active_dim);
      }
    Serial.println(active_dim);
    Serial.println(gyroSum / calibrationSamples);
    calibrationOffset[j] = gyroSum / calibrationSamples;
    blinkLED(300, 5);
  }
}

/**
