使いやすいように。
Dependencies: ArduinoSerial I2Cdev
Fork of MPU6050 by
MPU6050_DMP6.h@9:4221c5b3f49b, 2017-02-17 (annotated)
- Committer:
- tsumagari
- Date:
- Fri Feb 17 07:37:19 2017 +0000
- Revision:
- 9:4221c5b3f49b
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
tsumagari | 9:4221c5b3f49b | 1 | //#include "MPU6050_DMP6.h" |
tsumagari | 9:4221c5b3f49b | 2 | |
tsumagari | 9:4221c5b3f49b | 3 | // I2Cdev and MPU6050 must be installed as libraries, or else the .cpp/.h files |
tsumagari | 9:4221c5b3f49b | 4 | // for both classes must be in the include path of your project |
tsumagari | 9:4221c5b3f49b | 5 | #include "I2Cdev.h" |
tsumagari | 9:4221c5b3f49b | 6 | |
tsumagari | 9:4221c5b3f49b | 7 | #include "MPU6050_6Axis_MotionApps20.h" |
tsumagari | 9:4221c5b3f49b | 8 | //#include "MPU6050.h" // not necessary if using MotionApps include file |
tsumagari | 9:4221c5b3f49b | 9 | |
tsumagari | 9:4221c5b3f49b | 10 | //#include "ArduinoSerial.h" |
tsumagari | 9:4221c5b3f49b | 11 | |
tsumagari | 9:4221c5b3f49b | 12 | /* ========================================================================= |
tsumagari | 9:4221c5b3f49b | 13 | NOTE: In addition to connection 3.3v, GND, SDA, and SCL, this sketch |
tsumagari | 9:4221c5b3f49b | 14 | depends on the MPU-6050's INT pin being connected to the Arduino's |
tsumagari | 9:4221c5b3f49b | 15 | external interrupt #0 pin. On the Arduino Uno and Mega 2560, this is |
tsumagari | 9:4221c5b3f49b | 16 | digital I/O pin 2. |
tsumagari | 9:4221c5b3f49b | 17 | * ========================================================================= */ |
tsumagari | 9:4221c5b3f49b | 18 | |
tsumagari | 9:4221c5b3f49b | 19 | // uncomment "OUTPUT_READABLE_QUATERNION" if you want to see the actual |
tsumagari | 9:4221c5b3f49b | 20 | // quaternion components in a [w, x, y, z] format (not best for parsing |
tsumagari | 9:4221c5b3f49b | 21 | // on a remote host such as Processing or something though) |
tsumagari | 9:4221c5b3f49b | 22 | //#define OUTPUT_READABLE_QUATERNION |
tsumagari | 9:4221c5b3f49b | 23 | |
tsumagari | 9:4221c5b3f49b | 24 | // uncomment "OUTPUT_READABLE_EULER" if you want to see Euler angles |
tsumagari | 9:4221c5b3f49b | 25 | // (in degrees) calculated from the quaternions coming from the FIFO. |
tsumagari | 9:4221c5b3f49b | 26 | // Note that Euler angles suffer from gimbal lock (for more info, see |
tsumagari | 9:4221c5b3f49b | 27 | // http://en.wikipedia.org/wiki/Gimbal_lock) |
tsumagari | 9:4221c5b3f49b | 28 | //#define OUTPUT_READABLE_EULER |
tsumagari | 9:4221c5b3f49b | 29 | |
tsumagari | 9:4221c5b3f49b | 30 | // uncomment "OUTPUT_READABLE_YAWPITCHROLL" if you want to see the yaw/ |
tsumagari | 9:4221c5b3f49b | 31 | // pitch/roll angles (in degrees) calculated from the quaternions coming |
tsumagari | 9:4221c5b3f49b | 32 | // from the FIFO. Note this also requires gravity vector calculations. |
tsumagari | 9:4221c5b3f49b | 33 | // Also note that yaw/pitch/roll angles suffer from gimbal lock (for |
tsumagari | 9:4221c5b3f49b | 34 | // more info, see: http://en.wikipedia.org/wiki/Gimbal_lock) |
tsumagari | 9:4221c5b3f49b | 35 | #define OUTPUT_READABLE_YAWPITCHROLL |
tsumagari | 9:4221c5b3f49b | 36 | |
tsumagari | 9:4221c5b3f49b | 37 | // uncomment "OUTPUT_READABLE_REALACCEL" if you want to see acceleration |
tsumagari | 9:4221c5b3f49b | 38 | // components with gravity removed. This acceleration reference frame is |
tsumagari | 9:4221c5b3f49b | 39 | // not compensated for orientation, so +X is always +X according to the |
tsumagari | 9:4221c5b3f49b | 40 | // sensor, just without the effects of gravity. If you want acceleration |
tsumagari | 9:4221c5b3f49b | 41 | // compensated for orientation, us OUTPUT_READABLE_WORLDACCEL instead. |
tsumagari | 9:4221c5b3f49b | 42 | //#define OUTPUT_READABLE_REALACCEL |
tsumagari | 9:4221c5b3f49b | 43 | |
tsumagari | 9:4221c5b3f49b | 44 | // uncomment "OUTPUT_READABLE_WORLDACCEL" if you want to see acceleration |
tsumagari | 9:4221c5b3f49b | 45 | // components with gravity removed and adjusted for the world frame of |
tsumagari | 9:4221c5b3f49b | 46 | // reference (yaw is relative to initial orientation, since no magnetometer |
tsumagari | 9:4221c5b3f49b | 47 | // is present in this case). Could be quite handy in some cases. |
tsumagari | 9:4221c5b3f49b | 48 | //#define OUTPUT_READABLE_WORLDACCEL |
tsumagari | 9:4221c5b3f49b | 49 | |
tsumagari | 9:4221c5b3f49b | 50 | // uncomment "OUTPUT_TEAPOT" if you want output that matches the |
tsumagari | 9:4221c5b3f49b | 51 | // format used for the InvenSense teapot demo |
tsumagari | 9:4221c5b3f49b | 52 | //#define OUTPUT_TEAPOT |
tsumagari | 9:4221c5b3f49b | 53 | |
tsumagari | 9:4221c5b3f49b | 54 | #ifndef M_PI |
tsumagari | 9:4221c5b3f49b | 55 | #define M_PI 3.14159265358979 |
tsumagari | 9:4221c5b3f49b | 56 | #endif |
tsumagari | 9:4221c5b3f49b | 57 | |
tsumagari | 9:4221c5b3f49b | 58 | namespace MPU6050DMP6 { |
tsumagari | 9:4221c5b3f49b | 59 | |
tsumagari | 9:4221c5b3f49b | 60 | // class default I2C address is 0x68 |
tsumagari | 9:4221c5b3f49b | 61 | // specific I2C addresses may be passed as a parameter here |
tsumagari | 9:4221c5b3f49b | 62 | // AD0 low = 0x68 (default for SparkFun breakout and InvenSense evaluation board) |
tsumagari | 9:4221c5b3f49b | 63 | // AD0 high = 0x69 |
tsumagari | 9:4221c5b3f49b | 64 | MPU6050 mpu; |
tsumagari | 9:4221c5b3f49b | 65 | //MPU6050 mpu(0x69); // <-- use for AD0 high |
tsumagari | 9:4221c5b3f49b | 66 | |
tsumagari | 9:4221c5b3f49b | 67 | |
tsumagari | 9:4221c5b3f49b | 68 | // MPU control/status vars |
tsumagari | 9:4221c5b3f49b | 69 | bool dmpReady = false; // set true if DMP init was successful |
tsumagari | 9:4221c5b3f49b | 70 | uint8_t mpuIntStatus; // holds actual interrupt status byte from MPU |
tsumagari | 9:4221c5b3f49b | 71 | uint8_t devStatus; // return status after each device operation (0 = success, !0 = error) |
tsumagari | 9:4221c5b3f49b | 72 | uint16_t packetSize; // expected DMP packet size (default is 42 bytes) |
tsumagari | 9:4221c5b3f49b | 73 | uint16_t fifoCount; // count of all bytes currently in FIFO |
tsumagari | 9:4221c5b3f49b | 74 | uint8_t fifoBuffer[64]; // FIFO storage buffer |
tsumagari | 9:4221c5b3f49b | 75 | |
tsumagari | 9:4221c5b3f49b | 76 | // orientation/motion vars |
tsumagari | 9:4221c5b3f49b | 77 | Quaternion q; // [w, x, y, z] quaternion container |
tsumagari | 9:4221c5b3f49b | 78 | VectorInt16 aa; // [x, y, z] accel sensor measurements |
tsumagari | 9:4221c5b3f49b | 79 | VectorInt16 aaReal; // [x, y, z] gravity-free accel sensor measurements |
tsumagari | 9:4221c5b3f49b | 80 | VectorInt16 aaWorld; // [x, y, z] world-frame accel sensor measurements |
tsumagari | 9:4221c5b3f49b | 81 | VectorFloat gravity; // [x, y, z] gravity vector |
tsumagari | 9:4221c5b3f49b | 82 | //float euler[3]; // [psi, theta, phi] Euler angle container |
tsumagari | 9:4221c5b3f49b | 83 | float ypr[3]; // [yaw, pitch, roll] yaw/pitch/roll container and gravity vector |
tsumagari | 9:4221c5b3f49b | 84 | |
tsumagari | 9:4221c5b3f49b | 85 | // packet structure for InvenSense teapot demo |
tsumagari | 9:4221c5b3f49b | 86 | uint8_t teapotPacket[14] = { '$', 0x02, 0,0, 0,0, 0,0, 0,0, 0x00, 0x00, '\r', '\n' }; |
tsumagari | 9:4221c5b3f49b | 87 | |
tsumagari | 9:4221c5b3f49b | 88 | DigitalOut led1(LED1); |
tsumagari | 9:4221c5b3f49b | 89 | InterruptIn checkpin(p29); |
tsumagari | 9:4221c5b3f49b | 90 | //ArduinoSerial arduinoSerial; |
tsumagari | 9:4221c5b3f49b | 91 | |
tsumagari | 9:4221c5b3f49b | 92 | |
tsumagari | 9:4221c5b3f49b | 93 | // ================================================================ |
tsumagari | 9:4221c5b3f49b | 94 | // === INTERRUPT DETECTION ROUTINE === |
tsumagari | 9:4221c5b3f49b | 95 | // ================================================================ |
tsumagari | 9:4221c5b3f49b | 96 | |
tsumagari | 9:4221c5b3f49b | 97 | volatile bool mpuInterrupt = false; // indicates whether MPU interrupt pin has gone high |
tsumagari | 9:4221c5b3f49b | 98 | void dmpDataReady() |
tsumagari | 9:4221c5b3f49b | 99 | { |
tsumagari | 9:4221c5b3f49b | 100 | mpuInterrupt = true; |
tsumagari | 9:4221c5b3f49b | 101 | } |
tsumagari | 9:4221c5b3f49b | 102 | |
tsumagari | 9:4221c5b3f49b | 103 | |
tsumagari | 9:4221c5b3f49b | 104 | |
tsumagari | 9:4221c5b3f49b | 105 | // ================================================================ |
tsumagari | 9:4221c5b3f49b | 106 | // === INITIAL SETUP === |
tsumagari | 9:4221c5b3f49b | 107 | // ================================================================ |
tsumagari | 9:4221c5b3f49b | 108 | |
tsumagari | 9:4221c5b3f49b | 109 | void setup() |
tsumagari | 9:4221c5b3f49b | 110 | { |
tsumagari | 9:4221c5b3f49b | 111 | // initialize arduinoSerial communication |
tsumagari | 9:4221c5b3f49b | 112 | // (115200 chosen because it is required for Teapot Demo output, but it's |
tsumagari | 9:4221c5b3f49b | 113 | // really up to you depending on your project) |
tsumagari | 9:4221c5b3f49b | 114 | // arduinoSerial.begin(115200); |
tsumagari | 9:4221c5b3f49b | 115 | |
tsumagari | 9:4221c5b3f49b | 116 | // initialize device |
tsumagari | 9:4221c5b3f49b | 117 | // arduinoSerial.println(F("Initializing I2C devices...")); |
tsumagari | 9:4221c5b3f49b | 118 | mpu.initialize(); |
tsumagari | 9:4221c5b3f49b | 119 | |
tsumagari | 9:4221c5b3f49b | 120 | // verify connection |
tsumagari | 9:4221c5b3f49b | 121 | // arduinoSerial.println(F("Testing device connections...")); |
tsumagari | 9:4221c5b3f49b | 122 | // arduinoSerial.println(mpu.testConnection() ? F("MPU6050 connection successful") : F("MPU6050 connection failed")); |
tsumagari | 9:4221c5b3f49b | 123 | |
tsumagari | 9:4221c5b3f49b | 124 | // wait for ready |
tsumagari | 9:4221c5b3f49b | 125 | // arduinoSerial.println(F("\nSend any character to begin DMP programming and demo: ")); |
tsumagari | 9:4221c5b3f49b | 126 | // while (arduinoSerial.available() && arduinoSerial.read()); // empty buffer |
tsumagari | 9:4221c5b3f49b | 127 | // while (!arduinoSerial.available()); // wait for data |
tsumagari | 9:4221c5b3f49b | 128 | // while (arduinoSerial.available() && arduinoSerial.read()); // empty buffer again |
tsumagari | 9:4221c5b3f49b | 129 | |
tsumagari | 9:4221c5b3f49b | 130 | // load and configure the DMP |
tsumagari | 9:4221c5b3f49b | 131 | // arduinoSerial.println(F("Initializing DMP...")); |
tsumagari | 9:4221c5b3f49b | 132 | devStatus = mpu.dmpInitialize(); |
tsumagari | 9:4221c5b3f49b | 133 | |
tsumagari | 9:4221c5b3f49b | 134 | // supply your own gyro offsets here, scaled for min sensitivity |
tsumagari | 9:4221c5b3f49b | 135 | mpu.setXGyroOffset(220); |
tsumagari | 9:4221c5b3f49b | 136 | mpu.setYGyroOffset(76); |
tsumagari | 9:4221c5b3f49b | 137 | mpu.setZGyroOffset(-85); |
tsumagari | 9:4221c5b3f49b | 138 | mpu.setZAccelOffset(1788); // 1688 factory default for my test chip |
tsumagari | 9:4221c5b3f49b | 139 | |
tsumagari | 9:4221c5b3f49b | 140 | // make sure it worked (returns 0 if so) |
tsumagari | 9:4221c5b3f49b | 141 | if (devStatus == 0) { |
tsumagari | 9:4221c5b3f49b | 142 | // turn on the DMP, now that it's ready |
tsumagari | 9:4221c5b3f49b | 143 | // arduinoSerial.println(F("Enabling DMP...")); |
tsumagari | 9:4221c5b3f49b | 144 | mpu.setDMPEnabled(true); |
tsumagari | 9:4221c5b3f49b | 145 | |
tsumagari | 9:4221c5b3f49b | 146 | // enable Arduino interrupt detection |
tsumagari | 9:4221c5b3f49b | 147 | // arduinoSerial.println(F("Enabling interrupt detection (Arduino external interrupt 0)...")); |
tsumagari | 9:4221c5b3f49b | 148 | checkpin.rise(&dmpDataReady); |
tsumagari | 9:4221c5b3f49b | 149 | mpuIntStatus = mpu.getIntStatus(); |
tsumagari | 9:4221c5b3f49b | 150 | |
tsumagari | 9:4221c5b3f49b | 151 | // set our DMP Ready flag so the main loop() function knows it's okay to use it |
tsumagari | 9:4221c5b3f49b | 152 | // arduinoSerial.println(F("DMP ready! Waiting for first interrupt...")); |
tsumagari | 9:4221c5b3f49b | 153 | dmpReady = true; |
tsumagari | 9:4221c5b3f49b | 154 | |
tsumagari | 9:4221c5b3f49b | 155 | // get expected DMP packet size for later comparison |
tsumagari | 9:4221c5b3f49b | 156 | packetSize = mpu.dmpGetFIFOPacketSize(); |
tsumagari | 9:4221c5b3f49b | 157 | } else { |
tsumagari | 9:4221c5b3f49b | 158 | // ERROR! |
tsumagari | 9:4221c5b3f49b | 159 | // 1 = initial memory load failed |
tsumagari | 9:4221c5b3f49b | 160 | // 2 = DMP configuration updates failed |
tsumagari | 9:4221c5b3f49b | 161 | // (if it's going to break, usually the code will be 1) |
tsumagari | 9:4221c5b3f49b | 162 | // arduinoSerial.print(F("DMP Initialization failed (code ")); |
tsumagari | 9:4221c5b3f49b | 163 | // arduinoSerial.print(devStatus); |
tsumagari | 9:4221c5b3f49b | 164 | // arduinoSerial.println(F(")")); |
tsumagari | 9:4221c5b3f49b | 165 | } |
tsumagari | 9:4221c5b3f49b | 166 | |
tsumagari | 9:4221c5b3f49b | 167 | } |
tsumagari | 9:4221c5b3f49b | 168 | |
tsumagari | 9:4221c5b3f49b | 169 | |
tsumagari | 9:4221c5b3f49b | 170 | |
tsumagari | 9:4221c5b3f49b | 171 | // ================================================================ |
tsumagari | 9:4221c5b3f49b | 172 | // === MAIN PROGRAM LOOP === |
tsumagari | 9:4221c5b3f49b | 173 | // ================================================================ |
tsumagari | 9:4221c5b3f49b | 174 | |
tsumagari | 9:4221c5b3f49b | 175 | void getYPR() |
tsumagari | 9:4221c5b3f49b | 176 | { |
tsumagari | 9:4221c5b3f49b | 177 | // if programming failed, don't try to do anything |
tsumagari | 9:4221c5b3f49b | 178 | if (!dmpReady) return; |
tsumagari | 9:4221c5b3f49b | 179 | |
tsumagari | 9:4221c5b3f49b | 180 | // wait for MPU interrupt or extra packet(s) available |
tsumagari | 9:4221c5b3f49b | 181 | while (!mpuInterrupt && fifoCount < packetSize) { |
tsumagari | 9:4221c5b3f49b | 182 | // other program behavior stuff here |
tsumagari | 9:4221c5b3f49b | 183 | // . |
tsumagari | 9:4221c5b3f49b | 184 | // . |
tsumagari | 9:4221c5b3f49b | 185 | // . |
tsumagari | 9:4221c5b3f49b | 186 | // if you are really paranoid you can frequently test in between other |
tsumagari | 9:4221c5b3f49b | 187 | // stuff to see if mpuInterrupt is true, and if so, "break;" from the |
tsumagari | 9:4221c5b3f49b | 188 | // while() loop to immediately process the MPU data |
tsumagari | 9:4221c5b3f49b | 189 | // . |
tsumagari | 9:4221c5b3f49b | 190 | // . |
tsumagari | 9:4221c5b3f49b | 191 | // . |
tsumagari | 9:4221c5b3f49b | 192 | } |
tsumagari | 9:4221c5b3f49b | 193 | |
tsumagari | 9:4221c5b3f49b | 194 | // reset interrupt flag and get INT_STATUS byte |
tsumagari | 9:4221c5b3f49b | 195 | mpuInterrupt = false; |
tsumagari | 9:4221c5b3f49b | 196 | mpuIntStatus = mpu.getIntStatus(); |
tsumagari | 9:4221c5b3f49b | 197 | |
tsumagari | 9:4221c5b3f49b | 198 | // get current FIFO count |
tsumagari | 9:4221c5b3f49b | 199 | fifoCount = mpu.getFIFOCount(); |
tsumagari | 9:4221c5b3f49b | 200 | |
tsumagari | 9:4221c5b3f49b | 201 | // check for overflow (this should never happen unless our code is too inefficient) |
tsumagari | 9:4221c5b3f49b | 202 | if ((mpuIntStatus & 0x10) || fifoCount == 1024) { |
tsumagari | 9:4221c5b3f49b | 203 | // reset so we can continue cleanly |
tsumagari | 9:4221c5b3f49b | 204 | mpu.resetFIFO(); |
tsumagari | 9:4221c5b3f49b | 205 | // arduinoSerial.println(F("FIFO overflow!")); |
tsumagari | 9:4221c5b3f49b | 206 | |
tsumagari | 9:4221c5b3f49b | 207 | // otherwise, check for DMP data ready interrupt (this should happen frequently) |
tsumagari | 9:4221c5b3f49b | 208 | } else if (mpuIntStatus & 0x02) { |
tsumagari | 9:4221c5b3f49b | 209 | // wait for correct available data length, should be a VERY short wait |
tsumagari | 9:4221c5b3f49b | 210 | while (fifoCount < packetSize) fifoCount = mpu.getFIFOCount(); |
tsumagari | 9:4221c5b3f49b | 211 | |
tsumagari | 9:4221c5b3f49b | 212 | // read a packet from FIFO |
tsumagari | 9:4221c5b3f49b | 213 | mpu.getFIFOBytes(fifoBuffer, packetSize); |
tsumagari | 9:4221c5b3f49b | 214 | |
tsumagari | 9:4221c5b3f49b | 215 | // track FIFO count here in case there is > 1 packet available |
tsumagari | 9:4221c5b3f49b | 216 | // (this lets us immediately read more without waiting for an interrupt) |
tsumagari | 9:4221c5b3f49b | 217 | fifoCount -= packetSize; |
tsumagari | 9:4221c5b3f49b | 218 | |
tsumagari | 9:4221c5b3f49b | 219 | #ifdef OUTPUT_READABLE_QUATERNION |
tsumagari | 9:4221c5b3f49b | 220 | // display quaternion values in easy matrix form: w x y z |
tsumagari | 9:4221c5b3f49b | 221 | mpu.dmpGetQuaternion(&q, fifoBuffer); |
tsumagari | 9:4221c5b3f49b | 222 | // arduinoSerial.print("quat\t"); |
tsumagari | 9:4221c5b3f49b | 223 | // arduinoSerial.print(q.w); |
tsumagari | 9:4221c5b3f49b | 224 | // arduinoSerial.print("\t"); |
tsumagari | 9:4221c5b3f49b | 225 | // arduinoSerial.print(q.x); |
tsumagari | 9:4221c5b3f49b | 226 | // arduinoSerial.print("\t"); |
tsumagari | 9:4221c5b3f49b | 227 | // arduinoSerial.print(q.y); |
tsumagari | 9:4221c5b3f49b | 228 | // arduinoSerial.print("\t"); |
tsumagari | 9:4221c5b3f49b | 229 | // arduinoSerial.println(q.z); |
tsumagari | 9:4221c5b3f49b | 230 | #endif |
tsumagari | 9:4221c5b3f49b | 231 | |
tsumagari | 9:4221c5b3f49b | 232 | #ifdef OUTPUT_READABLE_EULER |
tsumagari | 9:4221c5b3f49b | 233 | // display Euler angles in degrees |
tsumagari | 9:4221c5b3f49b | 234 | mpu.dmpGetQuaternion(&q, fifoBuffer); |
tsumagari | 9:4221c5b3f49b | 235 | mpu.dmpGetEuler(euler, &q); |
tsumagari | 9:4221c5b3f49b | 236 | // arduinoSerial.print("euler\t"); |
tsumagari | 9:4221c5b3f49b | 237 | // arduinoSerial.print(euler[0] * 180/M_PI); |
tsumagari | 9:4221c5b3f49b | 238 | // arduinoSerial.print("\t"); |
tsumagari | 9:4221c5b3f49b | 239 | // arduinoSerial.print(euler[1] * 180/M_PI); |
tsumagari | 9:4221c5b3f49b | 240 | // arduinoSerial.print("\t"); |
tsumagari | 9:4221c5b3f49b | 241 | // arduinoSerial.println(euler[2] * 180/M_PI); |
tsumagari | 9:4221c5b3f49b | 242 | #endif |
tsumagari | 9:4221c5b3f49b | 243 | |
tsumagari | 9:4221c5b3f49b | 244 | #ifdef OUTPUT_READABLE_YAWPITCHROLL |
tsumagari | 9:4221c5b3f49b | 245 | // display Euler angles in degrees |
tsumagari | 9:4221c5b3f49b | 246 | mpu.dmpGetQuaternion(&q, fifoBuffer); |
tsumagari | 9:4221c5b3f49b | 247 | mpu.dmpGetGravity(&gravity, &q); |
tsumagari | 9:4221c5b3f49b | 248 | mpu.dmpGetYawPitchRoll(ypr, &q, &gravity); |
tsumagari | 9:4221c5b3f49b | 249 | // arduinoSerial.print("ypr\t"); |
tsumagari | 9:4221c5b3f49b | 250 | // arduinoSerial.print(ypr[0] * 180/M_PI); |
tsumagari | 9:4221c5b3f49b | 251 | // arduinoSerial.print("\t"); |
tsumagari | 9:4221c5b3f49b | 252 | // arduinoSerial.print(ypr[1] * 180/M_PI); |
tsumagari | 9:4221c5b3f49b | 253 | // arduinoSerial.print("\t"); |
tsumagari | 9:4221c5b3f49b | 254 | // arduinoSerial.println(ypr[2] * 180/M_PI); |
tsumagari | 9:4221c5b3f49b | 255 | #endif |
tsumagari | 9:4221c5b3f49b | 256 | |
tsumagari | 9:4221c5b3f49b | 257 | #ifdef OUTPUT_READABLE_REALACCEL |
tsumagari | 9:4221c5b3f49b | 258 | // display real acceleration, adjusted to remove gravity |
tsumagari | 9:4221c5b3f49b | 259 | mpu.dmpGetQuaternion(&q, fifoBuffer); |
tsumagari | 9:4221c5b3f49b | 260 | mpu.dmpGetAccel(&aa, fifoBuffer); |
tsumagari | 9:4221c5b3f49b | 261 | mpu.dmpGetGravity(&gravity, &q); |
tsumagari | 9:4221c5b3f49b | 262 | mpu.dmpGetLinearAccel(&aaReal, &aa, &gravity); |
tsumagari | 9:4221c5b3f49b | 263 | // arduinoSerial.print("areal\t"); |
tsumagari | 9:4221c5b3f49b | 264 | // arduinoSerial.print(aaReal.x); |
tsumagari | 9:4221c5b3f49b | 265 | // arduinoSerial.print("\t"); |
tsumagari | 9:4221c5b3f49b | 266 | // arduinoSerial.print(aaReal.y); |
tsumagari | 9:4221c5b3f49b | 267 | // arduinoSerial.print("\t"); |
tsumagari | 9:4221c5b3f49b | 268 | // arduinoSerial.println(aaReal.z); |
tsumagari | 9:4221c5b3f49b | 269 | #endif |
tsumagari | 9:4221c5b3f49b | 270 | |
tsumagari | 9:4221c5b3f49b | 271 | #ifdef OUTPUT_READABLE_WORLDACCEL |
tsumagari | 9:4221c5b3f49b | 272 | // display initial world-frame acceleration, adjusted to remove gravity |
tsumagari | 9:4221c5b3f49b | 273 | // and rotated based on known orientation from quaternion |
tsumagari | 9:4221c5b3f49b | 274 | mpu.dmpGetQuaternion(&q, fifoBuffer); |
tsumagari | 9:4221c5b3f49b | 275 | mpu.dmpGetAccel(&aa, fifoBuffer); |
tsumagari | 9:4221c5b3f49b | 276 | mpu.dmpGetGravity(&gravity, &q); |
tsumagari | 9:4221c5b3f49b | 277 | mpu.dmpGetLinearAccel(&aaReal, &aa, &gravity); |
tsumagari | 9:4221c5b3f49b | 278 | mpu.dmpGetLinearAccelInWorld(&aaWorld, &aaReal, &q); |
tsumagari | 9:4221c5b3f49b | 279 | // arduinoSerial.print("aworld\t"); |
tsumagari | 9:4221c5b3f49b | 280 | // arduinoSerial.print(aaWorld.x); |
tsumagari | 9:4221c5b3f49b | 281 | // arduinoSerial.print("\t"); |
tsumagari | 9:4221c5b3f49b | 282 | // arduinoSerial.print(aaWorld.y); |
tsumagari | 9:4221c5b3f49b | 283 | // arduinoSerial.print("\t"); |
tsumagari | 9:4221c5b3f49b | 284 | // arduinoSerial.println(aaWorld.z); |
tsumagari | 9:4221c5b3f49b | 285 | #endif |
tsumagari | 9:4221c5b3f49b | 286 | |
tsumagari | 9:4221c5b3f49b | 287 | #ifdef OUTPUT_TEAPOT |
tsumagari | 9:4221c5b3f49b | 288 | // display quaternion values in InvenSense Teapot demo format: |
tsumagari | 9:4221c5b3f49b | 289 | teapotPacket[2] = fifoBuffer[0]; |
tsumagari | 9:4221c5b3f49b | 290 | teapotPacket[3] = fifoBuffer[1]; |
tsumagari | 9:4221c5b3f49b | 291 | teapotPacket[4] = fifoBuffer[4]; |
tsumagari | 9:4221c5b3f49b | 292 | teapotPacket[5] = fifoBuffer[5]; |
tsumagari | 9:4221c5b3f49b | 293 | teapotPacket[6] = fifoBuffer[8]; |
tsumagari | 9:4221c5b3f49b | 294 | teapotPacket[7] = fifoBuffer[9]; |
tsumagari | 9:4221c5b3f49b | 295 | teapotPacket[8] = fifoBuffer[12]; |
tsumagari | 9:4221c5b3f49b | 296 | teapotPacket[9] = fifoBuffer[13]; |
tsumagari | 9:4221c5b3f49b | 297 | // arduinoSerial.write(teapotPacket, 14); |
tsumagari | 9:4221c5b3f49b | 298 | teapotPacket[11]++; // packetCount, loops at 0xFF on purpose |
tsumagari | 9:4221c5b3f49b | 299 | #endif |
tsumagari | 9:4221c5b3f49b | 300 | |
tsumagari | 9:4221c5b3f49b | 301 | // blink LED to indicate activity |
tsumagari | 9:4221c5b3f49b | 302 | if( led1 == 0 ) led1 = 0; |
tsumagari | 9:4221c5b3f49b | 303 | else led1 = 1; |
tsumagari | 9:4221c5b3f49b | 304 | } |
tsumagari | 9:4221c5b3f49b | 305 | } |
tsumagari | 9:4221c5b3f49b | 306 | |
tsumagari | 9:4221c5b3f49b | 307 | }; |