Ported from Arduino Library : https://github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU6050
Dependents: kopija_NUCLEO_CELL_LOCKER_copy
Fork of MPU6050 by
MPU6050.cpp@4:1e0b279766be, 2017-11-07 (annotated)
- Committer:
- OsmanKameric
- Date:
- Tue Nov 07 16:34:43 2017 +0000
- Revision:
- 4:1e0b279766be
- Parent:
- 3:b21c8c3456be
CELL LOCKER
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
garfieldsg | 0:662207e34fba | 1 | //ported from arduino library: https://github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU6050 |
garfieldsg | 0:662207e34fba | 2 | //written by szymon gaertig (email: szymon@gaertig.com.pl) |
garfieldsg | 0:662207e34fba | 3 | // |
garfieldsg | 0:662207e34fba | 4 | //Changelog: |
garfieldsg | 0:662207e34fba | 5 | //2013-01-08 - first beta release |
garfieldsg | 0:662207e34fba | 6 | |
garfieldsg | 0:662207e34fba | 7 | // I2Cdev library collection - MPU6050 I2C device class |
garfieldsg | 0:662207e34fba | 8 | // Based on InvenSense MPU-6050 register map document rev. 2.0, 5/19/2011 (RM-MPU-6000A-00) |
garfieldsg | 0:662207e34fba | 9 | // 8/24/2011 by Jeff Rowberg <jeff@rowberg.net> |
garfieldsg | 0:662207e34fba | 10 | // Updates should (hopefully) always be available at https://github.com/jrowberg/i2cdevlib |
garfieldsg | 0:662207e34fba | 11 | // |
garfieldsg | 0:662207e34fba | 12 | // Changelog: |
garfieldsg | 0:662207e34fba | 13 | // ... - ongoing debug release |
garfieldsg | 0:662207e34fba | 14 | |
garfieldsg | 0:662207e34fba | 15 | // NOTE: THIS IS ONLY A PARIAL RELEASE. THIS DEVICE CLASS IS CURRENTLY UNDERGOING ACTIVE |
garfieldsg | 0:662207e34fba | 16 | // DEVELOPMENT AND IS STILL MISSING SOME IMPORTANT FEATURES. PLEASE KEEP THIS IN MIND IF |
garfieldsg | 0:662207e34fba | 17 | // YOU DECIDE TO USE THIS PARTICULAR CODE FOR ANYTHING. |
garfieldsg | 0:662207e34fba | 18 | |
garfieldsg | 0:662207e34fba | 19 | /* ============================================ |
garfieldsg | 0:662207e34fba | 20 | I2Cdev device library code is placed under the MIT license |
garfieldsg | 0:662207e34fba | 21 | Copyright (c) 2012 Jeff Rowberg |
garfieldsg | 0:662207e34fba | 22 | |
garfieldsg | 0:662207e34fba | 23 | Permission is hereby granted, free of charge, to any person obtaining a copy |
garfieldsg | 0:662207e34fba | 24 | of this software and associated documentation files (the "Software"), to deal |
garfieldsg | 0:662207e34fba | 25 | in the Software without restriction, including without limitation the rights |
garfieldsg | 0:662207e34fba | 26 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
garfieldsg | 0:662207e34fba | 27 | copies of the Software, and to permit persons to whom the Software is |
garfieldsg | 0:662207e34fba | 28 | furnished to do so, subject to the following conditions: |
garfieldsg | 0:662207e34fba | 29 | |
garfieldsg | 0:662207e34fba | 30 | The above copyright notice and this permission notice shall be included in |
garfieldsg | 0:662207e34fba | 31 | all copies or substantial portions of the Software. |
garfieldsg | 0:662207e34fba | 32 | |
garfieldsg | 0:662207e34fba | 33 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
garfieldsg | 0:662207e34fba | 34 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
garfieldsg | 0:662207e34fba | 35 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
garfieldsg | 0:662207e34fba | 36 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
garfieldsg | 0:662207e34fba | 37 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
garfieldsg | 0:662207e34fba | 38 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
garfieldsg | 0:662207e34fba | 39 | THE SOFTWARE. |
garfieldsg | 0:662207e34fba | 40 | =============================================== |
garfieldsg | 0:662207e34fba | 41 | */ |
garfieldsg | 0:662207e34fba | 42 | |
garfieldsg | 0:662207e34fba | 43 | #include "MPU6050.h" |
OsmanKameric | 2:e2081d9de7af | 44 | int16_t accelData[3],gyroData[3],tempData; |
OsmanKameric | 2:e2081d9de7af | 45 | float accelBias[3] = {0, 0, 0}; // Bias corrections for acc |
OsmanKameric | 2:e2081d9de7af | 46 | float gyroBias[3] = {0, 0, 0}; // Bias corrections for gyro |
OsmanKameric | 2:e2081d9de7af | 47 | enum Ascale |
OsmanKameric | 2:e2081d9de7af | 48 | { |
OsmanKameric | 2:e2081d9de7af | 49 | AFS_2G=0, |
OsmanKameric | 2:e2081d9de7af | 50 | AFS_4G, |
OsmanKameric | 2:e2081d9de7af | 51 | AFS_8G, |
OsmanKameric | 2:e2081d9de7af | 52 | AFS_16G |
OsmanKameric | 2:e2081d9de7af | 53 | }; |
OsmanKameric | 2:e2081d9de7af | 54 | enum Gscale |
OsmanKameric | 2:e2081d9de7af | 55 | { |
OsmanKameric | 2:e2081d9de7af | 56 | GFS_250DPS=0, |
OsmanKameric | 2:e2081d9de7af | 57 | GFS_500DPS, |
OsmanKameric | 2:e2081d9de7af | 58 | GFS_1000DPS, |
OsmanKameric | 2:e2081d9de7af | 59 | GFS_2000DPS |
OsmanKameric | 2:e2081d9de7af | 60 | }; |
OsmanKameric | 2:e2081d9de7af | 61 | int Gscale = GFS_250DPS; |
OsmanKameric | 2:e2081d9de7af | 62 | float aRes; |
OsmanKameric | 2:e2081d9de7af | 63 | float gRes; |
OsmanKameric | 2:e2081d9de7af | 64 | int Ascale = AFS_2G; |
OsmanKameric | 3:b21c8c3456be | 65 | int16_t ax,ay,az; |
OsmanKameric | 3:b21c8c3456be | 66 | int16_t gx,gy,gz; |
OsmanKameric | 3:b21c8c3456be | 67 | //#define useDebugSerial |
garfieldsg | 0:662207e34fba | 68 | |
garfieldsg | 0:662207e34fba | 69 | //instead of using pgmspace.h |
garfieldsg | 0:662207e34fba | 70 | typedef const unsigned char prog_uchar; |
garfieldsg | 0:662207e34fba | 71 | #define pgm_read_byte_near(x) (*(prog_uchar*)x) |
garfieldsg | 0:662207e34fba | 72 | #define pgm_read_byte(x) (*(prog_uchar*)x) |
garfieldsg | 0:662207e34fba | 73 | |
garfieldsg | 0:662207e34fba | 74 | /** Default constructor, uses default I2C address. |
garfieldsg | 0:662207e34fba | 75 | * @see MPU6050_DEFAULT_ADDRESS |
garfieldsg | 0:662207e34fba | 76 | */ |
OsmanKameric | 3:b21c8c3456be | 77 | MPU6050::MPU6050() |
garfieldsg | 0:662207e34fba | 78 | { |
garfieldsg | 0:662207e34fba | 79 | devAddr = MPU6050_DEFAULT_ADDRESS; |
garfieldsg | 0:662207e34fba | 80 | } |
garfieldsg | 0:662207e34fba | 81 | |
garfieldsg | 0:662207e34fba | 82 | /** Specific address constructor. |
garfieldsg | 0:662207e34fba | 83 | * @param address I2C address |
garfieldsg | 0:662207e34fba | 84 | * @see MPU6050_DEFAULT_ADDRESS |
garfieldsg | 0:662207e34fba | 85 | * @see MPU6050_ADDRESS_AD0_LOW |
garfieldsg | 0:662207e34fba | 86 | * @see MPU6050_ADDRESS_AD0_HIGH |
garfieldsg | 0:662207e34fba | 87 | */ |
OsmanKameric | 3:b21c8c3456be | 88 | MPU6050::MPU6050(uint8_t address) |
garfieldsg | 0:662207e34fba | 89 | { |
garfieldsg | 0:662207e34fba | 90 | devAddr = address; |
garfieldsg | 0:662207e34fba | 91 | } |
garfieldsg | 0:662207e34fba | 92 | |
garfieldsg | 0:662207e34fba | 93 | /** Power on and prepare for general usage. |
garfieldsg | 0:662207e34fba | 94 | * This will activate the device and take it out of sleep mode (which must be done |
garfieldsg | 0:662207e34fba | 95 | * after start-up). This function also sets both the accelerometer and the gyroscope |
garfieldsg | 0:662207e34fba | 96 | * to their most sensitive settings, namely +/- 2g and +/- 250 degrees/sec, and sets |
garfieldsg | 0:662207e34fba | 97 | * the clock source to use the X Gyro for reference, which is slightly better than |
garfieldsg | 0:662207e34fba | 98 | * the default internal clock source. |
garfieldsg | 0:662207e34fba | 99 | */ |
garfieldsg | 0:662207e34fba | 100 | void MPU6050::initialize() |
garfieldsg | 0:662207e34fba | 101 | { |
garfieldsg | 0:662207e34fba | 102 | |
garfieldsg | 0:662207e34fba | 103 | #ifdef useDebugSerial |
garfieldsg | 0:662207e34fba | 104 | debugSerial.printf("MPU6050::initialize start\n"); |
garfieldsg | 0:662207e34fba | 105 | #endif |
OsmanKameric | 2:e2081d9de7af | 106 | //i2Cdev.frequency(400000); // fast i2c: 400 kHz |
OsmanKameric | 2:e2081d9de7af | 107 | |
OsmanKameric | 2:e2081d9de7af | 108 | /* Wake up the device */ |
OsmanKameric | 2:e2081d9de7af | 109 | //i2Cdev.writeByte(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_PWR_MGMT_1, 0x00); // wake up the device by clearing the sleep bit (bit6) |
OsmanKameric | 2:e2081d9de7af | 110 | //wait_ms(100); // wait 100 ms to stabilize |
OsmanKameric | 2:e2081d9de7af | 111 | |
OsmanKameric | 2:e2081d9de7af | 112 | /* Get stable time source */ |
OsmanKameric | 2:e2081d9de7af | 113 | // PLL with X axis gyroscope reference is used to improve stability |
OsmanKameric | 2:e2081d9de7af | 114 | //i2Cdev.writeByte(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_PWR_MGMT_1, 0x01); |
OsmanKameric | 2:e2081d9de7af | 115 | |
OsmanKameric | 2:e2081d9de7af | 116 | /* Configure Gyroscope and Accelerometer */ |
OsmanKameric | 2:e2081d9de7af | 117 | // Disable FSYNC, acc bandwidth: 44 Hz, gyro bandwidth: 42 Hz |
OsmanKameric | 2:e2081d9de7af | 118 | // Sample rates: 1kHz, maximum delay: 4.9ms (which is pretty good for a 200 Hz maximum rate) |
OsmanKameric | 2:e2081d9de7af | 119 | //i2Cdev.writeByte(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_CONFIG, 0x03); |
OsmanKameric | 2:e2081d9de7af | 120 | |
OsmanKameric | 2:e2081d9de7af | 121 | /* Set sample rate = gyroscope output rate/(1+SMPLRT_DIV) */ |
OsmanKameric | 2:e2081d9de7af | 122 | // SMPLRT_DIV=4 and sample rate=200 Hz (compatible with config above) |
OsmanKameric | 2:e2081d9de7af | 123 | //i2Cdev.writeByte(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_SMPLRT_DIV, 0x04); |
OsmanKameric | 2:e2081d9de7af | 124 | |
OsmanKameric | 2:e2081d9de7af | 125 | /* Accelerometer configuration */ |
OsmanKameric | 2:e2081d9de7af | 126 | //uint8_t temp; |
OsmanKameric | 2:e2081d9de7af | 127 | //i2Cdev.readByte(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_ACCEL_CONFIG,&temp); |
OsmanKameric | 2:e2081d9de7af | 128 | //i2Cdev.writeByte(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_ACCEL_CONFIG, temp & ~0xE0); // Clear self-test bits [7:5] |
OsmanKameric | 2:e2081d9de7af | 129 | //i2Cdev.writeByte(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_ACCEL_CONFIG, temp & ~0x18); // Clear AFS bits [4:3] |
OsmanKameric | 2:e2081d9de7af | 130 | //i2Cdev.writeByte(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_ACCEL_CONFIG, temp | Ascale<<3); // Set full scale range |
OsmanKameric | 2:e2081d9de7af | 131 | |
OsmanKameric | 2:e2081d9de7af | 132 | /* Gyroscope configuration */ |
OsmanKameric | 2:e2081d9de7af | 133 | //i2Cdev.readByte(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_GYRO_CONFIG, &temp); |
OsmanKameric | 2:e2081d9de7af | 134 | //i2Cdev.writeByte(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_GYRO_CONFIG, temp & ~0xE0); // Clear self-test bits [7:5] |
OsmanKameric | 2:e2081d9de7af | 135 | //i2Cdev.writeByte(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_GYRO_CONFIG, temp & ~0x18); // Clear FS bits [4:3] |
OsmanKameric | 2:e2081d9de7af | 136 | //i2Cdev.writeByte(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_GYRO_CONFIG, temp | Gscale<<3); // Set full scale range |
garfieldsg | 0:662207e34fba | 137 | setClockSource(MPU6050_CLOCK_PLL_XGYRO); |
garfieldsg | 0:662207e34fba | 138 | setFullScaleGyroRange(MPU6050_GYRO_FS_250); |
garfieldsg | 0:662207e34fba | 139 | setFullScaleAccelRange(MPU6050_ACCEL_FS_2); |
garfieldsg | 0:662207e34fba | 140 | setSleepEnabled(false); // thanks to Jack Elston for pointing this one out! |
OsmanKameric | 3:b21c8c3456be | 141 | |
garfieldsg | 0:662207e34fba | 142 | |
garfieldsg | 0:662207e34fba | 143 | #ifdef useDebugSerial |
garfieldsg | 0:662207e34fba | 144 | debugSerial.printf("MPU6050::initialize end\n"); |
garfieldsg | 0:662207e34fba | 145 | #endif |
garfieldsg | 0:662207e34fba | 146 | } |
garfieldsg | 0:662207e34fba | 147 | |
garfieldsg | 0:662207e34fba | 148 | /** Verify the I2C connection. |
garfieldsg | 0:662207e34fba | 149 | * Make sure the device is connected and responds as expected. |
garfieldsg | 0:662207e34fba | 150 | * @return True if connection is valid, false otherwise |
garfieldsg | 0:662207e34fba | 151 | */ |
garfieldsg | 0:662207e34fba | 152 | bool MPU6050::testConnection() |
garfieldsg | 0:662207e34fba | 153 | { |
garfieldsg | 0:662207e34fba | 154 | #ifdef useDebugSerial |
garfieldsg | 0:662207e34fba | 155 | debugSerial.printf("MPU6050::testConnection start\n"); |
garfieldsg | 0:662207e34fba | 156 | #endif |
garfieldsg | 0:662207e34fba | 157 | uint8_t deviceId = getDeviceID(); |
garfieldsg | 0:662207e34fba | 158 | #ifdef useDebugSerial |
garfieldsg | 0:662207e34fba | 159 | debugSerial.printf("DeviceId = %d\n",deviceId); |
garfieldsg | 0:662207e34fba | 160 | #endif |
garfieldsg | 0:662207e34fba | 161 | return deviceId == 0x34; |
garfieldsg | 0:662207e34fba | 162 | } |
garfieldsg | 0:662207e34fba | 163 | |
OsmanKameric | 2:e2081d9de7af | 164 | void MPU6050::calibrate(float* dest1, float* dest2){ |
OsmanKameric | 2:e2081d9de7af | 165 | uint8_t data[12]; // data array to hold acc and gyro x,y,z data |
OsmanKameric | 2:e2081d9de7af | 166 | uint16_t fifo_count, packet_count, count; |
OsmanKameric | 2:e2081d9de7af | 167 | int32_t accel_bias[3] = {0,0,0}; |
OsmanKameric | 2:e2081d9de7af | 168 | int32_t gyro_bias[3] = {0,0,0}; |
OsmanKameric | 2:e2081d9de7af | 169 | float aRes = 2.0/32768.0; |
OsmanKameric | 2:e2081d9de7af | 170 | float gRes = 250.0/32768.0; |
OsmanKameric | 2:e2081d9de7af | 171 | uint16_t accelsensitivity = 16384; // = 1/aRes = 16384 LSB/g |
OsmanKameric | 2:e2081d9de7af | 172 | //uint16_t gyrosensitivity = 131; // = 1/gRes = 131 LSB/dps |
OsmanKameric | 2:e2081d9de7af | 173 | |
OsmanKameric | 2:e2081d9de7af | 174 | i2Cdev.writeByte(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_PWR_MGMT_1, 0x80); // set bit7 to reset the device |
OsmanKameric | 2:e2081d9de7af | 175 | wait_ms(100); |
OsmanKameric | 2:e2081d9de7af | 176 | |
OsmanKameric | 2:e2081d9de7af | 177 | /*Get stable time source */ |
OsmanKameric | 2:e2081d9de7af | 178 | i2Cdev.writeByte(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_PWR_MGMT_1, 0x01); // PLL with X axis gyroscope reference is used to improve stability |
OsmanKameric | 2:e2081d9de7af | 179 | i2Cdev.writeByte(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_PWR_MGMT_2, 0x00); // Disable accel only low power mode |
OsmanKameric | 2:e2081d9de7af | 180 | wait(0.2); |
OsmanKameric | 2:e2081d9de7af | 181 | |
OsmanKameric | 2:e2081d9de7af | 182 | /* Configure device for bias calculation */ |
OsmanKameric | 2:e2081d9de7af | 183 | i2Cdev.writeByte(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_INT_ENABLE, 0x00); // Disable all interrupts |
OsmanKameric | 2:e2081d9de7af | 184 | i2Cdev.writeByte(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_FIFO_EN, 0x00); // Disable FIFO |
OsmanKameric | 2:e2081d9de7af | 185 | i2Cdev.writeByte(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_PWR_MGMT_1, 0x00); // Turn on internal clock source |
OsmanKameric | 2:e2081d9de7af | 186 | i2Cdev.writeByte(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_I2C_MST_CTRL, 0x00); // Disable I2C master |
OsmanKameric | 2:e2081d9de7af | 187 | i2Cdev.writeByte(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_USER_CTRL, 0x00); // Disable FIFO and I2C master modes |
OsmanKameric | 2:e2081d9de7af | 188 | i2Cdev.writeByte(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_USER_CTRL, 0x04); // Reset FIFO |
OsmanKameric | 2:e2081d9de7af | 189 | wait(0.015); |
OsmanKameric | 2:e2081d9de7af | 190 | |
OsmanKameric | 2:e2081d9de7af | 191 | |
OsmanKameric | 2:e2081d9de7af | 192 | /* Configure accel and gyro for bias calculation */ |
OsmanKameric | 2:e2081d9de7af | 193 | i2Cdev.writeByte(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_CONFIG, 0x01); // Set low-pass filter to 188 Hz |
OsmanKameric | 2:e2081d9de7af | 194 | i2Cdev.writeByte(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_SMPLRT_DIV, 0x00); // Set sample rate to 1 kHz |
OsmanKameric | 2:e2081d9de7af | 195 | i2Cdev.writeByte(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_ACCEL_CONFIG, 0x00); // Set accelerometer full-scale to 2 g, maximum sensitivity |
OsmanKameric | 2:e2081d9de7af | 196 | i2Cdev.writeByte(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_GYRO_CONFIG, 0x00); // Set gyro full-scale to 250 degrees per second, maximum sensitivity |
OsmanKameric | 2:e2081d9de7af | 197 | |
OsmanKameric | 2:e2081d9de7af | 198 | /* Configure FIFO to capture accelerometer and gyro data for bias calculation */ |
OsmanKameric | 2:e2081d9de7af | 199 | i2Cdev.writeByte(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_USER_CTRL, 0x40); // Enable FIFO |
OsmanKameric | 2:e2081d9de7af | 200 | i2Cdev.writeByte(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_FIFO_EN, 0x78); // Enable accelerometer and gyro for FIFO (max size 1024 bytes in MPU-6050) |
OsmanKameric | 2:e2081d9de7af | 201 | wait(0.08); // Sample rate is 1 kHz, accumulates 80 samples in 80 milliseconds. |
OsmanKameric | 2:e2081d9de7af | 202 | // accX: 2 byte, accY: 2 byte, accZ: 2 byte. gyroX: 2 byte, gyroY: 2 byte, gyroZ: 2 byte. 12*80=960 byte < 1024 byte |
OsmanKameric | 2:e2081d9de7af | 203 | |
OsmanKameric | 2:e2081d9de7af | 204 | |
OsmanKameric | 2:e2081d9de7af | 205 | /* At end of sample accumulation, turn off FIFO sensor read */ |
OsmanKameric | 2:e2081d9de7af | 206 | i2Cdev.writeByte(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_FIFO_EN, 0x00); // Disable FIFO |
OsmanKameric | 2:e2081d9de7af | 207 | i2Cdev.readBytes(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_FIFO_COUNTH, 2, &data[0]); // Read FIFO sample count |
OsmanKameric | 2:e2081d9de7af | 208 | fifo_count = ((uint16_t)data[0] << 8) | data[1]; |
OsmanKameric | 2:e2081d9de7af | 209 | packet_count = fifo_count/12; // The number of sets of full acc and gyro data for averaging. packet_count = 80 in this case |
OsmanKameric | 2:e2081d9de7af | 210 | |
OsmanKameric | 2:e2081d9de7af | 211 | for(count=0; count<packet_count; count++) |
OsmanKameric | 2:e2081d9de7af | 212 | { |
OsmanKameric | 2:e2081d9de7af | 213 | int16_t accel_temp[3]={0,0,0}; |
OsmanKameric | 2:e2081d9de7af | 214 | int16_t gyro_temp[3]={0,0,0}; |
OsmanKameric | 2:e2081d9de7af | 215 | i2Cdev.readBytes(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_FIFO_R_W, 12, &data[0]); // read data for averaging |
OsmanKameric | 2:e2081d9de7af | 216 | |
OsmanKameric | 2:e2081d9de7af | 217 | /* Form signed 16-bit integer for each sample in FIFO */ |
OsmanKameric | 2:e2081d9de7af | 218 | accel_temp[0] = (int16_t) (((int16_t)data[0] << 8) | data[1] ) ; |
OsmanKameric | 2:e2081d9de7af | 219 | accel_temp[1] = (int16_t) (((int16_t)data[2] << 8) | data[3] ) ; |
OsmanKameric | 2:e2081d9de7af | 220 | accel_temp[2] = (int16_t) (((int16_t)data[4] << 8) | data[5] ) ; |
OsmanKameric | 2:e2081d9de7af | 221 | gyro_temp[0] = (int16_t) (((int16_t)data[6] << 8) | data[7] ) ; |
OsmanKameric | 2:e2081d9de7af | 222 | gyro_temp[1] = (int16_t) (((int16_t)data[8] << 8) | data[9] ) ; |
OsmanKameric | 2:e2081d9de7af | 223 | gyro_temp[2] = (int16_t) (((int16_t)data[10] << 8) | data[11]) ; |
OsmanKameric | 2:e2081d9de7af | 224 | |
OsmanKameric | 2:e2081d9de7af | 225 | /* Sum individual signed 16-bit biases to get accumulated signed 32-bit biases */ |
OsmanKameric | 2:e2081d9de7af | 226 | accel_bias[0] += (int32_t) accel_temp[0]; |
OsmanKameric | 2:e2081d9de7af | 227 | accel_bias[1] += (int32_t) accel_temp[1]; |
OsmanKameric | 2:e2081d9de7af | 228 | accel_bias[2] += (int32_t) accel_temp[2]; |
OsmanKameric | 2:e2081d9de7af | 229 | gyro_bias[0] += (int32_t) gyro_temp[0]; |
OsmanKameric | 2:e2081d9de7af | 230 | gyro_bias[1] += (int32_t) gyro_temp[1]; |
OsmanKameric | 2:e2081d9de7af | 231 | gyro_bias[2] += (int32_t) gyro_temp[2]; |
OsmanKameric | 2:e2081d9de7af | 232 | } |
OsmanKameric | 2:e2081d9de7af | 233 | /* Normalize sums to get average count biases */ |
OsmanKameric | 2:e2081d9de7af | 234 | accel_bias[0] /= (int32_t) packet_count; |
OsmanKameric | 2:e2081d9de7af | 235 | accel_bias[1] /= (int32_t) packet_count; |
OsmanKameric | 2:e2081d9de7af | 236 | accel_bias[2] /= (int32_t) packet_count; |
OsmanKameric | 2:e2081d9de7af | 237 | gyro_bias[0] /= (int32_t) packet_count; |
OsmanKameric | 2:e2081d9de7af | 238 | gyro_bias[1] /= (int32_t) packet_count; |
OsmanKameric | 2:e2081d9de7af | 239 | gyro_bias[2] /= (int32_t) packet_count; |
OsmanKameric | 2:e2081d9de7af | 240 | |
OsmanKameric | 2:e2081d9de7af | 241 | /* Remove gravity from the z-axis accelerometer bias calculation */ |
OsmanKameric | 2:e2081d9de7af | 242 | if(accel_bias[2] > 0) {accel_bias[2] -= (int32_t) accelsensitivity;} |
OsmanKameric | 2:e2081d9de7af | 243 | else {accel_bias[2] += (int32_t) accelsensitivity;} |
OsmanKameric | 2:e2081d9de7af | 244 | |
OsmanKameric | 2:e2081d9de7af | 245 | /* Output scaled accelerometer biases for manual subtraction in the main program */ |
OsmanKameric | 2:e2081d9de7af | 246 | dest1[0] = accel_bias[0]*aRes; |
OsmanKameric | 2:e2081d9de7af | 247 | dest1[1] = accel_bias[1]*aRes; |
OsmanKameric | 2:e2081d9de7af | 248 | dest1[2] = accel_bias[2]*aRes; |
OsmanKameric | 2:e2081d9de7af | 249 | |
OsmanKameric | 2:e2081d9de7af | 250 | /* Construct the gyro biases for push to the hardware gyro bias registers, which are reset to zero upon device startup */ |
OsmanKameric | 2:e2081d9de7af | 251 | data[0] = (-gyro_bias[0]/4 >> 8) & 0xFF; // Divide by 4 to get 32.9 LSB per deg/s to conform to expected bias input format |
OsmanKameric | 2:e2081d9de7af | 252 | data[1] = (-gyro_bias[0]/4) & 0xFF; // Biases are additive, so change sign on calculated average gyro biases |
OsmanKameric | 2:e2081d9de7af | 253 | data[2] = (-gyro_bias[1]/4 >> 8) & 0xFF; |
OsmanKameric | 2:e2081d9de7af | 254 | data[3] = (-gyro_bias[1]/4) & 0xFF; |
OsmanKameric | 2:e2081d9de7af | 255 | data[4] = (-gyro_bias[2]/4 >> 8) & 0xFF; |
OsmanKameric | 2:e2081d9de7af | 256 | data[5] = (-gyro_bias[2]/4) & 0xFF; |
OsmanKameric | 2:e2081d9de7af | 257 | |
OsmanKameric | 2:e2081d9de7af | 258 | /* Push gyro biases to hardware registers */ |
OsmanKameric | 2:e2081d9de7af | 259 | i2Cdev.writeByte(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_XG_OFFS_USRH, data[0]); |
OsmanKameric | 2:e2081d9de7af | 260 | i2Cdev.writeByte(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_XG_OFFS_USRL, data[1]); |
OsmanKameric | 2:e2081d9de7af | 261 | i2Cdev.writeByte(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_YG_OFFS_USRH, data[2]); |
OsmanKameric | 2:e2081d9de7af | 262 | i2Cdev.writeByte(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_YG_OFFS_USRL, data[3]); |
OsmanKameric | 2:e2081d9de7af | 263 | i2Cdev.writeByte(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_ZG_OFFS_USRH, data[4]); |
OsmanKameric | 2:e2081d9de7af | 264 | i2Cdev.writeByte(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_ZG_OFFS_USRL, data[5]); |
OsmanKameric | 2:e2081d9de7af | 265 | |
OsmanKameric | 2:e2081d9de7af | 266 | /* Construct gyro bias in deg/s for later manual subtraction */ |
OsmanKameric | 2:e2081d9de7af | 267 | dest2[0] = gyro_bias[0]*gRes; |
OsmanKameric | 2:e2081d9de7af | 268 | dest2[1] = gyro_bias[1]*gRes; |
OsmanKameric | 2:e2081d9de7af | 269 | dest2[2] = gyro_bias[2]*gRes; |
OsmanKameric | 2:e2081d9de7af | 270 | } |
OsmanKameric | 2:e2081d9de7af | 271 | void MPU6050::readAccelData(int16_t* dest) |
OsmanKameric | 2:e2081d9de7af | 272 | { |
OsmanKameric | 2:e2081d9de7af | 273 | uint8_t rawData[6]; // x,y,z acc data |
OsmanKameric | 2:e2081d9de7af | 274 | i2Cdev.readBytes(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_ACCEL_XOUT_H, 6, &rawData[0]); // read six raw data registers sequentially and write them into data array |
OsmanKameric | 2:e2081d9de7af | 275 | |
OsmanKameric | 2:e2081d9de7af | 276 | /* Turn the MSB LSB into signed 16-bit value */ |
OsmanKameric | 2:e2081d9de7af | 277 | dest[0] = (int16_t)(((int16_t)rawData[0]<<8) | rawData[1]); // ACCEL_XOUT |
OsmanKameric | 2:e2081d9de7af | 278 | dest[1] = (int16_t)(((int16_t)rawData[2]<<8) | rawData[3]); // ACCEL_YOUT |
OsmanKameric | 2:e2081d9de7af | 279 | dest[2] = (int16_t)(((int16_t)rawData[4]<<8) | rawData[5]); // ACCEL_ZOUT |
OsmanKameric | 2:e2081d9de7af | 280 | } |
OsmanKameric | 2:e2081d9de7af | 281 | void MPU6050::readGyroData(int16_t* dest) |
OsmanKameric | 2:e2081d9de7af | 282 | { |
OsmanKameric | 2:e2081d9de7af | 283 | uint8_t rawData[6]; // x,y,z gyro data |
OsmanKameric | 2:e2081d9de7af | 284 | i2Cdev.readBytes(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_GYRO_XOUT_H, 6, &rawData[0]); // read the six raw data registers sequentially and write them into data array |
OsmanKameric | 2:e2081d9de7af | 285 | |
OsmanKameric | 2:e2081d9de7af | 286 | /* Turn the MSB LSB into signed 16-bit value */ |
OsmanKameric | 2:e2081d9de7af | 287 | dest[0] = (int16_t)(((int16_t)rawData[0]<<8) | rawData[1]); // GYRO_XOUT |
OsmanKameric | 2:e2081d9de7af | 288 | dest[1] = (int16_t)(((int16_t)rawData[2]<<8) | rawData[3]); // GYRO_YOUT |
OsmanKameric | 2:e2081d9de7af | 289 | dest[2] = (int16_t)(((int16_t)rawData[4]<<8) | rawData[5]); // GYRO_ZOUT |
OsmanKameric | 2:e2081d9de7af | 290 | } |
OsmanKameric | 2:e2081d9de7af | 291 | void MPU6050::getGres() |
OsmanKameric | 2:e2081d9de7af | 292 | { |
OsmanKameric | 2:e2081d9de7af | 293 | switch(Gscale) |
OsmanKameric | 2:e2081d9de7af | 294 | { |
OsmanKameric | 2:e2081d9de7af | 295 | case GFS_250DPS: |
OsmanKameric | 2:e2081d9de7af | 296 | gRes = 250.0/32768.0; |
OsmanKameric | 2:e2081d9de7af | 297 | break; |
OsmanKameric | 2:e2081d9de7af | 298 | case GFS_500DPS: |
OsmanKameric | 2:e2081d9de7af | 299 | gRes = 500.0/32768.0; |
OsmanKameric | 2:e2081d9de7af | 300 | break; |
OsmanKameric | 2:e2081d9de7af | 301 | case GFS_1000DPS: |
OsmanKameric | 2:e2081d9de7af | 302 | gRes = 1000.0/32768.0; |
OsmanKameric | 2:e2081d9de7af | 303 | break; |
OsmanKameric | 2:e2081d9de7af | 304 | case GFS_2000DPS: |
OsmanKameric | 2:e2081d9de7af | 305 | gRes = 2000.0/32768.0; |
OsmanKameric | 2:e2081d9de7af | 306 | break; |
OsmanKameric | 2:e2081d9de7af | 307 | } |
OsmanKameric | 2:e2081d9de7af | 308 | } |
OsmanKameric | 2:e2081d9de7af | 309 | void MPU6050::getAres() |
OsmanKameric | 2:e2081d9de7af | 310 | { |
OsmanKameric | 2:e2081d9de7af | 311 | switch(Ascale) |
OsmanKameric | 2:e2081d9de7af | 312 | { |
OsmanKameric | 2:e2081d9de7af | 313 | case AFS_2G: |
OsmanKameric | 2:e2081d9de7af | 314 | aRes = 2.0/32768.0; |
OsmanKameric | 2:e2081d9de7af | 315 | break; |
OsmanKameric | 2:e2081d9de7af | 316 | case AFS_4G: |
OsmanKameric | 2:e2081d9de7af | 317 | aRes = 4.0/32768.0; |
OsmanKameric | 2:e2081d9de7af | 318 | break; |
OsmanKameric | 2:e2081d9de7af | 319 | case AFS_8G: |
OsmanKameric | 2:e2081d9de7af | 320 | aRes = 8.0/32768.0; |
OsmanKameric | 2:e2081d9de7af | 321 | break; |
OsmanKameric | 2:e2081d9de7af | 322 | case AFS_16G: |
OsmanKameric | 2:e2081d9de7af | 323 | aRes = 16.0/32768.0; |
OsmanKameric | 2:e2081d9de7af | 324 | break; |
OsmanKameric | 2:e2081d9de7af | 325 | } |
OsmanKameric | 2:e2081d9de7af | 326 | } |
garfieldsg | 0:662207e34fba | 327 | // AUX_VDDIO register (InvenSense demo code calls this RA_*G_OFFS_TC) |
garfieldsg | 0:662207e34fba | 328 | |
garfieldsg | 0:662207e34fba | 329 | /** Get the auxiliary I2C supply voltage level. |
garfieldsg | 0:662207e34fba | 330 | * When set to 1, the auxiliary I2C bus high logic level is VDD. When cleared to |
garfieldsg | 0:662207e34fba | 331 | * 0, the auxiliary I2C bus high logic level is VLOGIC. This does not apply to |
garfieldsg | 0:662207e34fba | 332 | * the MPU-6000, which does not have a VLOGIC pin. |
garfieldsg | 0:662207e34fba | 333 | * @return I2C supply voltage level (0=VLOGIC, 1=VDD) |
garfieldsg | 0:662207e34fba | 334 | */ |
garfieldsg | 0:662207e34fba | 335 | uint8_t MPU6050::getAuxVDDIOLevel() |
garfieldsg | 0:662207e34fba | 336 | { |
garfieldsg | 0:662207e34fba | 337 | i2Cdev.readBit(devAddr, MPU6050_RA_YG_OFFS_TC, MPU6050_TC_PWR_MODE_BIT, buffer); |
garfieldsg | 0:662207e34fba | 338 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 339 | } |
garfieldsg | 0:662207e34fba | 340 | /** Set the auxiliary I2C supply voltage level. |
garfieldsg | 0:662207e34fba | 341 | * When set to 1, the auxiliary I2C bus high logic level is VDD. When cleared to |
garfieldsg | 0:662207e34fba | 342 | * 0, the auxiliary I2C bus high logic level is VLOGIC. This does not apply to |
garfieldsg | 0:662207e34fba | 343 | * the MPU-6000, which does not have a VLOGIC pin. |
garfieldsg | 0:662207e34fba | 344 | * @param level I2C supply voltage level (0=VLOGIC, 1=VDD) |
garfieldsg | 0:662207e34fba | 345 | */ |
garfieldsg | 0:662207e34fba | 346 | void MPU6050::setAuxVDDIOLevel(uint8_t level) |
garfieldsg | 0:662207e34fba | 347 | { |
garfieldsg | 0:662207e34fba | 348 | i2Cdev.writeBit(devAddr, MPU6050_RA_YG_OFFS_TC, MPU6050_TC_PWR_MODE_BIT, level); |
garfieldsg | 0:662207e34fba | 349 | } |
garfieldsg | 0:662207e34fba | 350 | |
garfieldsg | 0:662207e34fba | 351 | // SMPLRT_DIV register |
garfieldsg | 0:662207e34fba | 352 | |
garfieldsg | 0:662207e34fba | 353 | /** Get gyroscope output rate divider. |
garfieldsg | 0:662207e34fba | 354 | * The sensor register output, FIFO output, DMP sampling, Motion detection, Zero |
garfieldsg | 0:662207e34fba | 355 | * Motion detection, and Free Fall detection are all based on the Sample Rate. |
garfieldsg | 0:662207e34fba | 356 | * The Sample Rate is generated by dividing the gyroscope output rate by |
garfieldsg | 0:662207e34fba | 357 | * SMPLRT_DIV: |
garfieldsg | 0:662207e34fba | 358 | * |
garfieldsg | 0:662207e34fba | 359 | * Sample Rate = Gyroscope Output Rate / (1 + SMPLRT_DIV) |
garfieldsg | 0:662207e34fba | 360 | * |
garfieldsg | 0:662207e34fba | 361 | * where Gyroscope Output Rate = 8kHz when the DLPF is disabled (DLPF_CFG = 0 or |
garfieldsg | 0:662207e34fba | 362 | * 7), and 1kHz when the DLPF is enabled (see Register 26). |
garfieldsg | 0:662207e34fba | 363 | * |
garfieldsg | 0:662207e34fba | 364 | * Note: The accelerometer output rate is 1kHz. This means that for a Sample |
garfieldsg | 0:662207e34fba | 365 | * Rate greater than 1kHz, the same accelerometer sample may be output to the |
garfieldsg | 0:662207e34fba | 366 | * FIFO, DMP, and sensor registers more than once. |
garfieldsg | 0:662207e34fba | 367 | * |
garfieldsg | 0:662207e34fba | 368 | * For a diagram of the gyroscope and accelerometer signal paths, see Section 8 |
garfieldsg | 0:662207e34fba | 369 | * of the MPU-6000/MPU-6050 Product Specification document. |
garfieldsg | 0:662207e34fba | 370 | * |
garfieldsg | 0:662207e34fba | 371 | * @return Current sample rate |
garfieldsg | 0:662207e34fba | 372 | * @see MPU6050_RA_SMPLRT_DIV |
garfieldsg | 0:662207e34fba | 373 | */ |
garfieldsg | 0:662207e34fba | 374 | uint8_t MPU6050::getRate() |
garfieldsg | 0:662207e34fba | 375 | { |
garfieldsg | 0:662207e34fba | 376 | i2Cdev.readByte(devAddr, MPU6050_RA_SMPLRT_DIV, buffer); |
garfieldsg | 0:662207e34fba | 377 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 378 | } |
garfieldsg | 0:662207e34fba | 379 | /** Set gyroscope sample rate divider. |
garfieldsg | 0:662207e34fba | 380 | * @param rate New sample rate divider |
garfieldsg | 0:662207e34fba | 381 | * @see getRate() |
garfieldsg | 0:662207e34fba | 382 | * @see MPU6050_RA_SMPLRT_DIV |
garfieldsg | 0:662207e34fba | 383 | */ |
garfieldsg | 0:662207e34fba | 384 | void MPU6050::setRate(uint8_t rate) |
garfieldsg | 0:662207e34fba | 385 | { |
garfieldsg | 0:662207e34fba | 386 | i2Cdev.writeByte(devAddr, MPU6050_RA_SMPLRT_DIV, rate); |
garfieldsg | 0:662207e34fba | 387 | } |
garfieldsg | 0:662207e34fba | 388 | |
garfieldsg | 0:662207e34fba | 389 | // CONFIG register |
garfieldsg | 0:662207e34fba | 390 | |
garfieldsg | 0:662207e34fba | 391 | /** Get external FSYNC configuration. |
garfieldsg | 0:662207e34fba | 392 | * Configures the external Frame Synchronization (FSYNC) pin sampling. An |
garfieldsg | 0:662207e34fba | 393 | * external signal connected to the FSYNC pin can be sampled by configuring |
garfieldsg | 0:662207e34fba | 394 | * EXT_SYNC_SET. Signal changes to the FSYNC pin are latched so that short |
garfieldsg | 0:662207e34fba | 395 | * strobes may be captured. The latched FSYNC signal will be sampled at the |
garfieldsg | 0:662207e34fba | 396 | * Sampling Rate, as defined in register 25. After sampling, the latch will |
garfieldsg | 0:662207e34fba | 397 | * reset to the current FSYNC signal state. |
garfieldsg | 0:662207e34fba | 398 | * |
garfieldsg | 0:662207e34fba | 399 | * The sampled value will be reported in place of the least significant bit in |
garfieldsg | 0:662207e34fba | 400 | * a sensor data register determined by the value of EXT_SYNC_SET according to |
garfieldsg | 0:662207e34fba | 401 | * the following table. |
garfieldsg | 0:662207e34fba | 402 | * |
garfieldsg | 0:662207e34fba | 403 | * <pre> |
garfieldsg | 0:662207e34fba | 404 | * EXT_SYNC_SET | FSYNC Bit Location |
garfieldsg | 0:662207e34fba | 405 | * -------------+------------------- |
garfieldsg | 0:662207e34fba | 406 | * 0 | Input disabled |
garfieldsg | 0:662207e34fba | 407 | * 1 | TEMP_OUT_L[0] |
garfieldsg | 0:662207e34fba | 408 | * 2 | GYRO_XOUT_L[0] |
garfieldsg | 0:662207e34fba | 409 | * 3 | GYRO_YOUT_L[0] |
garfieldsg | 0:662207e34fba | 410 | * 4 | GYRO_ZOUT_L[0] |
garfieldsg | 0:662207e34fba | 411 | * 5 | ACCEL_XOUT_L[0] |
garfieldsg | 0:662207e34fba | 412 | * 6 | ACCEL_YOUT_L[0] |
garfieldsg | 0:662207e34fba | 413 | * 7 | ACCEL_ZOUT_L[0] |
garfieldsg | 0:662207e34fba | 414 | * </pre> |
garfieldsg | 0:662207e34fba | 415 | * |
garfieldsg | 0:662207e34fba | 416 | * @return FSYNC configuration value |
garfieldsg | 0:662207e34fba | 417 | */ |
garfieldsg | 0:662207e34fba | 418 | uint8_t MPU6050::getExternalFrameSync() |
garfieldsg | 0:662207e34fba | 419 | { |
garfieldsg | 0:662207e34fba | 420 | i2Cdev.readBits(devAddr, MPU6050_RA_CONFIG, MPU6050_CFG_EXT_SYNC_SET_BIT, MPU6050_CFG_EXT_SYNC_SET_LENGTH, buffer); |
garfieldsg | 0:662207e34fba | 421 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 422 | } |
garfieldsg | 0:662207e34fba | 423 | /** Set external FSYNC configuration. |
garfieldsg | 0:662207e34fba | 424 | * @see getExternalFrameSync() |
garfieldsg | 0:662207e34fba | 425 | * @see MPU6050_RA_CONFIG |
garfieldsg | 0:662207e34fba | 426 | * @param sync New FSYNC configuration value |
garfieldsg | 0:662207e34fba | 427 | */ |
garfieldsg | 0:662207e34fba | 428 | void MPU6050::setExternalFrameSync(uint8_t sync) |
garfieldsg | 0:662207e34fba | 429 | { |
garfieldsg | 0:662207e34fba | 430 | i2Cdev.writeBits(devAddr, MPU6050_RA_CONFIG, MPU6050_CFG_EXT_SYNC_SET_BIT, MPU6050_CFG_EXT_SYNC_SET_LENGTH, sync); |
garfieldsg | 0:662207e34fba | 431 | } |
garfieldsg | 0:662207e34fba | 432 | /** Get digital low-pass filter configuration. |
garfieldsg | 0:662207e34fba | 433 | * The DLPF_CFG parameter sets the digital low pass filter configuration. It |
garfieldsg | 0:662207e34fba | 434 | * also determines the internal sampling rate used by the device as shown in |
garfieldsg | 0:662207e34fba | 435 | * the table below. |
garfieldsg | 0:662207e34fba | 436 | * |
garfieldsg | 0:662207e34fba | 437 | * Note: The accelerometer output rate is 1kHz. This means that for a Sample |
garfieldsg | 0:662207e34fba | 438 | * Rate greater than 1kHz, the same accelerometer sample may be output to the |
garfieldsg | 0:662207e34fba | 439 | * FIFO, DMP, and sensor registers more than once. |
garfieldsg | 0:662207e34fba | 440 | * |
garfieldsg | 0:662207e34fba | 441 | * <pre> |
garfieldsg | 0:662207e34fba | 442 | * | ACCELEROMETER | GYROSCOPE |
garfieldsg | 0:662207e34fba | 443 | * DLPF_CFG | Bandwidth | Delay | Bandwidth | Delay | Sample Rate |
garfieldsg | 0:662207e34fba | 444 | * ---------+-----------+--------+-----------+--------+------------- |
garfieldsg | 0:662207e34fba | 445 | * 0 | 260Hz | 0ms | 256Hz | 0.98ms | 8kHz |
garfieldsg | 0:662207e34fba | 446 | * 1 | 184Hz | 2.0ms | 188Hz | 1.9ms | 1kHz |
garfieldsg | 0:662207e34fba | 447 | * 2 | 94Hz | 3.0ms | 98Hz | 2.8ms | 1kHz |
garfieldsg | 0:662207e34fba | 448 | * 3 | 44Hz | 4.9ms | 42Hz | 4.8ms | 1kHz |
garfieldsg | 0:662207e34fba | 449 | * 4 | 21Hz | 8.5ms | 20Hz | 8.3ms | 1kHz |
garfieldsg | 0:662207e34fba | 450 | * 5 | 10Hz | 13.8ms | 10Hz | 13.4ms | 1kHz |
garfieldsg | 0:662207e34fba | 451 | * 6 | 5Hz | 19.0ms | 5Hz | 18.6ms | 1kHz |
garfieldsg | 0:662207e34fba | 452 | * 7 | -- Reserved -- | -- Reserved -- | Reserved |
garfieldsg | 0:662207e34fba | 453 | * </pre> |
garfieldsg | 0:662207e34fba | 454 | * |
garfieldsg | 0:662207e34fba | 455 | * @return DLFP configuration |
garfieldsg | 0:662207e34fba | 456 | * @see MPU6050_RA_CONFIG |
garfieldsg | 0:662207e34fba | 457 | * @see MPU6050_CFG_DLPF_CFG_BIT |
garfieldsg | 0:662207e34fba | 458 | * @see MPU6050_CFG_DLPF_CFG_LENGTH |
garfieldsg | 0:662207e34fba | 459 | */ |
garfieldsg | 0:662207e34fba | 460 | uint8_t MPU6050::getDLPFMode() |
garfieldsg | 0:662207e34fba | 461 | { |
garfieldsg | 0:662207e34fba | 462 | i2Cdev.readBits(devAddr, MPU6050_RA_CONFIG, MPU6050_CFG_DLPF_CFG_BIT, MPU6050_CFG_DLPF_CFG_LENGTH, buffer); |
garfieldsg | 0:662207e34fba | 463 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 464 | } |
garfieldsg | 0:662207e34fba | 465 | /** Set digital low-pass filter configuration. |
garfieldsg | 0:662207e34fba | 466 | * @param mode New DLFP configuration setting |
garfieldsg | 0:662207e34fba | 467 | * @see getDLPFBandwidth() |
garfieldsg | 0:662207e34fba | 468 | * @see MPU6050_DLPF_BW_256 |
garfieldsg | 0:662207e34fba | 469 | * @see MPU6050_RA_CONFIG |
garfieldsg | 0:662207e34fba | 470 | * @see MPU6050_CFG_DLPF_CFG_BIT |
garfieldsg | 0:662207e34fba | 471 | * @see MPU6050_CFG_DLPF_CFG_LENGTH |
garfieldsg | 0:662207e34fba | 472 | */ |
garfieldsg | 0:662207e34fba | 473 | void MPU6050::setDLPFMode(uint8_t mode) |
garfieldsg | 0:662207e34fba | 474 | { |
garfieldsg | 0:662207e34fba | 475 | i2Cdev.writeBits(devAddr, MPU6050_RA_CONFIG, MPU6050_CFG_DLPF_CFG_BIT, MPU6050_CFG_DLPF_CFG_LENGTH, mode); |
garfieldsg | 0:662207e34fba | 476 | } |
garfieldsg | 0:662207e34fba | 477 | |
garfieldsg | 0:662207e34fba | 478 | // GYRO_CONFIG register |
garfieldsg | 0:662207e34fba | 479 | |
garfieldsg | 0:662207e34fba | 480 | /** Get full-scale gyroscope range. |
garfieldsg | 0:662207e34fba | 481 | * The FS_SEL parameter allows setting the full-scale range of the gyro sensors, |
garfieldsg | 0:662207e34fba | 482 | * as described in the table below. |
garfieldsg | 0:662207e34fba | 483 | * |
garfieldsg | 0:662207e34fba | 484 | * <pre> |
garfieldsg | 0:662207e34fba | 485 | * 0 = +/- 250 degrees/sec |
garfieldsg | 0:662207e34fba | 486 | * 1 = +/- 500 degrees/sec |
garfieldsg | 0:662207e34fba | 487 | * 2 = +/- 1000 degrees/sec |
garfieldsg | 0:662207e34fba | 488 | * 3 = +/- 2000 degrees/sec |
garfieldsg | 0:662207e34fba | 489 | * </pre> |
garfieldsg | 0:662207e34fba | 490 | * |
garfieldsg | 0:662207e34fba | 491 | * @return Current full-scale gyroscope range setting |
garfieldsg | 0:662207e34fba | 492 | * @see MPU6050_GYRO_FS_250 |
garfieldsg | 0:662207e34fba | 493 | * @see MPU6050_RA_GYRO_CONFIG |
garfieldsg | 0:662207e34fba | 494 | * @see MPU6050_GCONFIG_FS_SEL_BIT |
garfieldsg | 0:662207e34fba | 495 | * @see MPU6050_GCONFIG_FS_SEL_LENGTH |
garfieldsg | 0:662207e34fba | 496 | */ |
garfieldsg | 0:662207e34fba | 497 | uint8_t MPU6050::getFullScaleGyroRange() |
garfieldsg | 0:662207e34fba | 498 | { |
garfieldsg | 0:662207e34fba | 499 | i2Cdev.readBits(devAddr, MPU6050_RA_GYRO_CONFIG, MPU6050_GCONFIG_FS_SEL_BIT, MPU6050_GCONFIG_FS_SEL_LENGTH, buffer); |
garfieldsg | 0:662207e34fba | 500 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 501 | } |
garfieldsg | 0:662207e34fba | 502 | /** Set full-scale gyroscope range. |
garfieldsg | 0:662207e34fba | 503 | * @param range New full-scale gyroscope range value |
garfieldsg | 0:662207e34fba | 504 | * @see getFullScaleRange() |
garfieldsg | 0:662207e34fba | 505 | * @see MPU6050_GYRO_FS_250 |
garfieldsg | 0:662207e34fba | 506 | * @see MPU6050_RA_GYRO_CONFIG |
garfieldsg | 0:662207e34fba | 507 | * @see MPU6050_GCONFIG_FS_SEL_BIT |
garfieldsg | 0:662207e34fba | 508 | * @see MPU6050_GCONFIG_FS_SEL_LENGTH |
garfieldsg | 0:662207e34fba | 509 | */ |
garfieldsg | 0:662207e34fba | 510 | void MPU6050::setFullScaleGyroRange(uint8_t range) |
garfieldsg | 0:662207e34fba | 511 | { |
garfieldsg | 0:662207e34fba | 512 | i2Cdev.writeBits(devAddr, MPU6050_RA_GYRO_CONFIG, MPU6050_GCONFIG_FS_SEL_BIT, MPU6050_GCONFIG_FS_SEL_LENGTH, range); |
garfieldsg | 0:662207e34fba | 513 | } |
garfieldsg | 0:662207e34fba | 514 | |
garfieldsg | 0:662207e34fba | 515 | // ACCEL_CONFIG register |
garfieldsg | 0:662207e34fba | 516 | |
garfieldsg | 0:662207e34fba | 517 | /** Get self-test enabled setting for accelerometer X axis. |
garfieldsg | 0:662207e34fba | 518 | * @return Self-test enabled value |
garfieldsg | 0:662207e34fba | 519 | * @see MPU6050_RA_ACCEL_CONFIG |
garfieldsg | 0:662207e34fba | 520 | */ |
garfieldsg | 0:662207e34fba | 521 | bool MPU6050::getAccelXSelfTest() |
garfieldsg | 0:662207e34fba | 522 | { |
garfieldsg | 0:662207e34fba | 523 | i2Cdev.readBit(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_XA_ST_BIT, buffer); |
garfieldsg | 0:662207e34fba | 524 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 525 | } |
garfieldsg | 0:662207e34fba | 526 | /** Get self-test enabled setting for accelerometer X axis. |
garfieldsg | 0:662207e34fba | 527 | * @param enabled Self-test enabled value |
garfieldsg | 0:662207e34fba | 528 | * @see MPU6050_RA_ACCEL_CONFIG |
garfieldsg | 0:662207e34fba | 529 | */ |
garfieldsg | 0:662207e34fba | 530 | void MPU6050::setAccelXSelfTest(bool enabled) |
garfieldsg | 0:662207e34fba | 531 | { |
garfieldsg | 0:662207e34fba | 532 | i2Cdev.writeBit(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_XA_ST_BIT, enabled); |
garfieldsg | 0:662207e34fba | 533 | } |
garfieldsg | 0:662207e34fba | 534 | /** Get self-test enabled value for accelerometer Y axis. |
garfieldsg | 0:662207e34fba | 535 | * @return Self-test enabled value |
garfieldsg | 0:662207e34fba | 536 | * @see MPU6050_RA_ACCEL_CONFIG |
garfieldsg | 0:662207e34fba | 537 | */ |
garfieldsg | 0:662207e34fba | 538 | bool MPU6050::getAccelYSelfTest() |
garfieldsg | 0:662207e34fba | 539 | { |
garfieldsg | 0:662207e34fba | 540 | i2Cdev.readBit(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_YA_ST_BIT, buffer); |
garfieldsg | 0:662207e34fba | 541 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 542 | } |
garfieldsg | 0:662207e34fba | 543 | /** Get self-test enabled value for accelerometer Y axis. |
garfieldsg | 0:662207e34fba | 544 | * @param enabled Self-test enabled value |
garfieldsg | 0:662207e34fba | 545 | * @see MPU6050_RA_ACCEL_CONFIG |
garfieldsg | 0:662207e34fba | 546 | */ |
garfieldsg | 0:662207e34fba | 547 | void MPU6050::setAccelYSelfTest(bool enabled) |
garfieldsg | 0:662207e34fba | 548 | { |
garfieldsg | 0:662207e34fba | 549 | i2Cdev.writeBit(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_YA_ST_BIT, enabled); |
garfieldsg | 0:662207e34fba | 550 | } |
garfieldsg | 0:662207e34fba | 551 | /** Get self-test enabled value for accelerometer Z axis. |
garfieldsg | 0:662207e34fba | 552 | * @return Self-test enabled value |
garfieldsg | 0:662207e34fba | 553 | * @see MPU6050_RA_ACCEL_CONFIG |
garfieldsg | 0:662207e34fba | 554 | */ |
garfieldsg | 0:662207e34fba | 555 | bool MPU6050::getAccelZSelfTest() |
garfieldsg | 0:662207e34fba | 556 | { |
garfieldsg | 0:662207e34fba | 557 | i2Cdev.readBit(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_ZA_ST_BIT, buffer); |
garfieldsg | 0:662207e34fba | 558 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 559 | } |
garfieldsg | 0:662207e34fba | 560 | /** Set self-test enabled value for accelerometer Z axis. |
garfieldsg | 0:662207e34fba | 561 | * @param enabled Self-test enabled value |
garfieldsg | 0:662207e34fba | 562 | * @see MPU6050_RA_ACCEL_CONFIG |
garfieldsg | 0:662207e34fba | 563 | */ |
garfieldsg | 0:662207e34fba | 564 | void MPU6050::setAccelZSelfTest(bool enabled) |
garfieldsg | 0:662207e34fba | 565 | { |
garfieldsg | 0:662207e34fba | 566 | i2Cdev.writeBit(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_ZA_ST_BIT, enabled); |
garfieldsg | 0:662207e34fba | 567 | } |
garfieldsg | 0:662207e34fba | 568 | /** Get full-scale accelerometer range. |
garfieldsg | 0:662207e34fba | 569 | * The FS_SEL parameter allows setting the full-scale range of the accelerometer |
garfieldsg | 0:662207e34fba | 570 | * sensors, as described in the table below. |
garfieldsg | 0:662207e34fba | 571 | * |
garfieldsg | 0:662207e34fba | 572 | * <pre> |
garfieldsg | 0:662207e34fba | 573 | * 0 = +/- 2g |
garfieldsg | 0:662207e34fba | 574 | * 1 = +/- 4g |
garfieldsg | 0:662207e34fba | 575 | * 2 = +/- 8g |
garfieldsg | 0:662207e34fba | 576 | * 3 = +/- 16g |
garfieldsg | 0:662207e34fba | 577 | * </pre> |
garfieldsg | 0:662207e34fba | 578 | * |
garfieldsg | 0:662207e34fba | 579 | * @return Current full-scale accelerometer range setting |
garfieldsg | 0:662207e34fba | 580 | * @see MPU6050_ACCEL_FS_2 |
garfieldsg | 0:662207e34fba | 581 | * @see MPU6050_RA_ACCEL_CONFIG |
garfieldsg | 0:662207e34fba | 582 | * @see MPU6050_ACONFIG_AFS_SEL_BIT |
garfieldsg | 0:662207e34fba | 583 | * @see MPU6050_ACONFIG_AFS_SEL_LENGTH |
garfieldsg | 0:662207e34fba | 584 | */ |
garfieldsg | 0:662207e34fba | 585 | uint8_t MPU6050::getFullScaleAccelRange() |
garfieldsg | 0:662207e34fba | 586 | { |
garfieldsg | 0:662207e34fba | 587 | i2Cdev.readBits(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_AFS_SEL_BIT, MPU6050_ACONFIG_AFS_SEL_LENGTH, buffer); |
garfieldsg | 0:662207e34fba | 588 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 589 | } |
garfieldsg | 0:662207e34fba | 590 | /** Set full-scale accelerometer range. |
garfieldsg | 0:662207e34fba | 591 | * @param range New full-scale accelerometer range setting |
garfieldsg | 0:662207e34fba | 592 | * @see getFullScaleAccelRange() |
garfieldsg | 0:662207e34fba | 593 | */ |
garfieldsg | 0:662207e34fba | 594 | void MPU6050::setFullScaleAccelRange(uint8_t range) |
garfieldsg | 0:662207e34fba | 595 | { |
garfieldsg | 0:662207e34fba | 596 | i2Cdev.writeBits(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_AFS_SEL_BIT, MPU6050_ACONFIG_AFS_SEL_LENGTH, range); |
garfieldsg | 0:662207e34fba | 597 | } |
garfieldsg | 0:662207e34fba | 598 | /** Get the high-pass filter configuration. |
garfieldsg | 0:662207e34fba | 599 | * The DHPF is a filter module in the path leading to motion detectors (Free |
garfieldsg | 0:662207e34fba | 600 | * Fall, Motion threshold, and Zero Motion). The high pass filter output is not |
garfieldsg | 0:662207e34fba | 601 | * available to the data registers (see Figure in Section 8 of the MPU-6000/ |
garfieldsg | 0:662207e34fba | 602 | * MPU-6050 Product Specification document). |
garfieldsg | 0:662207e34fba | 603 | * |
garfieldsg | 0:662207e34fba | 604 | * The high pass filter has three modes: |
garfieldsg | 0:662207e34fba | 605 | * |
garfieldsg | 0:662207e34fba | 606 | * <pre> |
garfieldsg | 0:662207e34fba | 607 | * Reset: The filter output settles to zero within one sample. This |
garfieldsg | 0:662207e34fba | 608 | * effectively disables the high pass filter. This mode may be toggled |
garfieldsg | 0:662207e34fba | 609 | * to quickly settle the filter. |
garfieldsg | 0:662207e34fba | 610 | * |
garfieldsg | 0:662207e34fba | 611 | * On: The high pass filter will pass signals above the cut off frequency. |
garfieldsg | 0:662207e34fba | 612 | * |
garfieldsg | 0:662207e34fba | 613 | * Hold: When triggered, the filter holds the present sample. The filter |
garfieldsg | 0:662207e34fba | 614 | * output will be the difference between the input sample and the held |
garfieldsg | 0:662207e34fba | 615 | * sample. |
garfieldsg | 0:662207e34fba | 616 | * </pre> |
garfieldsg | 0:662207e34fba | 617 | * |
garfieldsg | 0:662207e34fba | 618 | * <pre> |
garfieldsg | 0:662207e34fba | 619 | * ACCEL_HPF | Filter Mode | Cut-off Frequency |
garfieldsg | 0:662207e34fba | 620 | * ----------+-------------+------------------ |
garfieldsg | 0:662207e34fba | 621 | * 0 | Reset | None |
garfieldsg | 0:662207e34fba | 622 | * 1 | On | 5Hz |
garfieldsg | 0:662207e34fba | 623 | * 2 | On | 2.5Hz |
garfieldsg | 0:662207e34fba | 624 | * 3 | On | 1.25Hz |
garfieldsg | 0:662207e34fba | 625 | * 4 | On | 0.63Hz |
garfieldsg | 0:662207e34fba | 626 | * 7 | Hold | None |
garfieldsg | 0:662207e34fba | 627 | * </pre> |
garfieldsg | 0:662207e34fba | 628 | * |
garfieldsg | 0:662207e34fba | 629 | * @return Current high-pass filter configuration |
garfieldsg | 0:662207e34fba | 630 | * @see MPU6050_DHPF_RESET |
garfieldsg | 0:662207e34fba | 631 | * @see MPU6050_RA_ACCEL_CONFIG |
garfieldsg | 0:662207e34fba | 632 | */ |
garfieldsg | 0:662207e34fba | 633 | uint8_t MPU6050::getDHPFMode() |
garfieldsg | 0:662207e34fba | 634 | { |
garfieldsg | 0:662207e34fba | 635 | i2Cdev.readBits(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_ACCEL_HPF_BIT, MPU6050_ACONFIG_ACCEL_HPF_LENGTH, buffer); |
garfieldsg | 0:662207e34fba | 636 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 637 | } |
garfieldsg | 0:662207e34fba | 638 | /** Set the high-pass filter configuration. |
garfieldsg | 0:662207e34fba | 639 | * @param bandwidth New high-pass filter configuration |
garfieldsg | 0:662207e34fba | 640 | * @see setDHPFMode() |
garfieldsg | 0:662207e34fba | 641 | * @see MPU6050_DHPF_RESET |
garfieldsg | 0:662207e34fba | 642 | * @see MPU6050_RA_ACCEL_CONFIG |
garfieldsg | 0:662207e34fba | 643 | */ |
garfieldsg | 0:662207e34fba | 644 | void MPU6050::setDHPFMode(uint8_t bandwidth) |
garfieldsg | 0:662207e34fba | 645 | { |
garfieldsg | 0:662207e34fba | 646 | i2Cdev.writeBits(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_ACCEL_HPF_BIT, MPU6050_ACONFIG_ACCEL_HPF_LENGTH, bandwidth); |
garfieldsg | 0:662207e34fba | 647 | } |
garfieldsg | 0:662207e34fba | 648 | |
garfieldsg | 0:662207e34fba | 649 | // FF_THR register |
garfieldsg | 0:662207e34fba | 650 | |
garfieldsg | 0:662207e34fba | 651 | /** Get free-fall event acceleration threshold. |
garfieldsg | 0:662207e34fba | 652 | * This register configures the detection threshold for Free Fall event |
garfieldsg | 0:662207e34fba | 653 | * detection. The unit of FF_THR is 1LSB = 2mg. Free Fall is detected when the |
garfieldsg | 0:662207e34fba | 654 | * absolute value of the accelerometer measurements for the three axes are each |
garfieldsg | 0:662207e34fba | 655 | * less than the detection threshold. This condition increments the Free Fall |
garfieldsg | 0:662207e34fba | 656 | * duration counter (Register 30). The Free Fall interrupt is triggered when the |
garfieldsg | 0:662207e34fba | 657 | * Free Fall duration counter reaches the time specified in FF_DUR. |
garfieldsg | 0:662207e34fba | 658 | * |
garfieldsg | 0:662207e34fba | 659 | * For more details on the Free Fall detection interrupt, see Section 8.2 of the |
garfieldsg | 0:662207e34fba | 660 | * MPU-6000/MPU-6050 Product Specification document as well as Registers 56 and |
garfieldsg | 0:662207e34fba | 661 | * 58 of this document. |
garfieldsg | 0:662207e34fba | 662 | * |
garfieldsg | 0:662207e34fba | 663 | * @return Current free-fall acceleration threshold value (LSB = 2mg) |
garfieldsg | 0:662207e34fba | 664 | * @see MPU6050_RA_FF_THR |
garfieldsg | 0:662207e34fba | 665 | */ |
garfieldsg | 0:662207e34fba | 666 | uint8_t MPU6050::getFreefallDetectionThreshold() |
garfieldsg | 0:662207e34fba | 667 | { |
garfieldsg | 0:662207e34fba | 668 | i2Cdev.readByte(devAddr, MPU6050_RA_FF_THR, buffer); |
garfieldsg | 0:662207e34fba | 669 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 670 | } |
garfieldsg | 0:662207e34fba | 671 | /** Get free-fall event acceleration threshold. |
garfieldsg | 0:662207e34fba | 672 | * @param threshold New free-fall acceleration threshold value (LSB = 2mg) |
garfieldsg | 0:662207e34fba | 673 | * @see getFreefallDetectionThreshold() |
garfieldsg | 0:662207e34fba | 674 | * @see MPU6050_RA_FF_THR |
garfieldsg | 0:662207e34fba | 675 | */ |
garfieldsg | 0:662207e34fba | 676 | void MPU6050::setFreefallDetectionThreshold(uint8_t threshold) |
garfieldsg | 0:662207e34fba | 677 | { |
garfieldsg | 0:662207e34fba | 678 | i2Cdev.writeByte(devAddr, MPU6050_RA_FF_THR, threshold); |
garfieldsg | 0:662207e34fba | 679 | } |
garfieldsg | 0:662207e34fba | 680 | |
garfieldsg | 0:662207e34fba | 681 | // FF_DUR register |
garfieldsg | 0:662207e34fba | 682 | |
garfieldsg | 0:662207e34fba | 683 | /** Get free-fall event duration threshold. |
garfieldsg | 0:662207e34fba | 684 | * This register configures the duration counter threshold for Free Fall event |
garfieldsg | 0:662207e34fba | 685 | * detection. The duration counter ticks at 1kHz, therefore FF_DUR has a unit |
garfieldsg | 0:662207e34fba | 686 | * of 1 LSB = 1 ms. |
garfieldsg | 0:662207e34fba | 687 | * |
garfieldsg | 0:662207e34fba | 688 | * The Free Fall duration counter increments while the absolute value of the |
garfieldsg | 0:662207e34fba | 689 | * accelerometer measurements are each less than the detection threshold |
garfieldsg | 0:662207e34fba | 690 | * (Register 29). The Free Fall interrupt is triggered when the Free Fall |
garfieldsg | 0:662207e34fba | 691 | * duration counter reaches the time specified in this register. |
garfieldsg | 0:662207e34fba | 692 | * |
garfieldsg | 0:662207e34fba | 693 | * For more details on the Free Fall detection interrupt, see Section 8.2 of |
garfieldsg | 0:662207e34fba | 694 | * the MPU-6000/MPU-6050 Product Specification document as well as Registers 56 |
garfieldsg | 0:662207e34fba | 695 | * and 58 of this document. |
garfieldsg | 0:662207e34fba | 696 | * |
garfieldsg | 0:662207e34fba | 697 | * @return Current free-fall duration threshold value (LSB = 1ms) |
garfieldsg | 0:662207e34fba | 698 | * @see MPU6050_RA_FF_DUR |
garfieldsg | 0:662207e34fba | 699 | */ |
garfieldsg | 0:662207e34fba | 700 | uint8_t MPU6050::getFreefallDetectionDuration() |
garfieldsg | 0:662207e34fba | 701 | { |
garfieldsg | 0:662207e34fba | 702 | i2Cdev.readByte(devAddr, MPU6050_RA_FF_DUR, buffer); |
garfieldsg | 0:662207e34fba | 703 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 704 | } |
garfieldsg | 0:662207e34fba | 705 | /** Get free-fall event duration threshold. |
garfieldsg | 0:662207e34fba | 706 | * @param duration New free-fall duration threshold value (LSB = 1ms) |
garfieldsg | 0:662207e34fba | 707 | * @see getFreefallDetectionDuration() |
garfieldsg | 0:662207e34fba | 708 | * @see MPU6050_RA_FF_DUR |
garfieldsg | 0:662207e34fba | 709 | */ |
garfieldsg | 0:662207e34fba | 710 | void MPU6050::setFreefallDetectionDuration(uint8_t duration) |
garfieldsg | 0:662207e34fba | 711 | { |
garfieldsg | 0:662207e34fba | 712 | i2Cdev.writeByte(devAddr, MPU6050_RA_FF_DUR, duration); |
garfieldsg | 0:662207e34fba | 713 | } |
garfieldsg | 0:662207e34fba | 714 | |
garfieldsg | 0:662207e34fba | 715 | // MOT_THR register |
garfieldsg | 0:662207e34fba | 716 | |
garfieldsg | 0:662207e34fba | 717 | /** Get motion detection event acceleration threshold. |
garfieldsg | 0:662207e34fba | 718 | * This register configures the detection threshold for Motion interrupt |
garfieldsg | 0:662207e34fba | 719 | * generation. The unit of MOT_THR is 1LSB = 2mg. Motion is detected when the |
garfieldsg | 0:662207e34fba | 720 | * absolute value of any of the accelerometer measurements exceeds this Motion |
garfieldsg | 0:662207e34fba | 721 | * detection threshold. This condition increments the Motion detection duration |
garfieldsg | 0:662207e34fba | 722 | * counter (Register 32). The Motion detection interrupt is triggered when the |
garfieldsg | 0:662207e34fba | 723 | * Motion Detection counter reaches the time count specified in MOT_DUR |
garfieldsg | 0:662207e34fba | 724 | * (Register 32). |
garfieldsg | 0:662207e34fba | 725 | * |
garfieldsg | 0:662207e34fba | 726 | * The Motion interrupt will indicate the axis and polarity of detected motion |
garfieldsg | 0:662207e34fba | 727 | * in MOT_DETECT_STATUS (Register 97). |
garfieldsg | 0:662207e34fba | 728 | * |
garfieldsg | 0:662207e34fba | 729 | * For more details on the Motion detection interrupt, see Section 8.3 of the |
garfieldsg | 0:662207e34fba | 730 | * MPU-6000/MPU-6050 Product Specification document as well as Registers 56 and |
garfieldsg | 0:662207e34fba | 731 | * 58 of this document. |
garfieldsg | 0:662207e34fba | 732 | * |
garfieldsg | 0:662207e34fba | 733 | * @return Current motion detection acceleration threshold value (LSB = 2mg) |
garfieldsg | 0:662207e34fba | 734 | * @see MPU6050_RA_MOT_THR |
garfieldsg | 0:662207e34fba | 735 | */ |
garfieldsg | 0:662207e34fba | 736 | uint8_t MPU6050::getMotionDetectionThreshold() |
garfieldsg | 0:662207e34fba | 737 | { |
garfieldsg | 0:662207e34fba | 738 | i2Cdev.readByte(devAddr, MPU6050_RA_MOT_THR, buffer); |
garfieldsg | 0:662207e34fba | 739 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 740 | } |
garfieldsg | 0:662207e34fba | 741 | /** Set free-fall event acceleration threshold. |
garfieldsg | 0:662207e34fba | 742 | * @param threshold New motion detection acceleration threshold value (LSB = 2mg) |
garfieldsg | 0:662207e34fba | 743 | * @see getMotionDetectionThreshold() |
garfieldsg | 0:662207e34fba | 744 | * @see MPU6050_RA_MOT_THR |
garfieldsg | 0:662207e34fba | 745 | */ |
garfieldsg | 0:662207e34fba | 746 | void MPU6050::setMotionDetectionThreshold(uint8_t threshold) |
garfieldsg | 0:662207e34fba | 747 | { |
garfieldsg | 0:662207e34fba | 748 | i2Cdev.writeByte(devAddr, MPU6050_RA_MOT_THR, threshold); |
garfieldsg | 0:662207e34fba | 749 | } |
garfieldsg | 0:662207e34fba | 750 | |
OsmanKameric | 2:e2081d9de7af | 751 | // register |
garfieldsg | 0:662207e34fba | 752 | |
garfieldsg | 0:662207e34fba | 753 | /** Get motion detection event duration threshold. |
garfieldsg | 0:662207e34fba | 754 | * This register configures the duration counter threshold for Motion interrupt |
garfieldsg | 0:662207e34fba | 755 | * generation. The duration counter ticks at 1 kHz, therefore MOT_DUR has a unit |
garfieldsg | 0:662207e34fba | 756 | * of 1LSB = 1ms. The Motion detection duration counter increments when the |
garfieldsg | 0:662207e34fba | 757 | * absolute value of any of the accelerometer measurements exceeds the Motion |
garfieldsg | 0:662207e34fba | 758 | * detection threshold (Register 31). The Motion detection interrupt is |
garfieldsg | 0:662207e34fba | 759 | * triggered when the Motion detection counter reaches the time count specified |
garfieldsg | 0:662207e34fba | 760 | * in this register. |
garfieldsg | 0:662207e34fba | 761 | * |
garfieldsg | 0:662207e34fba | 762 | * For more details on the Motion detection interrupt, see Section 8.3 of the |
garfieldsg | 0:662207e34fba | 763 | * MPU-6000/MPU-6050 Product Specification document. |
garfieldsg | 0:662207e34fba | 764 | * |
garfieldsg | 0:662207e34fba | 765 | * @return Current motion detection duration threshold value (LSB = 1ms) |
garfieldsg | 0:662207e34fba | 766 | * @see MPU6050_RA_MOT_DUR |
garfieldsg | 0:662207e34fba | 767 | */ |
garfieldsg | 0:662207e34fba | 768 | uint8_t MPU6050::getMotionDetectionDuration() |
garfieldsg | 0:662207e34fba | 769 | { |
garfieldsg | 0:662207e34fba | 770 | i2Cdev.readByte(devAddr, MPU6050_RA_MOT_DUR, buffer); |
garfieldsg | 0:662207e34fba | 771 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 772 | } |
garfieldsg | 0:662207e34fba | 773 | /** Set motion detection event duration threshold. |
garfieldsg | 0:662207e34fba | 774 | * @param duration New motion detection duration threshold value (LSB = 1ms) |
garfieldsg | 0:662207e34fba | 775 | * @see getMotionDetectionDuration() |
garfieldsg | 0:662207e34fba | 776 | * @see MPU6050_RA_MOT_DUR |
garfieldsg | 0:662207e34fba | 777 | */ |
garfieldsg | 0:662207e34fba | 778 | void MPU6050::setMotionDetectionDuration(uint8_t duration) |
garfieldsg | 0:662207e34fba | 779 | { |
garfieldsg | 0:662207e34fba | 780 | i2Cdev.writeByte(devAddr, MPU6050_RA_MOT_DUR, duration); |
garfieldsg | 0:662207e34fba | 781 | } |
garfieldsg | 0:662207e34fba | 782 | |
garfieldsg | 0:662207e34fba | 783 | // ZRMOT_THR register |
garfieldsg | 0:662207e34fba | 784 | |
garfieldsg | 0:662207e34fba | 785 | /** Get zero motion detection event acceleration threshold. |
garfieldsg | 0:662207e34fba | 786 | * This register configures the detection threshold for Zero Motion interrupt |
garfieldsg | 0:662207e34fba | 787 | * generation. The unit of ZRMOT_THR is 1LSB = 2mg. Zero Motion is detected when |
garfieldsg | 0:662207e34fba | 788 | * the absolute value of the accelerometer measurements for the 3 axes are each |
garfieldsg | 0:662207e34fba | 789 | * less than the detection threshold. This condition increments the Zero Motion |
garfieldsg | 0:662207e34fba | 790 | * duration counter (Register 34). The Zero Motion interrupt is triggered when |
garfieldsg | 0:662207e34fba | 791 | * the Zero Motion duration counter reaches the time count specified in |
garfieldsg | 0:662207e34fba | 792 | * ZRMOT_DUR (Register 34). |
garfieldsg | 0:662207e34fba | 793 | * |
garfieldsg | 0:662207e34fba | 794 | * Unlike Free Fall or Motion detection, Zero Motion detection triggers an |
garfieldsg | 0:662207e34fba | 795 | * interrupt both when Zero Motion is first detected and when Zero Motion is no |
garfieldsg | 0:662207e34fba | 796 | * longer detected. |
garfieldsg | 0:662207e34fba | 797 | * |
garfieldsg | 0:662207e34fba | 798 | * When a zero motion event is detected, a Zero Motion Status will be indicated |
garfieldsg | 0:662207e34fba | 799 | * in the MOT_DETECT_STATUS register (Register 97). When a motion-to-zero-motion |
garfieldsg | 0:662207e34fba | 800 | * condition is detected, the status bit is set to 1. When a zero-motion-to- |
garfieldsg | 0:662207e34fba | 801 | * motion condition is detected, the status bit is set to 0. |
garfieldsg | 0:662207e34fba | 802 | * |
garfieldsg | 0:662207e34fba | 803 | * For more details on the Zero Motion detection interrupt, see Section 8.4 of |
garfieldsg | 0:662207e34fba | 804 | * the MPU-6000/MPU-6050 Product Specification document as well as Registers 56 |
garfieldsg | 0:662207e34fba | 805 | * and 58 of this document. |
garfieldsg | 0:662207e34fba | 806 | * |
garfieldsg | 0:662207e34fba | 807 | * @return Current zero motion detection acceleration threshold value (LSB = 2mg) |
garfieldsg | 0:662207e34fba | 808 | * @see MPU6050_RA_ZRMOT_THR |
garfieldsg | 0:662207e34fba | 809 | */ |
garfieldsg | 0:662207e34fba | 810 | uint8_t MPU6050::getZeroMotionDetectionThreshold() |
garfieldsg | 0:662207e34fba | 811 | { |
garfieldsg | 0:662207e34fba | 812 | i2Cdev.readByte(devAddr, MPU6050_RA_ZRMOT_THR, buffer); |
garfieldsg | 0:662207e34fba | 813 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 814 | } |
garfieldsg | 0:662207e34fba | 815 | /** Set zero motion detection event acceleration threshold. |
garfieldsg | 0:662207e34fba | 816 | * @param threshold New zero motion detection acceleration threshold value (LSB = 2mg) |
garfieldsg | 0:662207e34fba | 817 | * @see getZeroMotionDetectionThreshold() |
garfieldsg | 0:662207e34fba | 818 | * @see MPU6050_RA_ZRMOT_THR |
garfieldsg | 0:662207e34fba | 819 | */ |
garfieldsg | 0:662207e34fba | 820 | void MPU6050::setZeroMotionDetectionThreshold(uint8_t threshold) |
garfieldsg | 0:662207e34fba | 821 | { |
garfieldsg | 0:662207e34fba | 822 | i2Cdev.writeByte(devAddr, MPU6050_RA_ZRMOT_THR, threshold); |
garfieldsg | 0:662207e34fba | 823 | } |
garfieldsg | 0:662207e34fba | 824 | |
garfieldsg | 0:662207e34fba | 825 | // ZRMOT_DUR register |
garfieldsg | 0:662207e34fba | 826 | |
garfieldsg | 0:662207e34fba | 827 | /** Get zero motion detection event duration threshold. |
garfieldsg | 0:662207e34fba | 828 | * This register configures the duration counter threshold for Zero Motion |
garfieldsg | 0:662207e34fba | 829 | * interrupt generation. The duration counter ticks at 16 Hz, therefore |
garfieldsg | 0:662207e34fba | 830 | * ZRMOT_DUR has a unit of 1 LSB = 64 ms. The Zero Motion duration counter |
garfieldsg | 0:662207e34fba | 831 | * increments while the absolute value of the accelerometer measurements are |
garfieldsg | 0:662207e34fba | 832 | * each less than the detection threshold (Register 33). The Zero Motion |
garfieldsg | 0:662207e34fba | 833 | * interrupt is triggered when the Zero Motion duration counter reaches the time |
garfieldsg | 0:662207e34fba | 834 | * count specified in this register. |
garfieldsg | 0:662207e34fba | 835 | * |
garfieldsg | 0:662207e34fba | 836 | * For more details on the Zero Motion detection interrupt, see Section 8.4 of |
garfieldsg | 0:662207e34fba | 837 | * the MPU-6000/MPU-6050 Product Specification document, as well as Registers 56 |
garfieldsg | 0:662207e34fba | 838 | * and 58 of this document. |
garfieldsg | 0:662207e34fba | 839 | * |
garfieldsg | 0:662207e34fba | 840 | * @return Current zero motion detection duration threshold value (LSB = 64ms) |
garfieldsg | 0:662207e34fba | 841 | * @see MPU6050_RA_ZRMOT_DUR |
garfieldsg | 0:662207e34fba | 842 | */ |
garfieldsg | 0:662207e34fba | 843 | uint8_t MPU6050::getZeroMotionDetectionDuration() |
garfieldsg | 0:662207e34fba | 844 | { |
garfieldsg | 0:662207e34fba | 845 | i2Cdev.readByte(devAddr, MPU6050_RA_ZRMOT_DUR, buffer); |
garfieldsg | 0:662207e34fba | 846 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 847 | } |
garfieldsg | 0:662207e34fba | 848 | /** Set zero motion detection event duration threshold. |
garfieldsg | 0:662207e34fba | 849 | * @param duration New zero motion detection duration threshold value (LSB = 1ms) |
garfieldsg | 0:662207e34fba | 850 | * @see getZeroMotionDetectionDuration() |
garfieldsg | 0:662207e34fba | 851 | * @see MPU6050_RA_ZRMOT_DUR |
garfieldsg | 0:662207e34fba | 852 | */ |
garfieldsg | 0:662207e34fba | 853 | void MPU6050::setZeroMotionDetectionDuration(uint8_t duration) |
garfieldsg | 0:662207e34fba | 854 | { |
garfieldsg | 0:662207e34fba | 855 | i2Cdev.writeByte(devAddr, MPU6050_RA_ZRMOT_DUR, duration); |
garfieldsg | 0:662207e34fba | 856 | } |
garfieldsg | 0:662207e34fba | 857 | |
garfieldsg | 0:662207e34fba | 858 | // FIFO_EN register |
garfieldsg | 0:662207e34fba | 859 | |
garfieldsg | 0:662207e34fba | 860 | /** Get temperature FIFO enabled value. |
garfieldsg | 0:662207e34fba | 861 | * When set to 1, this bit enables TEMP_OUT_H and TEMP_OUT_L (Registers 65 and |
garfieldsg | 0:662207e34fba | 862 | * 66) to be written into the FIFO buffer. |
garfieldsg | 0:662207e34fba | 863 | * @return Current temperature FIFO enabled value |
garfieldsg | 0:662207e34fba | 864 | * @see MPU6050_RA_FIFO_EN |
garfieldsg | 0:662207e34fba | 865 | */ |
garfieldsg | 0:662207e34fba | 866 | bool MPU6050::getTempFIFOEnabled() |
garfieldsg | 0:662207e34fba | 867 | { |
garfieldsg | 0:662207e34fba | 868 | i2Cdev.readBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_TEMP_FIFO_EN_BIT, buffer); |
garfieldsg | 0:662207e34fba | 869 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 870 | } |
garfieldsg | 0:662207e34fba | 871 | /** Set temperature FIFO enabled value. |
garfieldsg | 0:662207e34fba | 872 | * @param enabled New temperature FIFO enabled value |
garfieldsg | 0:662207e34fba | 873 | * @see getTempFIFOEnabled() |
garfieldsg | 0:662207e34fba | 874 | * @see MPU6050_RA_FIFO_EN |
garfieldsg | 0:662207e34fba | 875 | */ |
garfieldsg | 0:662207e34fba | 876 | void MPU6050::setTempFIFOEnabled(bool enabled) |
garfieldsg | 0:662207e34fba | 877 | { |
garfieldsg | 0:662207e34fba | 878 | i2Cdev.writeBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_TEMP_FIFO_EN_BIT, enabled); |
garfieldsg | 0:662207e34fba | 879 | } |
garfieldsg | 0:662207e34fba | 880 | /** Get gyroscope X-axis FIFO enabled value. |
garfieldsg | 0:662207e34fba | 881 | * When set to 1, this bit enables GYRO_XOUT_H and GYRO_XOUT_L (Registers 67 and |
garfieldsg | 0:662207e34fba | 882 | * 68) to be written into the FIFO buffer. |
garfieldsg | 0:662207e34fba | 883 | * @return Current gyroscope X-axis FIFO enabled value |
garfieldsg | 0:662207e34fba | 884 | * @see MPU6050_RA_FIFO_EN |
garfieldsg | 0:662207e34fba | 885 | */ |
garfieldsg | 0:662207e34fba | 886 | bool MPU6050::getXGyroFIFOEnabled() |
garfieldsg | 0:662207e34fba | 887 | { |
garfieldsg | 0:662207e34fba | 888 | i2Cdev.readBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_XG_FIFO_EN_BIT, buffer); |
garfieldsg | 0:662207e34fba | 889 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 890 | } |
garfieldsg | 0:662207e34fba | 891 | /** Set gyroscope X-axis FIFO enabled value. |
garfieldsg | 0:662207e34fba | 892 | * @param enabled New gyroscope X-axis FIFO enabled value |
garfieldsg | 0:662207e34fba | 893 | * @see getXGyroFIFOEnabled() |
garfieldsg | 0:662207e34fba | 894 | * @see MPU6050_RA_FIFO_EN |
garfieldsg | 0:662207e34fba | 895 | */ |
garfieldsg | 0:662207e34fba | 896 | void MPU6050::setXGyroFIFOEnabled(bool enabled) |
garfieldsg | 0:662207e34fba | 897 | { |
garfieldsg | 0:662207e34fba | 898 | i2Cdev.writeBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_XG_FIFO_EN_BIT, enabled); |
garfieldsg | 0:662207e34fba | 899 | } |
garfieldsg | 0:662207e34fba | 900 | /** Get gyroscope Y-axis FIFO enabled value. |
garfieldsg | 0:662207e34fba | 901 | * When set to 1, this bit enables GYRO_YOUT_H and GYRO_YOUT_L (Registers 69 and |
garfieldsg | 0:662207e34fba | 902 | * 70) to be written into the FIFO buffer. |
garfieldsg | 0:662207e34fba | 903 | * @return Current gyroscope Y-axis FIFO enabled value |
garfieldsg | 0:662207e34fba | 904 | * @see MPU6050_RA_FIFO_EN |
garfieldsg | 0:662207e34fba | 905 | */ |
garfieldsg | 0:662207e34fba | 906 | bool MPU6050::getYGyroFIFOEnabled() |
garfieldsg | 0:662207e34fba | 907 | { |
garfieldsg | 0:662207e34fba | 908 | i2Cdev.readBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_YG_FIFO_EN_BIT, buffer); |
garfieldsg | 0:662207e34fba | 909 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 910 | } |
garfieldsg | 0:662207e34fba | 911 | /** Set gyroscope Y-axis FIFO enabled value. |
garfieldsg | 0:662207e34fba | 912 | * @param enabled New gyroscope Y-axis FIFO enabled value |
garfieldsg | 0:662207e34fba | 913 | * @see getYGyroFIFOEnabled() |
garfieldsg | 0:662207e34fba | 914 | * @see MPU6050_RA_FIFO_EN |
garfieldsg | 0:662207e34fba | 915 | */ |
garfieldsg | 0:662207e34fba | 916 | void MPU6050::setYGyroFIFOEnabled(bool enabled) |
garfieldsg | 0:662207e34fba | 917 | { |
garfieldsg | 0:662207e34fba | 918 | i2Cdev.writeBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_YG_FIFO_EN_BIT, enabled); |
garfieldsg | 0:662207e34fba | 919 | } |
garfieldsg | 0:662207e34fba | 920 | /** Get gyroscope Z-axis FIFO enabled value. |
garfieldsg | 0:662207e34fba | 921 | * When set to 1, this bit enables GYRO_ZOUT_H and GYRO_ZOUT_L (Registers 71 and |
garfieldsg | 0:662207e34fba | 922 | * 72) to be written into the FIFO buffer. |
garfieldsg | 0:662207e34fba | 923 | * @return Current gyroscope Z-axis FIFO enabled value |
garfieldsg | 0:662207e34fba | 924 | * @see MPU6050_RA_FIFO_EN |
garfieldsg | 0:662207e34fba | 925 | */ |
garfieldsg | 0:662207e34fba | 926 | bool MPU6050::getZGyroFIFOEnabled() |
garfieldsg | 0:662207e34fba | 927 | { |
garfieldsg | 0:662207e34fba | 928 | i2Cdev.readBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_ZG_FIFO_EN_BIT, buffer); |
garfieldsg | 0:662207e34fba | 929 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 930 | } |
garfieldsg | 0:662207e34fba | 931 | /** Set gyroscope Z-axis FIFO enabled value. |
garfieldsg | 0:662207e34fba | 932 | * @param enabled New gyroscope Z-axis FIFO enabled value |
garfieldsg | 0:662207e34fba | 933 | * @see getZGyroFIFOEnabled() |
garfieldsg | 0:662207e34fba | 934 | * @see MPU6050_RA_FIFO_EN |
garfieldsg | 0:662207e34fba | 935 | */ |
garfieldsg | 0:662207e34fba | 936 | void MPU6050::setZGyroFIFOEnabled(bool enabled) |
garfieldsg | 0:662207e34fba | 937 | { |
garfieldsg | 0:662207e34fba | 938 | i2Cdev.writeBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_ZG_FIFO_EN_BIT, enabled); |
garfieldsg | 0:662207e34fba | 939 | } |
garfieldsg | 0:662207e34fba | 940 | /** Get accelerometer FIFO enabled value. |
garfieldsg | 0:662207e34fba | 941 | * When set to 1, this bit enables ACCEL_XOUT_H, ACCEL_XOUT_L, ACCEL_YOUT_H, |
garfieldsg | 0:662207e34fba | 942 | * ACCEL_YOUT_L, ACCEL_ZOUT_H, and ACCEL_ZOUT_L (Registers 59 to 64) to be |
garfieldsg | 0:662207e34fba | 943 | * written into the FIFO buffer. |
garfieldsg | 0:662207e34fba | 944 | * @return Current accelerometer FIFO enabled value |
garfieldsg | 0:662207e34fba | 945 | * @see MPU6050_RA_FIFO_EN |
garfieldsg | 0:662207e34fba | 946 | */ |
garfieldsg | 0:662207e34fba | 947 | bool MPU6050::getAccelFIFOEnabled() |
garfieldsg | 0:662207e34fba | 948 | { |
garfieldsg | 0:662207e34fba | 949 | i2Cdev.readBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_ACCEL_FIFO_EN_BIT, buffer); |
garfieldsg | 0:662207e34fba | 950 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 951 | } |
garfieldsg | 0:662207e34fba | 952 | /** Set accelerometer FIFO enabled value. |
garfieldsg | 0:662207e34fba | 953 | * @param enabled New accelerometer FIFO enabled value |
garfieldsg | 0:662207e34fba | 954 | * @see getAccelFIFOEnabled() |
garfieldsg | 0:662207e34fba | 955 | * @see MPU6050_RA_FIFO_EN |
garfieldsg | 0:662207e34fba | 956 | */ |
garfieldsg | 0:662207e34fba | 957 | void MPU6050::setAccelFIFOEnabled(bool enabled) |
garfieldsg | 0:662207e34fba | 958 | { |
garfieldsg | 0:662207e34fba | 959 | i2Cdev.writeBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_ACCEL_FIFO_EN_BIT, enabled); |
garfieldsg | 0:662207e34fba | 960 | } |
garfieldsg | 0:662207e34fba | 961 | /** Get Slave 2 FIFO enabled value. |
garfieldsg | 0:662207e34fba | 962 | * When set to 1, this bit enables EXT_SENS_DATA registers (Registers 73 to 96) |
garfieldsg | 0:662207e34fba | 963 | * associated with Slave 2 to be written into the FIFO buffer. |
garfieldsg | 0:662207e34fba | 964 | * @return Current Slave 2 FIFO enabled value |
garfieldsg | 0:662207e34fba | 965 | * @see MPU6050_RA_FIFO_EN |
garfieldsg | 0:662207e34fba | 966 | */ |
garfieldsg | 0:662207e34fba | 967 | bool MPU6050::getSlave2FIFOEnabled() |
garfieldsg | 0:662207e34fba | 968 | { |
garfieldsg | 0:662207e34fba | 969 | i2Cdev.readBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_SLV2_FIFO_EN_BIT, buffer); |
garfieldsg | 0:662207e34fba | 970 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 971 | } |
garfieldsg | 0:662207e34fba | 972 | /** Set Slave 2 FIFO enabled value. |
garfieldsg | 0:662207e34fba | 973 | * @param enabled New Slave 2 FIFO enabled value |
garfieldsg | 0:662207e34fba | 974 | * @see getSlave2FIFOEnabled() |
garfieldsg | 0:662207e34fba | 975 | * @see MPU6050_RA_FIFO_EN |
garfieldsg | 0:662207e34fba | 976 | */ |
garfieldsg | 0:662207e34fba | 977 | void MPU6050::setSlave2FIFOEnabled(bool enabled) |
garfieldsg | 0:662207e34fba | 978 | { |
garfieldsg | 0:662207e34fba | 979 | i2Cdev.writeBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_SLV2_FIFO_EN_BIT, enabled); |
garfieldsg | 0:662207e34fba | 980 | } |
garfieldsg | 0:662207e34fba | 981 | /** Get Slave 1 FIFO enabled value. |
garfieldsg | 0:662207e34fba | 982 | * When set to 1, this bit enables EXT_SENS_DATA registers (Registers 73 to 96) |
garfieldsg | 0:662207e34fba | 983 | * associated with Slave 1 to be written into the FIFO buffer. |
garfieldsg | 0:662207e34fba | 984 | * @return Current Slave 1 FIFO enabled value |
garfieldsg | 0:662207e34fba | 985 | * @see MPU6050_RA_FIFO_EN |
garfieldsg | 0:662207e34fba | 986 | */ |
garfieldsg | 0:662207e34fba | 987 | bool MPU6050::getSlave1FIFOEnabled() |
garfieldsg | 0:662207e34fba | 988 | { |
garfieldsg | 0:662207e34fba | 989 | i2Cdev.readBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_SLV1_FIFO_EN_BIT, buffer); |
garfieldsg | 0:662207e34fba | 990 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 991 | } |
garfieldsg | 0:662207e34fba | 992 | /** Set Slave 1 FIFO enabled value. |
garfieldsg | 0:662207e34fba | 993 | * @param enabled New Slave 1 FIFO enabled value |
garfieldsg | 0:662207e34fba | 994 | * @see getSlave1FIFOEnabled() |
garfieldsg | 0:662207e34fba | 995 | * @see MPU6050_RA_FIFO_EN |
garfieldsg | 0:662207e34fba | 996 | */ |
garfieldsg | 0:662207e34fba | 997 | void MPU6050::setSlave1FIFOEnabled(bool enabled) |
garfieldsg | 0:662207e34fba | 998 | { |
garfieldsg | 0:662207e34fba | 999 | i2Cdev.writeBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_SLV1_FIFO_EN_BIT, enabled); |
garfieldsg | 0:662207e34fba | 1000 | } |
garfieldsg | 0:662207e34fba | 1001 | /** Get Slave 0 FIFO enabled value. |
garfieldsg | 0:662207e34fba | 1002 | * When set to 1, this bit enables EXT_SENS_DATA registers (Registers 73 to 96) |
garfieldsg | 0:662207e34fba | 1003 | * associated with Slave 0 to be written into the FIFO buffer. |
garfieldsg | 0:662207e34fba | 1004 | * @return Current Slave 0 FIFO enabled value |
garfieldsg | 0:662207e34fba | 1005 | * @see MPU6050_RA_FIFO_EN |
garfieldsg | 0:662207e34fba | 1006 | */ |
garfieldsg | 0:662207e34fba | 1007 | bool MPU6050::getSlave0FIFOEnabled() |
garfieldsg | 0:662207e34fba | 1008 | { |
garfieldsg | 0:662207e34fba | 1009 | i2Cdev.readBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_SLV0_FIFO_EN_BIT, buffer); |
garfieldsg | 0:662207e34fba | 1010 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 1011 | } |
garfieldsg | 0:662207e34fba | 1012 | /** Set Slave 0 FIFO enabled value. |
garfieldsg | 0:662207e34fba | 1013 | * @param enabled New Slave 0 FIFO enabled value |
garfieldsg | 0:662207e34fba | 1014 | * @see getSlave0FIFOEnabled() |
garfieldsg | 0:662207e34fba | 1015 | * @see MPU6050_RA_FIFO_EN |
garfieldsg | 0:662207e34fba | 1016 | */ |
garfieldsg | 0:662207e34fba | 1017 | void MPU6050::setSlave0FIFOEnabled(bool enabled) |
garfieldsg | 0:662207e34fba | 1018 | { |
garfieldsg | 0:662207e34fba | 1019 | i2Cdev.writeBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_SLV0_FIFO_EN_BIT, enabled); |
garfieldsg | 0:662207e34fba | 1020 | } |
garfieldsg | 0:662207e34fba | 1021 | |
garfieldsg | 0:662207e34fba | 1022 | // I2C_MST_CTRL register |
garfieldsg | 0:662207e34fba | 1023 | |
garfieldsg | 0:662207e34fba | 1024 | /** Get multi-master enabled value. |
garfieldsg | 0:662207e34fba | 1025 | * Multi-master capability allows multiple I2C masters to operate on the same |
garfieldsg | 0:662207e34fba | 1026 | * bus. In circuits where multi-master capability is required, set MULT_MST_EN |
garfieldsg | 0:662207e34fba | 1027 | * to 1. This will increase current drawn by approximately 30uA. |
garfieldsg | 0:662207e34fba | 1028 | * |
garfieldsg | 0:662207e34fba | 1029 | * In circuits where multi-master capability is required, the state of the I2C |
garfieldsg | 0:662207e34fba | 1030 | * bus must always be monitored by each separate I2C Master. Before an I2C |
garfieldsg | 0:662207e34fba | 1031 | * Master can assume arbitration of the bus, it must first confirm that no other |
garfieldsg | 0:662207e34fba | 1032 | * I2C Master has arbitration of the bus. When MULT_MST_EN is set to 1, the |
garfieldsg | 0:662207e34fba | 1033 | * MPU-60X0's bus arbitration detection logic is turned on, enabling it to |
garfieldsg | 0:662207e34fba | 1034 | * detect when the bus is available. |
garfieldsg | 0:662207e34fba | 1035 | * |
garfieldsg | 0:662207e34fba | 1036 | * @return Current multi-master enabled value |
garfieldsg | 0:662207e34fba | 1037 | * @see MPU6050_RA_I2C_MST_CTRL |
garfieldsg | 0:662207e34fba | 1038 | */ |
garfieldsg | 0:662207e34fba | 1039 | bool MPU6050::getMultiMasterEnabled() |
garfieldsg | 0:662207e34fba | 1040 | { |
garfieldsg | 0:662207e34fba | 1041 | i2Cdev.readBit(devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_MULT_MST_EN_BIT, buffer); |
garfieldsg | 0:662207e34fba | 1042 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 1043 | } |
garfieldsg | 0:662207e34fba | 1044 | /** Set multi-master enabled value. |
garfieldsg | 0:662207e34fba | 1045 | * @param enabled New multi-master enabled value |
garfieldsg | 0:662207e34fba | 1046 | * @see getMultiMasterEnabled() |
garfieldsg | 0:662207e34fba | 1047 | * @see MPU6050_RA_I2C_MST_CTRL |
garfieldsg | 0:662207e34fba | 1048 | */ |
garfieldsg | 0:662207e34fba | 1049 | void MPU6050::setMultiMasterEnabled(bool enabled) |
garfieldsg | 0:662207e34fba | 1050 | { |
garfieldsg | 0:662207e34fba | 1051 | i2Cdev.writeBit(devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_MULT_MST_EN_BIT, enabled); |
garfieldsg | 0:662207e34fba | 1052 | } |
garfieldsg | 0:662207e34fba | 1053 | /** Get wait-for-external-sensor-data enabled value. |
garfieldsg | 0:662207e34fba | 1054 | * When the WAIT_FOR_ES bit is set to 1, the Data Ready interrupt will be |
garfieldsg | 0:662207e34fba | 1055 | * delayed until External Sensor data from the Slave Devices are loaded into the |
garfieldsg | 0:662207e34fba | 1056 | * EXT_SENS_DATA registers. This is used to ensure that both the internal sensor |
garfieldsg | 0:662207e34fba | 1057 | * data (i.e. from gyro and accel) and external sensor data have been loaded to |
garfieldsg | 0:662207e34fba | 1058 | * their respective data registers (i.e. the data is synced) when the Data Ready |
garfieldsg | 0:662207e34fba | 1059 | * interrupt is triggered. |
garfieldsg | 0:662207e34fba | 1060 | * |
garfieldsg | 0:662207e34fba | 1061 | * @return Current wait-for-external-sensor-data enabled value |
garfieldsg | 0:662207e34fba | 1062 | * @see MPU6050_RA_I2C_MST_CTRL |
garfieldsg | 0:662207e34fba | 1063 | */ |
garfieldsg | 0:662207e34fba | 1064 | bool MPU6050::getWaitForExternalSensorEnabled() |
garfieldsg | 0:662207e34fba | 1065 | { |
garfieldsg | 0:662207e34fba | 1066 | i2Cdev.readBit(devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_WAIT_FOR_ES_BIT, buffer); |
garfieldsg | 0:662207e34fba | 1067 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 1068 | } |
garfieldsg | 0:662207e34fba | 1069 | /** Set wait-for-external-sensor-data enabled value. |
garfieldsg | 0:662207e34fba | 1070 | * @param enabled New wait-for-external-sensor-data enabled value |
garfieldsg | 0:662207e34fba | 1071 | * @see getWaitForExternalSensorEnabled() |
garfieldsg | 0:662207e34fba | 1072 | * @see MPU6050_RA_I2C_MST_CTRL |
garfieldsg | 0:662207e34fba | 1073 | */ |
garfieldsg | 0:662207e34fba | 1074 | void MPU6050::setWaitForExternalSensorEnabled(bool enabled) |
garfieldsg | 0:662207e34fba | 1075 | { |
garfieldsg | 0:662207e34fba | 1076 | i2Cdev.writeBit(devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_WAIT_FOR_ES_BIT, enabled); |
garfieldsg | 0:662207e34fba | 1077 | } |
garfieldsg | 0:662207e34fba | 1078 | /** Get Slave 3 FIFO enabled value. |
garfieldsg | 0:662207e34fba | 1079 | * When set to 1, this bit enables EXT_SENS_DATA registers (Registers 73 to 96) |
garfieldsg | 0:662207e34fba | 1080 | * associated with Slave 3 to be written into the FIFO buffer. |
garfieldsg | 0:662207e34fba | 1081 | * @return Current Slave 3 FIFO enabled value |
garfieldsg | 0:662207e34fba | 1082 | * @see MPU6050_RA_MST_CTRL |
garfieldsg | 0:662207e34fba | 1083 | */ |
garfieldsg | 0:662207e34fba | 1084 | bool MPU6050::getSlave3FIFOEnabled() |
garfieldsg | 0:662207e34fba | 1085 | { |
garfieldsg | 0:662207e34fba | 1086 | i2Cdev.readBit(devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_SLV_3_FIFO_EN_BIT, buffer); |
garfieldsg | 0:662207e34fba | 1087 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 1088 | } |
garfieldsg | 0:662207e34fba | 1089 | /** Set Slave 3 FIFO enabled value. |
garfieldsg | 0:662207e34fba | 1090 | * @param enabled New Slave 3 FIFO enabled value |
garfieldsg | 0:662207e34fba | 1091 | * @see getSlave3FIFOEnabled() |
garfieldsg | 0:662207e34fba | 1092 | * @see MPU6050_RA_MST_CTRL |
garfieldsg | 0:662207e34fba | 1093 | */ |
garfieldsg | 0:662207e34fba | 1094 | void MPU6050::setSlave3FIFOEnabled(bool enabled) |
garfieldsg | 0:662207e34fba | 1095 | { |
garfieldsg | 0:662207e34fba | 1096 | i2Cdev.writeBit(devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_SLV_3_FIFO_EN_BIT, enabled); |
garfieldsg | 0:662207e34fba | 1097 | } |
garfieldsg | 0:662207e34fba | 1098 | /** Get slave read/write transition enabled value. |
garfieldsg | 0:662207e34fba | 1099 | * The I2C_MST_P_NSR bit configures the I2C Master's transition from one slave |
garfieldsg | 0:662207e34fba | 1100 | * read to the next slave read. If the bit equals 0, there will be a restart |
garfieldsg | 0:662207e34fba | 1101 | * between reads. If the bit equals 1, there will be a stop followed by a start |
garfieldsg | 0:662207e34fba | 1102 | * of the following read. When a write transaction follows a read transaction, |
garfieldsg | 0:662207e34fba | 1103 | * the stop followed by a start of the successive write will be always used. |
garfieldsg | 0:662207e34fba | 1104 | * |
garfieldsg | 0:662207e34fba | 1105 | * @return Current slave read/write transition enabled value |
garfieldsg | 0:662207e34fba | 1106 | * @see MPU6050_RA_I2C_MST_CTRL |
garfieldsg | 0:662207e34fba | 1107 | */ |
garfieldsg | 0:662207e34fba | 1108 | bool MPU6050::getSlaveReadWriteTransitionEnabled() |
garfieldsg | 0:662207e34fba | 1109 | { |
garfieldsg | 0:662207e34fba | 1110 | i2Cdev.readBit(devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_I2C_MST_P_NSR_BIT, buffer); |
garfieldsg | 0:662207e34fba | 1111 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 1112 | } |
garfieldsg | 0:662207e34fba | 1113 | /** Set slave read/write transition enabled value. |
garfieldsg | 0:662207e34fba | 1114 | * @param enabled New slave read/write transition enabled value |
garfieldsg | 0:662207e34fba | 1115 | * @see getSlaveReadWriteTransitionEnabled() |
garfieldsg | 0:662207e34fba | 1116 | * @see MPU6050_RA_I2C_MST_CTRL |
garfieldsg | 0:662207e34fba | 1117 | */ |
garfieldsg | 0:662207e34fba | 1118 | void MPU6050::setSlaveReadWriteTransitionEnabled(bool enabled) |
garfieldsg | 0:662207e34fba | 1119 | { |
garfieldsg | 0:662207e34fba | 1120 | i2Cdev.writeBit(devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_I2C_MST_P_NSR_BIT, enabled); |
garfieldsg | 0:662207e34fba | 1121 | } |
garfieldsg | 0:662207e34fba | 1122 | /** Get I2C master clock speed. |
garfieldsg | 0:662207e34fba | 1123 | * I2C_MST_CLK is a 4 bit unsigned value which configures a divider on the |
garfieldsg | 0:662207e34fba | 1124 | * MPU-60X0 internal 8MHz clock. It sets the I2C master clock speed according to |
garfieldsg | 0:662207e34fba | 1125 | * the following table: |
garfieldsg | 0:662207e34fba | 1126 | * |
garfieldsg | 0:662207e34fba | 1127 | * <pre> |
garfieldsg | 0:662207e34fba | 1128 | * I2C_MST_CLK | I2C Master Clock Speed | 8MHz Clock Divider |
garfieldsg | 0:662207e34fba | 1129 | * ------------+------------------------+------------------- |
garfieldsg | 0:662207e34fba | 1130 | * 0 | 348kHz | 23 |
garfieldsg | 0:662207e34fba | 1131 | * 1 | 333kHz | 24 |
garfieldsg | 0:662207e34fba | 1132 | * 2 | 320kHz | 25 |
garfieldsg | 0:662207e34fba | 1133 | * 3 | 308kHz | 26 |
garfieldsg | 0:662207e34fba | 1134 | * 4 | 296kHz | 27 |
garfieldsg | 0:662207e34fba | 1135 | * 5 | 286kHz | 28 |
garfieldsg | 0:662207e34fba | 1136 | * 6 | 276kHz | 29 |
garfieldsg | 0:662207e34fba | 1137 | * 7 | 267kHz | 30 |
garfieldsg | 0:662207e34fba | 1138 | * 8 | 258kHz | 31 |
garfieldsg | 0:662207e34fba | 1139 | * 9 | 500kHz | 16 |
garfieldsg | 0:662207e34fba | 1140 | * 10 | 471kHz | 17 |
garfieldsg | 0:662207e34fba | 1141 | * 11 | 444kHz | 18 |
garfieldsg | 0:662207e34fba | 1142 | * 12 | 421kHz | 19 |
garfieldsg | 0:662207e34fba | 1143 | * 13 | 400kHz | 20 |
garfieldsg | 0:662207e34fba | 1144 | * 14 | 381kHz | 21 |
garfieldsg | 0:662207e34fba | 1145 | * 15 | 364kHz | 22 |
garfieldsg | 0:662207e34fba | 1146 | * </pre> |
garfieldsg | 0:662207e34fba | 1147 | * |
garfieldsg | 0:662207e34fba | 1148 | * @return Current I2C master clock speed |
garfieldsg | 0:662207e34fba | 1149 | * @see MPU6050_RA_I2C_MST_CTRL |
garfieldsg | 0:662207e34fba | 1150 | */ |
garfieldsg | 0:662207e34fba | 1151 | uint8_t MPU6050::getMasterClockSpeed() |
garfieldsg | 0:662207e34fba | 1152 | { |
garfieldsg | 0:662207e34fba | 1153 | i2Cdev.readBits(devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_I2C_MST_CLK_BIT, MPU6050_I2C_MST_CLK_LENGTH, buffer); |
garfieldsg | 0:662207e34fba | 1154 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 1155 | } |
garfieldsg | 0:662207e34fba | 1156 | /** Set I2C master clock speed. |
garfieldsg | 0:662207e34fba | 1157 | * @reparam speed Current I2C master clock speed |
garfieldsg | 0:662207e34fba | 1158 | * @see MPU6050_RA_I2C_MST_CTRL |
garfieldsg | 0:662207e34fba | 1159 | */ |
garfieldsg | 0:662207e34fba | 1160 | void MPU6050::setMasterClockSpeed(uint8_t speed) |
garfieldsg | 0:662207e34fba | 1161 | { |
garfieldsg | 0:662207e34fba | 1162 | i2Cdev.writeBits(devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_I2C_MST_CLK_BIT, MPU6050_I2C_MST_CLK_LENGTH, speed); |
garfieldsg | 0:662207e34fba | 1163 | } |
garfieldsg | 0:662207e34fba | 1164 | |
garfieldsg | 0:662207e34fba | 1165 | // I2C_SLV* registers (Slave 0-3) |
garfieldsg | 0:662207e34fba | 1166 | |
garfieldsg | 0:662207e34fba | 1167 | /** Get the I2C address of the specified slave (0-3). |
garfieldsg | 0:662207e34fba | 1168 | * Note that Bit 7 (MSB) controls read/write mode. If Bit 7 is set, it's a read |
garfieldsg | 0:662207e34fba | 1169 | * operation, and if it is cleared, then it's a write operation. The remaining |
garfieldsg | 0:662207e34fba | 1170 | * bits (6-0) are the 7-bit device address of the slave device. |
garfieldsg | 0:662207e34fba | 1171 | * |
garfieldsg | 0:662207e34fba | 1172 | * In read mode, the result of the read is placed in the lowest available |
garfieldsg | 0:662207e34fba | 1173 | * EXT_SENS_DATA register. For further information regarding the allocation of |
garfieldsg | 0:662207e34fba | 1174 | * read results, please refer to the EXT_SENS_DATA register description |
garfieldsg | 0:662207e34fba | 1175 | * (Registers 73 - 96). |
garfieldsg | 0:662207e34fba | 1176 | * |
garfieldsg | 0:662207e34fba | 1177 | * The MPU-6050 supports a total of five slaves, but Slave 4 has unique |
garfieldsg | 0:662207e34fba | 1178 | * characteristics, and so it has its own functions (getSlave4* and setSlave4*). |
garfieldsg | 0:662207e34fba | 1179 | * |
garfieldsg | 0:662207e34fba | 1180 | * I2C data transactions are performed at the Sample Rate, as defined in |
garfieldsg | 0:662207e34fba | 1181 | * Register 25. The user is responsible for ensuring that I2C data transactions |
garfieldsg | 0:662207e34fba | 1182 | * to and from each enabled Slave can be completed within a single period of the |
garfieldsg | 0:662207e34fba | 1183 | * Sample Rate. |
garfieldsg | 0:662207e34fba | 1184 | * |
garfieldsg | 0:662207e34fba | 1185 | * The I2C slave access rate can be reduced relative to the Sample Rate. This |
garfieldsg | 0:662207e34fba | 1186 | * reduced access rate is determined by I2C_MST_DLY (Register 52). Whether a |
garfieldsg | 0:662207e34fba | 1187 | * slave's access rate is reduced relative to the Sample Rate is determined by |
garfieldsg | 0:662207e34fba | 1188 | * I2C_MST_DELAY_CTRL (Register 103). |
garfieldsg | 0:662207e34fba | 1189 | * |
garfieldsg | 0:662207e34fba | 1190 | * The processing order for the slaves is fixed. The sequence followed for |
garfieldsg | 0:662207e34fba | 1191 | * processing the slaves is Slave 0, Slave 1, Slave 2, Slave 3 and Slave 4. If a |
garfieldsg | 0:662207e34fba | 1192 | * particular Slave is disabled it will be skipped. |
garfieldsg | 0:662207e34fba | 1193 | * |
garfieldsg | 0:662207e34fba | 1194 | * Each slave can either be accessed at the sample rate or at a reduced sample |
garfieldsg | 0:662207e34fba | 1195 | * rate. In a case where some slaves are accessed at the Sample Rate and some |
garfieldsg | 0:662207e34fba | 1196 | * slaves are accessed at the reduced rate, the sequence of accessing the slaves |
garfieldsg | 0:662207e34fba | 1197 | * (Slave 0 to Slave 4) is still followed. However, the reduced rate slaves will |
garfieldsg | 0:662207e34fba | 1198 | * be skipped if their access rate dictates that they should not be accessed |
garfieldsg | 0:662207e34fba | 1199 | * during that particular cycle. For further information regarding the reduced |
garfieldsg | 0:662207e34fba | 1200 | * access rate, please refer to Register 52. Whether a slave is accessed at the |
garfieldsg | 0:662207e34fba | 1201 | * Sample Rate or at the reduced rate is determined by the Delay Enable bits in |
garfieldsg | 0:662207e34fba | 1202 | * Register 103. |
garfieldsg | 0:662207e34fba | 1203 | * |
garfieldsg | 0:662207e34fba | 1204 | * @param num Slave number (0-3) |
garfieldsg | 0:662207e34fba | 1205 | * @return Current address for specified slave |
garfieldsg | 0:662207e34fba | 1206 | * @see MPU6050_RA_I2C_SLV0_ADDR |
garfieldsg | 0:662207e34fba | 1207 | */ |
garfieldsg | 0:662207e34fba | 1208 | uint8_t MPU6050::getSlaveAddress(uint8_t num) |
garfieldsg | 0:662207e34fba | 1209 | { |
garfieldsg | 0:662207e34fba | 1210 | if (num > 3) return 0; |
garfieldsg | 0:662207e34fba | 1211 | i2Cdev.readByte(devAddr, MPU6050_RA_I2C_SLV0_ADDR + num*3, buffer); |
garfieldsg | 0:662207e34fba | 1212 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 1213 | } |
garfieldsg | 0:662207e34fba | 1214 | /** Set the I2C address of the specified slave (0-3). |
garfieldsg | 0:662207e34fba | 1215 | * @param num Slave number (0-3) |
garfieldsg | 0:662207e34fba | 1216 | * @param address New address for specified slave |
garfieldsg | 0:662207e34fba | 1217 | * @see getSlaveAddress() |
garfieldsg | 0:662207e34fba | 1218 | * @see MPU6050_RA_I2C_SLV0_ADDR |
garfieldsg | 0:662207e34fba | 1219 | */ |
garfieldsg | 0:662207e34fba | 1220 | void MPU6050::setSlaveAddress(uint8_t num, uint8_t address) |
garfieldsg | 0:662207e34fba | 1221 | { |
garfieldsg | 0:662207e34fba | 1222 | if (num > 3) return; |
garfieldsg | 0:662207e34fba | 1223 | i2Cdev.writeByte(devAddr, MPU6050_RA_I2C_SLV0_ADDR + num*3, address); |
garfieldsg | 0:662207e34fba | 1224 | } |
garfieldsg | 0:662207e34fba | 1225 | /** Get the active internal register for the specified slave (0-3). |
garfieldsg | 0:662207e34fba | 1226 | * Read/write operations for this slave will be done to whatever internal |
garfieldsg | 0:662207e34fba | 1227 | * register address is stored in this MPU register. |
garfieldsg | 0:662207e34fba | 1228 | * |
garfieldsg | 0:662207e34fba | 1229 | * The MPU-6050 supports a total of five slaves, but Slave 4 has unique |
garfieldsg | 0:662207e34fba | 1230 | * characteristics, and so it has its own functions. |
garfieldsg | 0:662207e34fba | 1231 | * |
garfieldsg | 0:662207e34fba | 1232 | * @param num Slave number (0-3) |
garfieldsg | 0:662207e34fba | 1233 | * @return Current active register for specified slave |
garfieldsg | 0:662207e34fba | 1234 | * @see MPU6050_RA_I2C_SLV0_REG |
garfieldsg | 0:662207e34fba | 1235 | */ |
garfieldsg | 0:662207e34fba | 1236 | uint8_t MPU6050::getSlaveRegister(uint8_t num) |
garfieldsg | 0:662207e34fba | 1237 | { |
garfieldsg | 0:662207e34fba | 1238 | if (num > 3) return 0; |
garfieldsg | 0:662207e34fba | 1239 | i2Cdev.readByte(devAddr, MPU6050_RA_I2C_SLV0_REG + num*3, buffer); |
garfieldsg | 0:662207e34fba | 1240 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 1241 | } |
garfieldsg | 0:662207e34fba | 1242 | /** Set the active internal register for the specified slave (0-3). |
garfieldsg | 0:662207e34fba | 1243 | * @param num Slave number (0-3) |
garfieldsg | 0:662207e34fba | 1244 | * @param reg New active register for specified slave |
garfieldsg | 0:662207e34fba | 1245 | * @see getSlaveRegister() |
garfieldsg | 0:662207e34fba | 1246 | * @see MPU6050_RA_I2C_SLV0_REG |
garfieldsg | 0:662207e34fba | 1247 | */ |
garfieldsg | 0:662207e34fba | 1248 | void MPU6050::setSlaveRegister(uint8_t num, uint8_t reg) |
garfieldsg | 0:662207e34fba | 1249 | { |
garfieldsg | 0:662207e34fba | 1250 | if (num > 3) return; |
garfieldsg | 0:662207e34fba | 1251 | i2Cdev.writeByte(devAddr, MPU6050_RA_I2C_SLV0_REG + num*3, reg); |
garfieldsg | 0:662207e34fba | 1252 | } |
garfieldsg | 0:662207e34fba | 1253 | /** Get the enabled value for the specified slave (0-3). |
garfieldsg | 0:662207e34fba | 1254 | * When set to 1, this bit enables Slave 0 for data transfer operations. When |
garfieldsg | 0:662207e34fba | 1255 | * cleared to 0, this bit disables Slave 0 from data transfer operations. |
garfieldsg | 0:662207e34fba | 1256 | * @param num Slave number (0-3) |
garfieldsg | 0:662207e34fba | 1257 | * @return Current enabled value for specified slave |
garfieldsg | 0:662207e34fba | 1258 | * @see MPU6050_RA_I2C_SLV0_CTRL |
garfieldsg | 0:662207e34fba | 1259 | */ |
garfieldsg | 0:662207e34fba | 1260 | bool MPU6050::getSlaveEnabled(uint8_t num) |
garfieldsg | 0:662207e34fba | 1261 | { |
garfieldsg | 0:662207e34fba | 1262 | if (num > 3) return 0; |
garfieldsg | 0:662207e34fba | 1263 | i2Cdev.readBit(devAddr, MPU6050_RA_I2C_SLV0_CTRL + num*3, MPU6050_I2C_SLV_EN_BIT, buffer); |
garfieldsg | 0:662207e34fba | 1264 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 1265 | } |
garfieldsg | 0:662207e34fba | 1266 | /** Set the enabled value for the specified slave (0-3). |
garfieldsg | 0:662207e34fba | 1267 | * @param num Slave number (0-3) |
garfieldsg | 0:662207e34fba | 1268 | * @param enabled New enabled value for specified slave |
garfieldsg | 0:662207e34fba | 1269 | * @see getSlaveEnabled() |
garfieldsg | 0:662207e34fba | 1270 | * @see MPU6050_RA_I2C_SLV0_CTRL |
garfieldsg | 0:662207e34fba | 1271 | */ |
garfieldsg | 0:662207e34fba | 1272 | void MPU6050::setSlaveEnabled(uint8_t num, bool enabled) |
garfieldsg | 0:662207e34fba | 1273 | { |
garfieldsg | 0:662207e34fba | 1274 | if (num > 3) return; |
garfieldsg | 0:662207e34fba | 1275 | i2Cdev.writeBit(devAddr, MPU6050_RA_I2C_SLV0_CTRL + num*3, MPU6050_I2C_SLV_EN_BIT, enabled); |
garfieldsg | 0:662207e34fba | 1276 | } |
garfieldsg | 0:662207e34fba | 1277 | /** Get word pair byte-swapping enabled for the specified slave (0-3). |
garfieldsg | 0:662207e34fba | 1278 | * When set to 1, this bit enables byte swapping. When byte swapping is enabled, |
garfieldsg | 0:662207e34fba | 1279 | * the high and low bytes of a word pair are swapped. Please refer to |
garfieldsg | 0:662207e34fba | 1280 | * I2C_SLV0_GRP for the pairing convention of the word pairs. When cleared to 0, |
garfieldsg | 0:662207e34fba | 1281 | * bytes transferred to and from Slave 0 will be written to EXT_SENS_DATA |
garfieldsg | 0:662207e34fba | 1282 | * registers in the order they were transferred. |
garfieldsg | 0:662207e34fba | 1283 | * |
garfieldsg | 0:662207e34fba | 1284 | * @param num Slave number (0-3) |
garfieldsg | 0:662207e34fba | 1285 | * @return Current word pair byte-swapping enabled value for specified slave |
garfieldsg | 0:662207e34fba | 1286 | * @see MPU6050_RA_I2C_SLV0_CTRL |
garfieldsg | 0:662207e34fba | 1287 | */ |
garfieldsg | 0:662207e34fba | 1288 | bool MPU6050::getSlaveWordByteSwap(uint8_t num) |
garfieldsg | 0:662207e34fba | 1289 | { |
garfieldsg | 0:662207e34fba | 1290 | if (num > 3) return 0; |
garfieldsg | 0:662207e34fba | 1291 | i2Cdev.readBit(devAddr, MPU6050_RA_I2C_SLV0_CTRL + num*3, MPU6050_I2C_SLV_BYTE_SW_BIT, buffer); |
garfieldsg | 0:662207e34fba | 1292 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 1293 | } |
garfieldsg | 0:662207e34fba | 1294 | /** Set word pair byte-swapping enabled for the specified slave (0-3). |
garfieldsg | 0:662207e34fba | 1295 | * @param num Slave number (0-3) |
garfieldsg | 0:662207e34fba | 1296 | * @param enabled New word pair byte-swapping enabled value for specified slave |
garfieldsg | 0:662207e34fba | 1297 | * @see getSlaveWordByteSwap() |
garfieldsg | 0:662207e34fba | 1298 | * @see MPU6050_RA_I2C_SLV0_CTRL |
garfieldsg | 0:662207e34fba | 1299 | */ |
garfieldsg | 0:662207e34fba | 1300 | void MPU6050::setSlaveWordByteSwap(uint8_t num, bool enabled) |
garfieldsg | 0:662207e34fba | 1301 | { |
garfieldsg | 0:662207e34fba | 1302 | if (num > 3) return; |
garfieldsg | 0:662207e34fba | 1303 | i2Cdev.writeBit(devAddr, MPU6050_RA_I2C_SLV0_CTRL + num*3, MPU6050_I2C_SLV_BYTE_SW_BIT, enabled); |
garfieldsg | 0:662207e34fba | 1304 | } |
garfieldsg | 0:662207e34fba | 1305 | /** Get write mode for the specified slave (0-3). |
garfieldsg | 0:662207e34fba | 1306 | * When set to 1, the transaction will read or write data only. When cleared to |
garfieldsg | 0:662207e34fba | 1307 | * 0, the transaction will write a register address prior to reading or writing |
garfieldsg | 0:662207e34fba | 1308 | * data. This should equal 0 when specifying the register address within the |
garfieldsg | 0:662207e34fba | 1309 | * Slave device to/from which the ensuing data transaction will take place. |
garfieldsg | 0:662207e34fba | 1310 | * |
garfieldsg | 0:662207e34fba | 1311 | * @param num Slave number (0-3) |
garfieldsg | 0:662207e34fba | 1312 | * @return Current write mode for specified slave (0 = register address + data, 1 = data only) |
garfieldsg | 0:662207e34fba | 1313 | * @see MPU6050_RA_I2C_SLV0_CTRL |
garfieldsg | 0:662207e34fba | 1314 | */ |
garfieldsg | 0:662207e34fba | 1315 | bool MPU6050::getSlaveWriteMode(uint8_t num) |
garfieldsg | 0:662207e34fba | 1316 | { |
garfieldsg | 0:662207e34fba | 1317 | if (num > 3) return 0; |
garfieldsg | 0:662207e34fba | 1318 | i2Cdev.readBit(devAddr, MPU6050_RA_I2C_SLV0_CTRL + num*3, MPU6050_I2C_SLV_REG_DIS_BIT, buffer); |
garfieldsg | 0:662207e34fba | 1319 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 1320 | } |
garfieldsg | 0:662207e34fba | 1321 | /** Set write mode for the specified slave (0-3). |
garfieldsg | 0:662207e34fba | 1322 | * @param num Slave number (0-3) |
garfieldsg | 0:662207e34fba | 1323 | * @param mode New write mode for specified slave (0 = register address + data, 1 = data only) |
garfieldsg | 0:662207e34fba | 1324 | * @see getSlaveWriteMode() |
garfieldsg | 0:662207e34fba | 1325 | * @see MPU6050_RA_I2C_SLV0_CTRL |
garfieldsg | 0:662207e34fba | 1326 | */ |
garfieldsg | 0:662207e34fba | 1327 | void MPU6050::setSlaveWriteMode(uint8_t num, bool mode) |
garfieldsg | 0:662207e34fba | 1328 | { |
garfieldsg | 0:662207e34fba | 1329 | if (num > 3) return; |
garfieldsg | 0:662207e34fba | 1330 | i2Cdev.writeBit(devAddr, MPU6050_RA_I2C_SLV0_CTRL + num*3, MPU6050_I2C_SLV_REG_DIS_BIT, mode); |
garfieldsg | 0:662207e34fba | 1331 | } |
garfieldsg | 0:662207e34fba | 1332 | /** Get word pair grouping order offset for the specified slave (0-3). |
garfieldsg | 0:662207e34fba | 1333 | * This sets specifies the grouping order of word pairs received from registers. |
garfieldsg | 0:662207e34fba | 1334 | * When cleared to 0, bytes from register addresses 0 and 1, 2 and 3, etc (even, |
garfieldsg | 0:662207e34fba | 1335 | * then odd register addresses) are paired to form a word. When set to 1, bytes |
garfieldsg | 0:662207e34fba | 1336 | * from register addresses are paired 1 and 2, 3 and 4, etc. (odd, then even |
garfieldsg | 0:662207e34fba | 1337 | * register addresses) are paired to form a word. |
garfieldsg | 0:662207e34fba | 1338 | * |
garfieldsg | 0:662207e34fba | 1339 | * @param num Slave number (0-3) |
garfieldsg | 0:662207e34fba | 1340 | * @return Current word pair grouping order offset for specified slave |
garfieldsg | 0:662207e34fba | 1341 | * @see MPU6050_RA_I2C_SLV0_CTRL |
garfieldsg | 0:662207e34fba | 1342 | */ |
garfieldsg | 0:662207e34fba | 1343 | bool MPU6050::getSlaveWordGroupOffset(uint8_t num) |
garfieldsg | 0:662207e34fba | 1344 | { |
garfieldsg | 0:662207e34fba | 1345 | if (num > 3) return 0; |
garfieldsg | 0:662207e34fba | 1346 | i2Cdev.readBit(devAddr, MPU6050_RA_I2C_SLV0_CTRL + num*3, MPU6050_I2C_SLV_GRP_BIT, buffer); |
garfieldsg | 0:662207e34fba | 1347 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 1348 | } |
garfieldsg | 0:662207e34fba | 1349 | /** Set word pair grouping order offset for the specified slave (0-3). |
garfieldsg | 0:662207e34fba | 1350 | * @param num Slave number (0-3) |
garfieldsg | 0:662207e34fba | 1351 | * @param enabled New word pair grouping order offset for specified slave |
garfieldsg | 0:662207e34fba | 1352 | * @see getSlaveWordGroupOffset() |
garfieldsg | 0:662207e34fba | 1353 | * @see MPU6050_RA_I2C_SLV0_CTRL |
garfieldsg | 0:662207e34fba | 1354 | */ |
garfieldsg | 0:662207e34fba | 1355 | void MPU6050::setSlaveWordGroupOffset(uint8_t num, bool enabled) |
garfieldsg | 0:662207e34fba | 1356 | { |
garfieldsg | 0:662207e34fba | 1357 | if (num > 3) return; |
garfieldsg | 0:662207e34fba | 1358 | i2Cdev.writeBit(devAddr, MPU6050_RA_I2C_SLV0_CTRL + num*3, MPU6050_I2C_SLV_GRP_BIT, enabled); |
garfieldsg | 0:662207e34fba | 1359 | } |
garfieldsg | 0:662207e34fba | 1360 | /** Get number of bytes to read for the specified slave (0-3). |
garfieldsg | 0:662207e34fba | 1361 | * Specifies the number of bytes transferred to and from Slave 0. Clearing this |
garfieldsg | 0:662207e34fba | 1362 | * bit to 0 is equivalent to disabling the register by writing 0 to I2C_SLV0_EN. |
garfieldsg | 0:662207e34fba | 1363 | * @param num Slave number (0-3) |
garfieldsg | 0:662207e34fba | 1364 | * @return Number of bytes to read for specified slave |
garfieldsg | 0:662207e34fba | 1365 | * @see MPU6050_RA_I2C_SLV0_CTRL |
garfieldsg | 0:662207e34fba | 1366 | */ |
garfieldsg | 0:662207e34fba | 1367 | uint8_t MPU6050::getSlaveDataLength(uint8_t num) |
garfieldsg | 0:662207e34fba | 1368 | { |
garfieldsg | 0:662207e34fba | 1369 | if (num > 3) return 0; |
garfieldsg | 0:662207e34fba | 1370 | i2Cdev.readBits(devAddr, MPU6050_RA_I2C_SLV0_CTRL + num*3, MPU6050_I2C_SLV_LEN_BIT, MPU6050_I2C_SLV_LEN_LENGTH, buffer); |
garfieldsg | 0:662207e34fba | 1371 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 1372 | } |
garfieldsg | 0:662207e34fba | 1373 | /** Set number of bytes to read for the specified slave (0-3). |
garfieldsg | 0:662207e34fba | 1374 | * @param num Slave number (0-3) |
garfieldsg | 0:662207e34fba | 1375 | * @param length Number of bytes to read for specified slave |
garfieldsg | 0:662207e34fba | 1376 | * @see getSlaveDataLength() |
garfieldsg | 0:662207e34fba | 1377 | * @see MPU6050_RA_I2C_SLV0_CTRL |
garfieldsg | 0:662207e34fba | 1378 | */ |
garfieldsg | 0:662207e34fba | 1379 | void MPU6050::setSlaveDataLength(uint8_t num, uint8_t length) |
garfieldsg | 0:662207e34fba | 1380 | { |
garfieldsg | 0:662207e34fba | 1381 | if (num > 3) return; |
garfieldsg | 0:662207e34fba | 1382 | i2Cdev.writeBits(devAddr, MPU6050_RA_I2C_SLV0_CTRL + num*3, MPU6050_I2C_SLV_LEN_BIT, MPU6050_I2C_SLV_LEN_LENGTH, length); |
garfieldsg | 0:662207e34fba | 1383 | } |
garfieldsg | 0:662207e34fba | 1384 | |
garfieldsg | 0:662207e34fba | 1385 | // I2C_SLV* registers (Slave 4) |
garfieldsg | 0:662207e34fba | 1386 | |
garfieldsg | 0:662207e34fba | 1387 | /** Get the I2C address of Slave 4. |
garfieldsg | 0:662207e34fba | 1388 | * Note that Bit 7 (MSB) controls read/write mode. If Bit 7 is set, it's a read |
garfieldsg | 0:662207e34fba | 1389 | * operation, and if it is cleared, then it's a write operation. The remaining |
garfieldsg | 0:662207e34fba | 1390 | * bits (6-0) are the 7-bit device address of the slave device. |
garfieldsg | 0:662207e34fba | 1391 | * |
garfieldsg | 0:662207e34fba | 1392 | * @return Current address for Slave 4 |
garfieldsg | 0:662207e34fba | 1393 | * @see getSlaveAddress() |
garfieldsg | 0:662207e34fba | 1394 | * @see MPU6050_RA_I2C_SLV4_ADDR |
garfieldsg | 0:662207e34fba | 1395 | */ |
garfieldsg | 0:662207e34fba | 1396 | uint8_t MPU6050::getSlave4Address() |
garfieldsg | 0:662207e34fba | 1397 | { |
garfieldsg | 0:662207e34fba | 1398 | i2Cdev.readByte(devAddr, MPU6050_RA_I2C_SLV4_ADDR, buffer); |
garfieldsg | 0:662207e34fba | 1399 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 1400 | } |
garfieldsg | 0:662207e34fba | 1401 | /** Set the I2C address of Slave 4. |
garfieldsg | 0:662207e34fba | 1402 | * @param address New address for Slave 4 |
garfieldsg | 0:662207e34fba | 1403 | * @see getSlave4Address() |
garfieldsg | 0:662207e34fba | 1404 | * @see MPU6050_RA_I2C_SLV4_ADDR |
garfieldsg | 0:662207e34fba | 1405 | */ |
garfieldsg | 0:662207e34fba | 1406 | void MPU6050::setSlave4Address(uint8_t address) |
garfieldsg | 0:662207e34fba | 1407 | { |
garfieldsg | 0:662207e34fba | 1408 | i2Cdev.writeByte(devAddr, MPU6050_RA_I2C_SLV4_ADDR, address); |
garfieldsg | 0:662207e34fba | 1409 | } |
garfieldsg | 0:662207e34fba | 1410 | /** Get the active internal register for the Slave 4. |
garfieldsg | 0:662207e34fba | 1411 | * Read/write operations for this slave will be done to whatever internal |
garfieldsg | 0:662207e34fba | 1412 | * register address is stored in this MPU register. |
garfieldsg | 0:662207e34fba | 1413 | * |
garfieldsg | 0:662207e34fba | 1414 | * @return Current active register for Slave 4 |
garfieldsg | 0:662207e34fba | 1415 | * @see MPU6050_RA_I2C_SLV4_REG |
garfieldsg | 0:662207e34fba | 1416 | */ |
garfieldsg | 0:662207e34fba | 1417 | uint8_t MPU6050::getSlave4Register() |
garfieldsg | 0:662207e34fba | 1418 | { |
garfieldsg | 0:662207e34fba | 1419 | i2Cdev.readByte(devAddr, MPU6050_RA_I2C_SLV4_REG, buffer); |
garfieldsg | 0:662207e34fba | 1420 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 1421 | } |
garfieldsg | 0:662207e34fba | 1422 | /** Set the active internal register for Slave 4. |
garfieldsg | 0:662207e34fba | 1423 | * @param reg New active register for Slave 4 |
garfieldsg | 0:662207e34fba | 1424 | * @see getSlave4Register() |
garfieldsg | 0:662207e34fba | 1425 | * @see MPU6050_RA_I2C_SLV4_REG |
garfieldsg | 0:662207e34fba | 1426 | */ |
garfieldsg | 0:662207e34fba | 1427 | void MPU6050::setSlave4Register(uint8_t reg) |
garfieldsg | 0:662207e34fba | 1428 | { |
garfieldsg | 0:662207e34fba | 1429 | i2Cdev.writeByte(devAddr, MPU6050_RA_I2C_SLV4_REG, reg); |
garfieldsg | 0:662207e34fba | 1430 | } |
garfieldsg | 0:662207e34fba | 1431 | /** Set new byte to write to Slave 4. |
garfieldsg | 0:662207e34fba | 1432 | * This register stores the data to be written into the Slave 4. If I2C_SLV4_RW |
garfieldsg | 0:662207e34fba | 1433 | * is set 1 (set to read), this register has no effect. |
garfieldsg | 0:662207e34fba | 1434 | * @param data New byte to write to Slave 4 |
garfieldsg | 0:662207e34fba | 1435 | * @see MPU6050_RA_I2C_SLV4_DO |
garfieldsg | 0:662207e34fba | 1436 | */ |
garfieldsg | 0:662207e34fba | 1437 | void MPU6050::setSlave4OutputByte(uint8_t data) |
garfieldsg | 0:662207e34fba | 1438 | { |
garfieldsg | 0:662207e34fba | 1439 | i2Cdev.writeByte(devAddr, MPU6050_RA_I2C_SLV4_DO, data); |
garfieldsg | 0:662207e34fba | 1440 | } |
garfieldsg | 0:662207e34fba | 1441 | /** Get the enabled value for the Slave 4. |
garfieldsg | 0:662207e34fba | 1442 | * When set to 1, this bit enables Slave 4 for data transfer operations. When |
garfieldsg | 0:662207e34fba | 1443 | * cleared to 0, this bit disables Slave 4 from data transfer operations. |
garfieldsg | 0:662207e34fba | 1444 | * @return Current enabled value for Slave 4 |
garfieldsg | 0:662207e34fba | 1445 | * @see MPU6050_RA_I2C_SLV4_CTRL |
garfieldsg | 0:662207e34fba | 1446 | */ |
garfieldsg | 0:662207e34fba | 1447 | bool MPU6050::getSlave4Enabled() |
garfieldsg | 0:662207e34fba | 1448 | { |
garfieldsg | 0:662207e34fba | 1449 | i2Cdev.readBit(devAddr, MPU6050_RA_I2C_SLV4_CTRL, MPU6050_I2C_SLV4_EN_BIT, buffer); |
garfieldsg | 0:662207e34fba | 1450 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 1451 | } |
garfieldsg | 0:662207e34fba | 1452 | /** Set the enabled value for Slave 4. |
garfieldsg | 0:662207e34fba | 1453 | * @param enabled New enabled value for Slave 4 |
garfieldsg | 0:662207e34fba | 1454 | * @see getSlave4Enabled() |
garfieldsg | 0:662207e34fba | 1455 | * @see MPU6050_RA_I2C_SLV4_CTRL |
garfieldsg | 0:662207e34fba | 1456 | */ |
garfieldsg | 0:662207e34fba | 1457 | void MPU6050::setSlave4Enabled(bool enabled) |
garfieldsg | 0:662207e34fba | 1458 | { |
garfieldsg | 0:662207e34fba | 1459 | i2Cdev.writeBit(devAddr, MPU6050_RA_I2C_SLV4_CTRL, MPU6050_I2C_SLV4_EN_BIT, enabled); |
garfieldsg | 0:662207e34fba | 1460 | } |
garfieldsg | 0:662207e34fba | 1461 | /** Get the enabled value for Slave 4 transaction interrupts. |
garfieldsg | 0:662207e34fba | 1462 | * When set to 1, this bit enables the generation of an interrupt signal upon |
garfieldsg | 0:662207e34fba | 1463 | * completion of a Slave 4 transaction. When cleared to 0, this bit disables the |
garfieldsg | 0:662207e34fba | 1464 | * generation of an interrupt signal upon completion of a Slave 4 transaction. |
garfieldsg | 0:662207e34fba | 1465 | * The interrupt status can be observed in Register 54. |
garfieldsg | 0:662207e34fba | 1466 | * |
garfieldsg | 0:662207e34fba | 1467 | * @return Current enabled value for Slave 4 transaction interrupts. |
garfieldsg | 0:662207e34fba | 1468 | * @see MPU6050_RA_I2C_SLV4_CTRL |
garfieldsg | 0:662207e34fba | 1469 | */ |
garfieldsg | 0:662207e34fba | 1470 | bool MPU6050::getSlave4InterruptEnabled() |
garfieldsg | 0:662207e34fba | 1471 | { |
garfieldsg | 0:662207e34fba | 1472 | i2Cdev.readBit(devAddr, MPU6050_RA_I2C_SLV4_CTRL, MPU6050_I2C_SLV4_INT_EN_BIT, buffer); |
garfieldsg | 0:662207e34fba | 1473 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 1474 | } |
garfieldsg | 0:662207e34fba | 1475 | /** Set the enabled value for Slave 4 transaction interrupts. |
garfieldsg | 0:662207e34fba | 1476 | * @param enabled New enabled value for Slave 4 transaction interrupts. |
garfieldsg | 0:662207e34fba | 1477 | * @see getSlave4InterruptEnabled() |
garfieldsg | 0:662207e34fba | 1478 | * @see MPU6050_RA_I2C_SLV4_CTRL |
garfieldsg | 0:662207e34fba | 1479 | */ |
garfieldsg | 0:662207e34fba | 1480 | void MPU6050::setSlave4InterruptEnabled(bool enabled) |
garfieldsg | 0:662207e34fba | 1481 | { |
garfieldsg | 0:662207e34fba | 1482 | i2Cdev.writeBit(devAddr, MPU6050_RA_I2C_SLV4_CTRL, MPU6050_I2C_SLV4_INT_EN_BIT, enabled); |
garfieldsg | 0:662207e34fba | 1483 | } |
garfieldsg | 0:662207e34fba | 1484 | /** Get write mode for Slave 4. |
garfieldsg | 0:662207e34fba | 1485 | * When set to 1, the transaction will read or write data only. When cleared to |
garfieldsg | 0:662207e34fba | 1486 | * 0, the transaction will write a register address prior to reading or writing |
garfieldsg | 0:662207e34fba | 1487 | * data. This should equal 0 when specifying the register address within the |
garfieldsg | 0:662207e34fba | 1488 | * Slave device to/from which the ensuing data transaction will take place. |
garfieldsg | 0:662207e34fba | 1489 | * |
garfieldsg | 0:662207e34fba | 1490 | * @return Current write mode for Slave 4 (0 = register address + data, 1 = data only) |
garfieldsg | 0:662207e34fba | 1491 | * @see MPU6050_RA_I2C_SLV4_CTRL |
garfieldsg | 0:662207e34fba | 1492 | */ |
garfieldsg | 0:662207e34fba | 1493 | bool MPU6050::getSlave4WriteMode() |
garfieldsg | 0:662207e34fba | 1494 | { |
garfieldsg | 0:662207e34fba | 1495 | i2Cdev.readBit(devAddr, MPU6050_RA_I2C_SLV4_CTRL, MPU6050_I2C_SLV4_REG_DIS_BIT, buffer); |
garfieldsg | 0:662207e34fba | 1496 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 1497 | } |
garfieldsg | 0:662207e34fba | 1498 | /** Set write mode for the Slave 4. |
garfieldsg | 0:662207e34fba | 1499 | * @param mode New write mode for Slave 4 (0 = register address + data, 1 = data only) |
garfieldsg | 0:662207e34fba | 1500 | * @see getSlave4WriteMode() |
garfieldsg | 0:662207e34fba | 1501 | * @see MPU6050_RA_I2C_SLV4_CTRL |
garfieldsg | 0:662207e34fba | 1502 | */ |
garfieldsg | 0:662207e34fba | 1503 | void MPU6050::setSlave4WriteMode(bool mode) |
garfieldsg | 0:662207e34fba | 1504 | { |
garfieldsg | 0:662207e34fba | 1505 | i2Cdev.writeBit(devAddr, MPU6050_RA_I2C_SLV4_CTRL, MPU6050_I2C_SLV4_REG_DIS_BIT, mode); |
garfieldsg | 0:662207e34fba | 1506 | } |
garfieldsg | 0:662207e34fba | 1507 | /** Get Slave 4 master delay value. |
garfieldsg | 0:662207e34fba | 1508 | * This configures the reduced access rate of I2C slaves relative to the Sample |
garfieldsg | 0:662207e34fba | 1509 | * Rate. When a slave's access rate is decreased relative to the Sample Rate, |
garfieldsg | 0:662207e34fba | 1510 | * the slave is accessed every: |
garfieldsg | 0:662207e34fba | 1511 | * |
garfieldsg | 0:662207e34fba | 1512 | * 1 / (1 + I2C_MST_DLY) samples |
garfieldsg | 0:662207e34fba | 1513 | * |
garfieldsg | 0:662207e34fba | 1514 | * This base Sample Rate in turn is determined by SMPLRT_DIV (register 25) and |
garfieldsg | 0:662207e34fba | 1515 | * DLPF_CFG (register 26). Whether a slave's access rate is reduced relative to |
garfieldsg | 0:662207e34fba | 1516 | * the Sample Rate is determined by I2C_MST_DELAY_CTRL (register 103). For |
garfieldsg | 0:662207e34fba | 1517 | * further information regarding the Sample Rate, please refer to register 25. |
garfieldsg | 0:662207e34fba | 1518 | * |
garfieldsg | 0:662207e34fba | 1519 | * @return Current Slave 4 master delay value |
garfieldsg | 0:662207e34fba | 1520 | * @see MPU6050_RA_I2C_SLV4_CTRL |
garfieldsg | 0:662207e34fba | 1521 | */ |
garfieldsg | 0:662207e34fba | 1522 | uint8_t MPU6050::getSlave4MasterDelay() |
garfieldsg | 0:662207e34fba | 1523 | { |
garfieldsg | 0:662207e34fba | 1524 | i2Cdev.readBits(devAddr, MPU6050_RA_I2C_SLV4_CTRL, MPU6050_I2C_SLV4_MST_DLY_BIT, MPU6050_I2C_SLV4_MST_DLY_LENGTH, buffer); |
garfieldsg | 0:662207e34fba | 1525 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 1526 | } |
garfieldsg | 0:662207e34fba | 1527 | /** Set Slave 4 master delay value. |
garfieldsg | 0:662207e34fba | 1528 | * @param delay New Slave 4 master delay value |
garfieldsg | 0:662207e34fba | 1529 | * @see getSlave4MasterDelay() |
garfieldsg | 0:662207e34fba | 1530 | * @see MPU6050_RA_I2C_SLV4_CTRL |
garfieldsg | 0:662207e34fba | 1531 | */ |
garfieldsg | 0:662207e34fba | 1532 | void MPU6050::setSlave4MasterDelay(uint8_t delay) |
garfieldsg | 0:662207e34fba | 1533 | { |
garfieldsg | 0:662207e34fba | 1534 | i2Cdev.writeBits(devAddr, MPU6050_RA_I2C_SLV4_CTRL, MPU6050_I2C_SLV4_MST_DLY_BIT, MPU6050_I2C_SLV4_MST_DLY_LENGTH, delay); |
garfieldsg | 0:662207e34fba | 1535 | } |
garfieldsg | 0:662207e34fba | 1536 | /** Get last available byte read from Slave 4. |
garfieldsg | 0:662207e34fba | 1537 | * This register stores the data read from Slave 4. This field is populated |
garfieldsg | 0:662207e34fba | 1538 | * after a read transaction. |
garfieldsg | 0:662207e34fba | 1539 | * @return Last available byte read from to Slave 4 |
garfieldsg | 0:662207e34fba | 1540 | * @see MPU6050_RA_I2C_SLV4_DI |
garfieldsg | 0:662207e34fba | 1541 | */ |
garfieldsg | 0:662207e34fba | 1542 | uint8_t MPU6050::getSlate4InputByte() |
garfieldsg | 0:662207e34fba | 1543 | { |
garfieldsg | 0:662207e34fba | 1544 | i2Cdev.readByte(devAddr, MPU6050_RA_I2C_SLV4_DI, buffer); |
garfieldsg | 0:662207e34fba | 1545 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 1546 | } |
garfieldsg | 0:662207e34fba | 1547 | |
garfieldsg | 0:662207e34fba | 1548 | // I2C_MST_STATUS register |
garfieldsg | 0:662207e34fba | 1549 | |
garfieldsg | 0:662207e34fba | 1550 | /** Get FSYNC interrupt status. |
garfieldsg | 0:662207e34fba | 1551 | * This bit reflects the status of the FSYNC interrupt from an external device |
garfieldsg | 0:662207e34fba | 1552 | * into the MPU-60X0. This is used as a way to pass an external interrupt |
garfieldsg | 0:662207e34fba | 1553 | * through the MPU-60X0 to the host application processor. When set to 1, this |
garfieldsg | 0:662207e34fba | 1554 | * bit will cause an interrupt if FSYNC_INT_EN is asserted in INT_PIN_CFG |
garfieldsg | 0:662207e34fba | 1555 | * (Register 55). |
garfieldsg | 0:662207e34fba | 1556 | * @return FSYNC interrupt status |
garfieldsg | 0:662207e34fba | 1557 | * @see MPU6050_RA_I2C_MST_STATUS |
garfieldsg | 0:662207e34fba | 1558 | */ |
garfieldsg | 0:662207e34fba | 1559 | bool MPU6050::getPassthroughStatus() |
garfieldsg | 0:662207e34fba | 1560 | { |
garfieldsg | 0:662207e34fba | 1561 | i2Cdev.readBit(devAddr, MPU6050_RA_I2C_MST_STATUS, MPU6050_MST_PASS_THROUGH_BIT, buffer); |
garfieldsg | 0:662207e34fba | 1562 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 1563 | } |
garfieldsg | 0:662207e34fba | 1564 | /** Get Slave 4 transaction done status. |
garfieldsg | 0:662207e34fba | 1565 | * Automatically sets to 1 when a Slave 4 transaction has completed. This |
garfieldsg | 0:662207e34fba | 1566 | * triggers an interrupt if the I2C_MST_INT_EN bit in the INT_ENABLE register |
garfieldsg | 0:662207e34fba | 1567 | * (Register 56) is asserted and if the SLV_4_DONE_INT bit is asserted in the |
garfieldsg | 0:662207e34fba | 1568 | * I2C_SLV4_CTRL register (Register 52). |
garfieldsg | 0:662207e34fba | 1569 | * @return Slave 4 transaction done status |
garfieldsg | 0:662207e34fba | 1570 | * @see MPU6050_RA_I2C_MST_STATUS |
garfieldsg | 0:662207e34fba | 1571 | */ |
garfieldsg | 0:662207e34fba | 1572 | bool MPU6050::getSlave4IsDone() |
garfieldsg | 0:662207e34fba | 1573 | { |
garfieldsg | 0:662207e34fba | 1574 | i2Cdev.readBit(devAddr, MPU6050_RA_I2C_MST_STATUS, MPU6050_MST_I2C_SLV4_DONE_BIT, buffer); |
garfieldsg | 0:662207e34fba | 1575 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 1576 | } |
garfieldsg | 0:662207e34fba | 1577 | /** Get master arbitration lost status. |
garfieldsg | 0:662207e34fba | 1578 | * This bit automatically sets to 1 when the I2C Master has lost arbitration of |
garfieldsg | 0:662207e34fba | 1579 | * the auxiliary I2C bus (an error condition). This triggers an interrupt if the |
garfieldsg | 0:662207e34fba | 1580 | * I2C_MST_INT_EN bit in the INT_ENABLE register (Register 56) is asserted. |
garfieldsg | 0:662207e34fba | 1581 | * @return Master arbitration lost status |
garfieldsg | 0:662207e34fba | 1582 | * @see MPU6050_RA_I2C_MST_STATUS |
garfieldsg | 0:662207e34fba | 1583 | */ |
garfieldsg | 0:662207e34fba | 1584 | bool MPU6050::getLostArbitration() |
garfieldsg | 0:662207e34fba | 1585 | { |
garfieldsg | 0:662207e34fba | 1586 | i2Cdev.readBit(devAddr, MPU6050_RA_I2C_MST_STATUS, MPU6050_MST_I2C_LOST_ARB_BIT, buffer); |
garfieldsg | 0:662207e34fba | 1587 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 1588 | } |
garfieldsg | 0:662207e34fba | 1589 | /** Get Slave 4 NACK status. |
garfieldsg | 0:662207e34fba | 1590 | * This bit automatically sets to 1 when the I2C Master receives a NACK in a |
garfieldsg | 0:662207e34fba | 1591 | * transaction with Slave 4. This triggers an interrupt if the I2C_MST_INT_EN |
garfieldsg | 0:662207e34fba | 1592 | * bit in the INT_ENABLE register (Register 56) is asserted. |
garfieldsg | 0:662207e34fba | 1593 | * @return Slave 4 NACK interrupt status |
garfieldsg | 0:662207e34fba | 1594 | * @see MPU6050_RA_I2C_MST_STATUS |
garfieldsg | 0:662207e34fba | 1595 | */ |
garfieldsg | 0:662207e34fba | 1596 | bool MPU6050::getSlave4Nack() |
garfieldsg | 0:662207e34fba | 1597 | { |
garfieldsg | 0:662207e34fba | 1598 | i2Cdev.readBit(devAddr, MPU6050_RA_I2C_MST_STATUS, MPU6050_MST_I2C_SLV4_NACK_BIT, buffer); |
garfieldsg | 0:662207e34fba | 1599 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 1600 | } |
garfieldsg | 0:662207e34fba | 1601 | /** Get Slave 3 NACK status. |
garfieldsg | 0:662207e34fba | 1602 | * This bit automatically sets to 1 when the I2C Master receives a NACK in a |
garfieldsg | 0:662207e34fba | 1603 | * transaction with Slave 3. This triggers an interrupt if the I2C_MST_INT_EN |
garfieldsg | 0:662207e34fba | 1604 | * bit in the INT_ENABLE register (Register 56) is asserted. |
garfieldsg | 0:662207e34fba | 1605 | * @return Slave 3 NACK interrupt status |
garfieldsg | 0:662207e34fba | 1606 | * @see MPU6050_RA_I2C_MST_STATUS |
garfieldsg | 0:662207e34fba | 1607 | */ |
garfieldsg | 0:662207e34fba | 1608 | bool MPU6050::getSlave3Nack() |
garfieldsg | 0:662207e34fba | 1609 | { |
garfieldsg | 0:662207e34fba | 1610 | i2Cdev.readBit(devAddr, MPU6050_RA_I2C_MST_STATUS, MPU6050_MST_I2C_SLV3_NACK_BIT, buffer); |
garfieldsg | 0:662207e34fba | 1611 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 1612 | } |
garfieldsg | 0:662207e34fba | 1613 | /** Get Slave 2 NACK status. |
garfieldsg | 0:662207e34fba | 1614 | * This bit automatically sets to 1 when the I2C Master receives a NACK in a |
garfieldsg | 0:662207e34fba | 1615 | * transaction with Slave 2. This triggers an interrupt if the I2C_MST_INT_EN |
garfieldsg | 0:662207e34fba | 1616 | * bit in the INT_ENABLE register (Register 56) is asserted. |
garfieldsg | 0:662207e34fba | 1617 | * @return Slave 2 NACK interrupt status |
garfieldsg | 0:662207e34fba | 1618 | * @see MPU6050_RA_I2C_MST_STATUS |
garfieldsg | 0:662207e34fba | 1619 | */ |
garfieldsg | 0:662207e34fba | 1620 | bool MPU6050::getSlave2Nack() |
garfieldsg | 0:662207e34fba | 1621 | { |
garfieldsg | 0:662207e34fba | 1622 | i2Cdev.readBit(devAddr, MPU6050_RA_I2C_MST_STATUS, MPU6050_MST_I2C_SLV2_NACK_BIT, buffer); |
garfieldsg | 0:662207e34fba | 1623 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 1624 | } |
garfieldsg | 0:662207e34fba | 1625 | /** Get Slave 1 NACK status. |
garfieldsg | 0:662207e34fba | 1626 | * This bit automatically sets to 1 when the I2C Master receives a NACK in a |
garfieldsg | 0:662207e34fba | 1627 | * transaction with Slave 1. This triggers an interrupt if the I2C_MST_INT_EN |
garfieldsg | 0:662207e34fba | 1628 | * bit in the INT_ENABLE register (Register 56) is asserted. |
garfieldsg | 0:662207e34fba | 1629 | * @return Slave 1 NACK interrupt status |
garfieldsg | 0:662207e34fba | 1630 | * @see MPU6050_RA_I2C_MST_STATUS |
garfieldsg | 0:662207e34fba | 1631 | */ |
garfieldsg | 0:662207e34fba | 1632 | bool MPU6050::getSlave1Nack() |
garfieldsg | 0:662207e34fba | 1633 | { |
garfieldsg | 0:662207e34fba | 1634 | i2Cdev.readBit(devAddr, MPU6050_RA_I2C_MST_STATUS, MPU6050_MST_I2C_SLV1_NACK_BIT, buffer); |
garfieldsg | 0:662207e34fba | 1635 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 1636 | } |
garfieldsg | 0:662207e34fba | 1637 | /** Get Slave 0 NACK status. |
garfieldsg | 0:662207e34fba | 1638 | * This bit automatically sets to 1 when the I2C Master receives a NACK in a |
garfieldsg | 0:662207e34fba | 1639 | * transaction with Slave 0. This triggers an interrupt if the I2C_MST_INT_EN |
garfieldsg | 0:662207e34fba | 1640 | * bit in the INT_ENABLE register (Register 56) is asserted. |
garfieldsg | 0:662207e34fba | 1641 | * @return Slave 0 NACK interrupt status |
garfieldsg | 0:662207e34fba | 1642 | * @see MPU6050_RA_I2C_MST_STATUS |
garfieldsg | 0:662207e34fba | 1643 | */ |
garfieldsg | 0:662207e34fba | 1644 | bool MPU6050::getSlave0Nack() |
garfieldsg | 0:662207e34fba | 1645 | { |
garfieldsg | 0:662207e34fba | 1646 | i2Cdev.readBit(devAddr, MPU6050_RA_I2C_MST_STATUS, MPU6050_MST_I2C_SLV0_NACK_BIT, buffer); |
garfieldsg | 0:662207e34fba | 1647 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 1648 | } |
garfieldsg | 0:662207e34fba | 1649 | |
garfieldsg | 0:662207e34fba | 1650 | // INT_PIN_CFG register |
garfieldsg | 0:662207e34fba | 1651 | |
garfieldsg | 0:662207e34fba | 1652 | /** Get interrupt logic level mode. |
garfieldsg | 0:662207e34fba | 1653 | * Will be set 0 for active-high, 1 for active-low. |
garfieldsg | 0:662207e34fba | 1654 | * @return Current interrupt mode (0=active-high, 1=active-low) |
garfieldsg | 0:662207e34fba | 1655 | * @see MPU6050_RA_INT_PIN_CFG |
garfieldsg | 0:662207e34fba | 1656 | * @see MPU6050_INTCFG_INT_LEVEL_BIT |
garfieldsg | 0:662207e34fba | 1657 | */ |
garfieldsg | 0:662207e34fba | 1658 | bool MPU6050::getInterruptMode() |
garfieldsg | 0:662207e34fba | 1659 | { |
garfieldsg | 0:662207e34fba | 1660 | i2Cdev.readBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_INT_LEVEL_BIT, buffer); |
garfieldsg | 0:662207e34fba | 1661 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 1662 | } |
garfieldsg | 0:662207e34fba | 1663 | /** Set interrupt logic level mode. |
garfieldsg | 0:662207e34fba | 1664 | * @param mode New interrupt mode (0=active-high, 1=active-low) |
garfieldsg | 0:662207e34fba | 1665 | * @see getInterruptMode() |
garfieldsg | 0:662207e34fba | 1666 | * @see MPU6050_RA_INT_PIN_CFG |
garfieldsg | 0:662207e34fba | 1667 | * @see MPU6050_INTCFG_INT_LEVEL_BIT |
garfieldsg | 0:662207e34fba | 1668 | */ |
garfieldsg | 0:662207e34fba | 1669 | void MPU6050::setInterruptMode(bool mode) |
garfieldsg | 0:662207e34fba | 1670 | { |
garfieldsg | 0:662207e34fba | 1671 | i2Cdev.writeBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_INT_LEVEL_BIT, mode); |
garfieldsg | 0:662207e34fba | 1672 | } |
garfieldsg | 0:662207e34fba | 1673 | /** Get interrupt drive mode. |
garfieldsg | 0:662207e34fba | 1674 | * Will be set 0 for push-pull, 1 for open-drain. |
garfieldsg | 0:662207e34fba | 1675 | * @return Current interrupt drive mode (0=push-pull, 1=open-drain) |
garfieldsg | 0:662207e34fba | 1676 | * @see MPU6050_RA_INT_PIN_CFG |
garfieldsg | 0:662207e34fba | 1677 | * @see MPU6050_INTCFG_INT_OPEN_BIT |
garfieldsg | 0:662207e34fba | 1678 | */ |
garfieldsg | 0:662207e34fba | 1679 | bool MPU6050::getInterruptDrive() |
garfieldsg | 0:662207e34fba | 1680 | { |
garfieldsg | 0:662207e34fba | 1681 | i2Cdev.readBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_INT_OPEN_BIT, buffer); |
garfieldsg | 0:662207e34fba | 1682 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 1683 | } |
garfieldsg | 0:662207e34fba | 1684 | /** Set interrupt drive mode. |
garfieldsg | 0:662207e34fba | 1685 | * @param drive New interrupt drive mode (0=push-pull, 1=open-drain) |
garfieldsg | 0:662207e34fba | 1686 | * @see getInterruptDrive() |
garfieldsg | 0:662207e34fba | 1687 | * @see MPU6050_RA_INT_PIN_CFG |
garfieldsg | 0:662207e34fba | 1688 | * @see MPU6050_INTCFG_INT_OPEN_BIT |
garfieldsg | 0:662207e34fba | 1689 | */ |
garfieldsg | 0:662207e34fba | 1690 | void MPU6050::setInterruptDrive(bool drive) |
garfieldsg | 0:662207e34fba | 1691 | { |
garfieldsg | 0:662207e34fba | 1692 | i2Cdev.writeBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_INT_OPEN_BIT, drive); |
garfieldsg | 0:662207e34fba | 1693 | } |
garfieldsg | 0:662207e34fba | 1694 | /** Get interrupt latch mode. |
garfieldsg | 0:662207e34fba | 1695 | * Will be set 0 for 50us-pulse, 1 for latch-until-int-cleared. |
garfieldsg | 0:662207e34fba | 1696 | * @return Current latch mode (0=50us-pulse, 1=latch-until-int-cleared) |
garfieldsg | 0:662207e34fba | 1697 | * @see MPU6050_RA_INT_PIN_CFG |
garfieldsg | 0:662207e34fba | 1698 | * @see MPU6050_INTCFG_LATCH_INT_EN_BIT |
garfieldsg | 0:662207e34fba | 1699 | */ |
garfieldsg | 0:662207e34fba | 1700 | bool MPU6050::getInterruptLatch() |
garfieldsg | 0:662207e34fba | 1701 | { |
garfieldsg | 0:662207e34fba | 1702 | i2Cdev.readBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_LATCH_INT_EN_BIT, buffer); |
garfieldsg | 0:662207e34fba | 1703 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 1704 | } |
garfieldsg | 0:662207e34fba | 1705 | /** Set interrupt latch mode. |
garfieldsg | 0:662207e34fba | 1706 | * @param latch New latch mode (0=50us-pulse, 1=latch-until-int-cleared) |
garfieldsg | 0:662207e34fba | 1707 | * @see getInterruptLatch() |
garfieldsg | 0:662207e34fba | 1708 | * @see MPU6050_RA_INT_PIN_CFG |
garfieldsg | 0:662207e34fba | 1709 | * @see MPU6050_INTCFG_LATCH_INT_EN_BIT |
garfieldsg | 0:662207e34fba | 1710 | */ |
garfieldsg | 0:662207e34fba | 1711 | void MPU6050::setInterruptLatch(bool latch) |
garfieldsg | 0:662207e34fba | 1712 | { |
garfieldsg | 0:662207e34fba | 1713 | i2Cdev.writeBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_LATCH_INT_EN_BIT, latch); |
garfieldsg | 0:662207e34fba | 1714 | } |
garfieldsg | 0:662207e34fba | 1715 | /** Get interrupt latch clear mode. |
garfieldsg | 0:662207e34fba | 1716 | * Will be set 0 for status-read-only, 1 for any-register-read. |
garfieldsg | 0:662207e34fba | 1717 | * @return Current latch clear mode (0=status-read-only, 1=any-register-read) |
garfieldsg | 0:662207e34fba | 1718 | * @see MPU6050_RA_INT_PIN_CFG |
garfieldsg | 0:662207e34fba | 1719 | * @see MPU6050_INTCFG_INT_RD_CLEAR_BIT |
garfieldsg | 0:662207e34fba | 1720 | */ |
garfieldsg | 0:662207e34fba | 1721 | bool MPU6050::getInterruptLatchClear() |
garfieldsg | 0:662207e34fba | 1722 | { |
garfieldsg | 0:662207e34fba | 1723 | i2Cdev.readBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_INT_RD_CLEAR_BIT, buffer); |
garfieldsg | 0:662207e34fba | 1724 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 1725 | } |
garfieldsg | 0:662207e34fba | 1726 | /** Set interrupt latch clear mode. |
garfieldsg | 0:662207e34fba | 1727 | * @param clear New latch clear mode (0=status-read-only, 1=any-register-read) |
garfieldsg | 0:662207e34fba | 1728 | * @see getInterruptLatchClear() |
garfieldsg | 0:662207e34fba | 1729 | * @see MPU6050_RA_INT_PIN_CFG |
garfieldsg | 0:662207e34fba | 1730 | * @see MPU6050_INTCFG_INT_RD_CLEAR_BIT |
garfieldsg | 0:662207e34fba | 1731 | */ |
garfieldsg | 0:662207e34fba | 1732 | void MPU6050::setInterruptLatchClear(bool clear) |
garfieldsg | 0:662207e34fba | 1733 | { |
garfieldsg | 0:662207e34fba | 1734 | i2Cdev.writeBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_INT_RD_CLEAR_BIT, clear); |
garfieldsg | 0:662207e34fba | 1735 | } |
garfieldsg | 0:662207e34fba | 1736 | /** Get FSYNC interrupt logic level mode. |
garfieldsg | 0:662207e34fba | 1737 | * @return Current FSYNC interrupt mode (0=active-high, 1=active-low) |
garfieldsg | 0:662207e34fba | 1738 | * @see getFSyncInterruptMode() |
garfieldsg | 0:662207e34fba | 1739 | * @see MPU6050_RA_INT_PIN_CFG |
garfieldsg | 0:662207e34fba | 1740 | * @see MPU6050_INTCFG_FSYNC_INT_LEVEL_BIT |
garfieldsg | 0:662207e34fba | 1741 | */ |
garfieldsg | 0:662207e34fba | 1742 | bool MPU6050::getFSyncInterruptLevel() |
garfieldsg | 0:662207e34fba | 1743 | { |
garfieldsg | 0:662207e34fba | 1744 | i2Cdev.readBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_FSYNC_INT_LEVEL_BIT, buffer); |
garfieldsg | 0:662207e34fba | 1745 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 1746 | } |
garfieldsg | 0:662207e34fba | 1747 | /** Set FSYNC interrupt logic level mode. |
garfieldsg | 0:662207e34fba | 1748 | * @param mode New FSYNC interrupt mode (0=active-high, 1=active-low) |
garfieldsg | 0:662207e34fba | 1749 | * @see getFSyncInterruptMode() |
garfieldsg | 0:662207e34fba | 1750 | * @see MPU6050_RA_INT_PIN_CFG |
garfieldsg | 0:662207e34fba | 1751 | * @see MPU6050_INTCFG_FSYNC_INT_LEVEL_BIT |
garfieldsg | 0:662207e34fba | 1752 | */ |
garfieldsg | 0:662207e34fba | 1753 | void MPU6050::setFSyncInterruptLevel(bool level) |
garfieldsg | 0:662207e34fba | 1754 | { |
garfieldsg | 0:662207e34fba | 1755 | i2Cdev.writeBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_FSYNC_INT_LEVEL_BIT, level); |
garfieldsg | 0:662207e34fba | 1756 | } |
garfieldsg | 0:662207e34fba | 1757 | /** Get FSYNC pin interrupt enabled setting. |
garfieldsg | 0:662207e34fba | 1758 | * Will be set 0 for disabled, 1 for enabled. |
garfieldsg | 0:662207e34fba | 1759 | * @return Current interrupt enabled setting |
garfieldsg | 0:662207e34fba | 1760 | * @see MPU6050_RA_INT_PIN_CFG |
garfieldsg | 0:662207e34fba | 1761 | * @see MPU6050_INTCFG_FSYNC_INT_EN_BIT |
garfieldsg | 0:662207e34fba | 1762 | */ |
garfieldsg | 0:662207e34fba | 1763 | bool MPU6050::getFSyncInterruptEnabled() |
garfieldsg | 0:662207e34fba | 1764 | { |
garfieldsg | 0:662207e34fba | 1765 | i2Cdev.readBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_FSYNC_INT_EN_BIT, buffer); |
garfieldsg | 0:662207e34fba | 1766 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 1767 | } |
garfieldsg | 0:662207e34fba | 1768 | /** Set FSYNC pin interrupt enabled setting. |
garfieldsg | 0:662207e34fba | 1769 | * @param enabled New FSYNC pin interrupt enabled setting |
garfieldsg | 0:662207e34fba | 1770 | * @see getFSyncInterruptEnabled() |
garfieldsg | 0:662207e34fba | 1771 | * @see MPU6050_RA_INT_PIN_CFG |
garfieldsg | 0:662207e34fba | 1772 | * @see MPU6050_INTCFG_FSYNC_INT_EN_BIT |
garfieldsg | 0:662207e34fba | 1773 | */ |
garfieldsg | 0:662207e34fba | 1774 | void MPU6050::setFSyncInterruptEnabled(bool enabled) |
garfieldsg | 0:662207e34fba | 1775 | { |
garfieldsg | 0:662207e34fba | 1776 | i2Cdev.writeBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_FSYNC_INT_EN_BIT, enabled); |
garfieldsg | 0:662207e34fba | 1777 | } |
garfieldsg | 0:662207e34fba | 1778 | /** Get I2C bypass enabled status. |
garfieldsg | 0:662207e34fba | 1779 | * When this bit is equal to 1 and I2C_MST_EN (Register 106 bit[5]) is equal to |
garfieldsg | 0:662207e34fba | 1780 | * 0, the host application processor will be able to directly access the |
garfieldsg | 0:662207e34fba | 1781 | * auxiliary I2C bus of the MPU-60X0. When this bit is equal to 0, the host |
garfieldsg | 0:662207e34fba | 1782 | * application processor will not be able to directly access the auxiliary I2C |
garfieldsg | 0:662207e34fba | 1783 | * bus of the MPU-60X0 regardless of the state of I2C_MST_EN (Register 106 |
garfieldsg | 0:662207e34fba | 1784 | * bit[5]). |
garfieldsg | 0:662207e34fba | 1785 | * @return Current I2C bypass enabled status |
garfieldsg | 0:662207e34fba | 1786 | * @see MPU6050_RA_INT_PIN_CFG |
garfieldsg | 0:662207e34fba | 1787 | * @see MPU6050_INTCFG_I2C_BYPASS_EN_BIT |
garfieldsg | 0:662207e34fba | 1788 | */ |
garfieldsg | 0:662207e34fba | 1789 | bool MPU6050::getI2CBypassEnabled() |
garfieldsg | 0:662207e34fba | 1790 | { |
garfieldsg | 0:662207e34fba | 1791 | i2Cdev.readBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_I2C_BYPASS_EN_BIT, buffer); |
garfieldsg | 0:662207e34fba | 1792 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 1793 | } |
garfieldsg | 0:662207e34fba | 1794 | /** Set I2C bypass enabled status. |
garfieldsg | 0:662207e34fba | 1795 | * When this bit is equal to 1 and I2C_MST_EN (Register 106 bit[5]) is equal to |
garfieldsg | 0:662207e34fba | 1796 | * 0, the host application processor will be able to directly access the |
garfieldsg | 0:662207e34fba | 1797 | * auxiliary I2C bus of the MPU-60X0. When this bit is equal to 0, the host |
garfieldsg | 0:662207e34fba | 1798 | * application processor will not be able to directly access the auxiliary I2C |
garfieldsg | 0:662207e34fba | 1799 | * bus of the MPU-60X0 regardless of the state of I2C_MST_EN (Register 106 |
garfieldsg | 0:662207e34fba | 1800 | * bit[5]). |
garfieldsg | 0:662207e34fba | 1801 | * @param enabled New I2C bypass enabled status |
garfieldsg | 0:662207e34fba | 1802 | * @see MPU6050_RA_INT_PIN_CFG |
garfieldsg | 0:662207e34fba | 1803 | * @see MPU6050_INTCFG_I2C_BYPASS_EN_BIT |
garfieldsg | 0:662207e34fba | 1804 | */ |
garfieldsg | 0:662207e34fba | 1805 | void MPU6050::setI2CBypassEnabled(bool enabled) |
garfieldsg | 0:662207e34fba | 1806 | { |
garfieldsg | 0:662207e34fba | 1807 | i2Cdev.writeBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_I2C_BYPASS_EN_BIT, enabled); |
garfieldsg | 0:662207e34fba | 1808 | } |
garfieldsg | 0:662207e34fba | 1809 | /** Get reference clock output enabled status. |
garfieldsg | 0:662207e34fba | 1810 | * When this bit is equal to 1, a reference clock output is provided at the |
garfieldsg | 0:662207e34fba | 1811 | * CLKOUT pin. When this bit is equal to 0, the clock output is disabled. For |
garfieldsg | 0:662207e34fba | 1812 | * further information regarding CLKOUT, please refer to the MPU-60X0 Product |
garfieldsg | 0:662207e34fba | 1813 | * Specification document. |
garfieldsg | 0:662207e34fba | 1814 | * @return Current reference clock output enabled status |
garfieldsg | 0:662207e34fba | 1815 | * @see MPU6050_RA_INT_PIN_CFG |
garfieldsg | 0:662207e34fba | 1816 | * @see MPU6050_INTCFG_CLKOUT_EN_BIT |
garfieldsg | 0:662207e34fba | 1817 | */ |
garfieldsg | 0:662207e34fba | 1818 | bool MPU6050::getClockOutputEnabled() |
garfieldsg | 0:662207e34fba | 1819 | { |
garfieldsg | 0:662207e34fba | 1820 | i2Cdev.readBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_CLKOUT_EN_BIT, buffer); |
garfieldsg | 0:662207e34fba | 1821 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 1822 | } |
garfieldsg | 0:662207e34fba | 1823 | /** Set reference clock output enabled status. |
garfieldsg | 0:662207e34fba | 1824 | * When this bit is equal to 1, a reference clock output is provided at the |
garfieldsg | 0:662207e34fba | 1825 | * CLKOUT pin. When this bit is equal to 0, the clock output is disabled. For |
garfieldsg | 0:662207e34fba | 1826 | * further information regarding CLKOUT, please refer to the MPU-60X0 Product |
garfieldsg | 0:662207e34fba | 1827 | * Specification document. |
garfieldsg | 0:662207e34fba | 1828 | * @param enabled New reference clock output enabled status |
garfieldsg | 0:662207e34fba | 1829 | * @see MPU6050_RA_INT_PIN_CFG |
garfieldsg | 0:662207e34fba | 1830 | * @see MPU6050_INTCFG_CLKOUT_EN_BIT |
garfieldsg | 0:662207e34fba | 1831 | */ |
garfieldsg | 0:662207e34fba | 1832 | void MPU6050::setClockOutputEnabled(bool enabled) |
garfieldsg | 0:662207e34fba | 1833 | { |
garfieldsg | 0:662207e34fba | 1834 | i2Cdev.writeBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_CLKOUT_EN_BIT, enabled); |
garfieldsg | 0:662207e34fba | 1835 | } |
garfieldsg | 0:662207e34fba | 1836 | |
garfieldsg | 0:662207e34fba | 1837 | // INT_ENABLE register |
garfieldsg | 0:662207e34fba | 1838 | |
garfieldsg | 0:662207e34fba | 1839 | /** Get full interrupt enabled status. |
garfieldsg | 0:662207e34fba | 1840 | * Full register byte for all interrupts, for quick reading. Each bit will be |
garfieldsg | 0:662207e34fba | 1841 | * set 0 for disabled, 1 for enabled. |
garfieldsg | 0:662207e34fba | 1842 | * @return Current interrupt enabled status |
garfieldsg | 0:662207e34fba | 1843 | * @see MPU6050_RA_INT_ENABLE |
garfieldsg | 0:662207e34fba | 1844 | * @see MPU6050_INTERRUPT_FF_BIT |
garfieldsg | 0:662207e34fba | 1845 | **/ |
garfieldsg | 0:662207e34fba | 1846 | uint8_t MPU6050::getIntEnabled() |
garfieldsg | 0:662207e34fba | 1847 | { |
garfieldsg | 0:662207e34fba | 1848 | i2Cdev.readByte(devAddr, MPU6050_RA_INT_ENABLE, buffer); |
garfieldsg | 0:662207e34fba | 1849 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 1850 | } |
garfieldsg | 0:662207e34fba | 1851 | /** Set full interrupt enabled status. |
garfieldsg | 0:662207e34fba | 1852 | * Full register byte for all interrupts, for quick reading. Each bit should be |
garfieldsg | 0:662207e34fba | 1853 | * set 0 for disabled, 1 for enabled. |
garfieldsg | 0:662207e34fba | 1854 | * @param enabled New interrupt enabled status |
garfieldsg | 0:662207e34fba | 1855 | * @see getIntFreefallEnabled() |
garfieldsg | 0:662207e34fba | 1856 | * @see MPU6050_RA_INT_ENABLE |
garfieldsg | 0:662207e34fba | 1857 | * @see MPU6050_INTERRUPT_FF_BIT |
garfieldsg | 0:662207e34fba | 1858 | **/ |
garfieldsg | 0:662207e34fba | 1859 | void MPU6050::setIntEnabled(uint8_t enabled) |
garfieldsg | 0:662207e34fba | 1860 | { |
garfieldsg | 0:662207e34fba | 1861 | i2Cdev.writeByte(devAddr, MPU6050_RA_INT_ENABLE, enabled); |
garfieldsg | 0:662207e34fba | 1862 | } |
garfieldsg | 0:662207e34fba | 1863 | /** Get Free Fall interrupt enabled status. |
garfieldsg | 0:662207e34fba | 1864 | * Will be set 0 for disabled, 1 for enabled. |
garfieldsg | 0:662207e34fba | 1865 | * @return Current interrupt enabled status |
garfieldsg | 0:662207e34fba | 1866 | * @see MPU6050_RA_INT_ENABLE |
garfieldsg | 0:662207e34fba | 1867 | * @see MPU6050_INTERRUPT_FF_BIT |
garfieldsg | 0:662207e34fba | 1868 | **/ |
garfieldsg | 0:662207e34fba | 1869 | bool MPU6050::getIntFreefallEnabled() |
garfieldsg | 0:662207e34fba | 1870 | { |
garfieldsg | 0:662207e34fba | 1871 | i2Cdev.readBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_FF_BIT, buffer); |
garfieldsg | 0:662207e34fba | 1872 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 1873 | } |
garfieldsg | 0:662207e34fba | 1874 | /** Set Free Fall interrupt enabled status. |
garfieldsg | 0:662207e34fba | 1875 | * @param enabled New interrupt enabled status |
garfieldsg | 0:662207e34fba | 1876 | * @see getIntFreefallEnabled() |
garfieldsg | 0:662207e34fba | 1877 | * @see MPU6050_RA_INT_ENABLE |
garfieldsg | 0:662207e34fba | 1878 | * @see MPU6050_INTERRUPT_FF_BIT |
garfieldsg | 0:662207e34fba | 1879 | **/ |
garfieldsg | 0:662207e34fba | 1880 | void MPU6050::setIntFreefallEnabled(bool enabled) |
garfieldsg | 0:662207e34fba | 1881 | { |
garfieldsg | 0:662207e34fba | 1882 | i2Cdev.writeBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_FF_BIT, enabled); |
garfieldsg | 0:662207e34fba | 1883 | } |
garfieldsg | 0:662207e34fba | 1884 | /** Get Motion Detection interrupt enabled status. |
garfieldsg | 0:662207e34fba | 1885 | * Will be set 0 for disabled, 1 for enabled. |
garfieldsg | 0:662207e34fba | 1886 | * @return Current interrupt enabled status |
garfieldsg | 0:662207e34fba | 1887 | * @see MPU6050_RA_INT_ENABLE |
garfieldsg | 0:662207e34fba | 1888 | * @see MPU6050_INTERRUPT_MOT_BIT |
garfieldsg | 0:662207e34fba | 1889 | **/ |
garfieldsg | 0:662207e34fba | 1890 | bool MPU6050::getIntMotionEnabled() |
garfieldsg | 0:662207e34fba | 1891 | { |
garfieldsg | 0:662207e34fba | 1892 | i2Cdev.readBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_MOT_BIT, buffer); |
garfieldsg | 0:662207e34fba | 1893 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 1894 | } |
garfieldsg | 0:662207e34fba | 1895 | /** Set Motion Detection interrupt enabled status. |
garfieldsg | 0:662207e34fba | 1896 | * @param enabled New interrupt enabled status |
garfieldsg | 0:662207e34fba | 1897 | * @see getIntMotionEnabled() |
garfieldsg | 0:662207e34fba | 1898 | * @see MPU6050_RA_INT_ENABLE |
garfieldsg | 0:662207e34fba | 1899 | * @see MPU6050_INTERRUPT_MOT_BIT |
garfieldsg | 0:662207e34fba | 1900 | **/ |
garfieldsg | 0:662207e34fba | 1901 | void MPU6050::setIntMotionEnabled(bool enabled) |
garfieldsg | 0:662207e34fba | 1902 | { |
garfieldsg | 0:662207e34fba | 1903 | i2Cdev.writeBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_MOT_BIT, enabled); |
garfieldsg | 0:662207e34fba | 1904 | } |
garfieldsg | 0:662207e34fba | 1905 | /** Get Zero Motion Detection interrupt enabled status. |
garfieldsg | 0:662207e34fba | 1906 | * Will be set 0 for disabled, 1 for enabled. |
garfieldsg | 0:662207e34fba | 1907 | * @return Current interrupt enabled status |
garfieldsg | 0:662207e34fba | 1908 | * @see MPU6050_RA_INT_ENABLE |
garfieldsg | 0:662207e34fba | 1909 | * @see MPU6050_INTERRUPT_ZMOT_BIT |
garfieldsg | 0:662207e34fba | 1910 | **/ |
garfieldsg | 0:662207e34fba | 1911 | bool MPU6050::getIntZeroMotionEnabled() |
garfieldsg | 0:662207e34fba | 1912 | { |
garfieldsg | 0:662207e34fba | 1913 | i2Cdev.readBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_ZMOT_BIT, buffer); |
garfieldsg | 0:662207e34fba | 1914 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 1915 | } |
garfieldsg | 0:662207e34fba | 1916 | /** Set Zero Motion Detection interrupt enabled status. |
garfieldsg | 0:662207e34fba | 1917 | * @param enabled New interrupt enabled status |
garfieldsg | 0:662207e34fba | 1918 | * @see getIntZeroMotionEnabled() |
garfieldsg | 0:662207e34fba | 1919 | * @see MPU6050_RA_INT_ENABLE |
garfieldsg | 0:662207e34fba | 1920 | * @see MPU6050_INTERRUPT_ZMOT_BIT |
garfieldsg | 0:662207e34fba | 1921 | **/ |
garfieldsg | 0:662207e34fba | 1922 | void MPU6050::setIntZeroMotionEnabled(bool enabled) |
garfieldsg | 0:662207e34fba | 1923 | { |
garfieldsg | 0:662207e34fba | 1924 | i2Cdev.writeBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_ZMOT_BIT, enabled); |
garfieldsg | 0:662207e34fba | 1925 | } |
garfieldsg | 0:662207e34fba | 1926 | /** Get FIFO Buffer Overflow interrupt enabled status. |
garfieldsg | 0:662207e34fba | 1927 | * Will be set 0 for disabled, 1 for enabled. |
garfieldsg | 0:662207e34fba | 1928 | * @return Current interrupt enabled status |
garfieldsg | 0:662207e34fba | 1929 | * @see MPU6050_RA_INT_ENABLE |
garfieldsg | 0:662207e34fba | 1930 | * @see MPU6050_INTERRUPT_FIFO_OFLOW_BIT |
garfieldsg | 0:662207e34fba | 1931 | **/ |
garfieldsg | 0:662207e34fba | 1932 | bool MPU6050::getIntFIFOBufferOverflowEnabled() |
garfieldsg | 0:662207e34fba | 1933 | { |
garfieldsg | 0:662207e34fba | 1934 | i2Cdev.readBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_FIFO_OFLOW_BIT, buffer); |
garfieldsg | 0:662207e34fba | 1935 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 1936 | } |
garfieldsg | 0:662207e34fba | 1937 | /** Set FIFO Buffer Overflow interrupt enabled status. |
garfieldsg | 0:662207e34fba | 1938 | * @param enabled New interrupt enabled status |
garfieldsg | 0:662207e34fba | 1939 | * @see getIntFIFOBufferOverflowEnabled() |
garfieldsg | 0:662207e34fba | 1940 | * @see MPU6050_RA_INT_ENABLE |
garfieldsg | 0:662207e34fba | 1941 | * @see MPU6050_INTERRUPT_FIFO_OFLOW_BIT |
garfieldsg | 0:662207e34fba | 1942 | **/ |
garfieldsg | 0:662207e34fba | 1943 | void MPU6050::setIntFIFOBufferOverflowEnabled(bool enabled) |
garfieldsg | 0:662207e34fba | 1944 | { |
garfieldsg | 0:662207e34fba | 1945 | i2Cdev.writeBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_FIFO_OFLOW_BIT, enabled); |
garfieldsg | 0:662207e34fba | 1946 | } |
garfieldsg | 0:662207e34fba | 1947 | /** Get I2C Master interrupt enabled status. |
garfieldsg | 0:662207e34fba | 1948 | * This enables any of the I2C Master interrupt sources to generate an |
garfieldsg | 0:662207e34fba | 1949 | * interrupt. Will be set 0 for disabled, 1 for enabled. |
garfieldsg | 0:662207e34fba | 1950 | * @return Current interrupt enabled status |
garfieldsg | 0:662207e34fba | 1951 | * @see MPU6050_RA_INT_ENABLE |
garfieldsg | 0:662207e34fba | 1952 | * @see MPU6050_INTERRUPT_I2C_MST_INT_BIT |
garfieldsg | 0:662207e34fba | 1953 | **/ |
garfieldsg | 0:662207e34fba | 1954 | bool MPU6050::getIntI2CMasterEnabled() |
garfieldsg | 0:662207e34fba | 1955 | { |
garfieldsg | 0:662207e34fba | 1956 | i2Cdev.readBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_I2C_MST_INT_BIT, buffer); |
garfieldsg | 0:662207e34fba | 1957 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 1958 | } |
garfieldsg | 0:662207e34fba | 1959 | /** Set I2C Master interrupt enabled status. |
garfieldsg | 0:662207e34fba | 1960 | * @param enabled New interrupt enabled status |
garfieldsg | 0:662207e34fba | 1961 | * @see getIntI2CMasterEnabled() |
garfieldsg | 0:662207e34fba | 1962 | * @see MPU6050_RA_INT_ENABLE |
garfieldsg | 0:662207e34fba | 1963 | * @see MPU6050_INTERRUPT_I2C_MST_INT_BIT |
garfieldsg | 0:662207e34fba | 1964 | **/ |
garfieldsg | 0:662207e34fba | 1965 | void MPU6050::setIntI2CMasterEnabled(bool enabled) |
garfieldsg | 0:662207e34fba | 1966 | { |
garfieldsg | 0:662207e34fba | 1967 | i2Cdev.writeBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_I2C_MST_INT_BIT, enabled); |
garfieldsg | 0:662207e34fba | 1968 | } |
garfieldsg | 0:662207e34fba | 1969 | /** Get Data Ready interrupt enabled setting. |
garfieldsg | 0:662207e34fba | 1970 | * This event occurs each time a write operation to all of the sensor registers |
garfieldsg | 0:662207e34fba | 1971 | * has been completed. Will be set 0 for disabled, 1 for enabled. |
garfieldsg | 0:662207e34fba | 1972 | * @return Current interrupt enabled status |
garfieldsg | 0:662207e34fba | 1973 | * @see MPU6050_RA_INT_ENABLE |
garfieldsg | 0:662207e34fba | 1974 | * @see MPU6050_INTERRUPT_DATA_RDY_BIT |
garfieldsg | 0:662207e34fba | 1975 | */ |
garfieldsg | 0:662207e34fba | 1976 | bool MPU6050::getIntDataReadyEnabled() |
garfieldsg | 0:662207e34fba | 1977 | { |
garfieldsg | 0:662207e34fba | 1978 | i2Cdev.readBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_DATA_RDY_BIT, buffer); |
garfieldsg | 0:662207e34fba | 1979 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 1980 | } |
garfieldsg | 0:662207e34fba | 1981 | /** Set Data Ready interrupt enabled status. |
garfieldsg | 0:662207e34fba | 1982 | * @param enabled New interrupt enabled status |
garfieldsg | 0:662207e34fba | 1983 | * @see getIntDataReadyEnabled() |
garfieldsg | 0:662207e34fba | 1984 | * @see MPU6050_RA_INT_CFG |
garfieldsg | 0:662207e34fba | 1985 | * @see MPU6050_INTERRUPT_DATA_RDY_BIT |
garfieldsg | 0:662207e34fba | 1986 | */ |
garfieldsg | 0:662207e34fba | 1987 | void MPU6050::setIntDataReadyEnabled(bool enabled) |
garfieldsg | 0:662207e34fba | 1988 | { |
garfieldsg | 0:662207e34fba | 1989 | i2Cdev.writeBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_DATA_RDY_BIT, enabled); |
garfieldsg | 0:662207e34fba | 1990 | } |
garfieldsg | 0:662207e34fba | 1991 | |
garfieldsg | 0:662207e34fba | 1992 | // INT_STATUS register |
garfieldsg | 0:662207e34fba | 1993 | |
garfieldsg | 0:662207e34fba | 1994 | /** Get full set of interrupt status bits. |
garfieldsg | 0:662207e34fba | 1995 | * These bits clear to 0 after the register has been read. Very useful |
garfieldsg | 0:662207e34fba | 1996 | * for getting multiple INT statuses, since each single bit read clears |
garfieldsg | 0:662207e34fba | 1997 | * all of them because it has to read the whole byte. |
garfieldsg | 0:662207e34fba | 1998 | * @return Current interrupt status |
garfieldsg | 0:662207e34fba | 1999 | * @see MPU6050_RA_INT_STATUS |
garfieldsg | 0:662207e34fba | 2000 | */ |
garfieldsg | 0:662207e34fba | 2001 | uint8_t MPU6050::getIntStatus() |
garfieldsg | 0:662207e34fba | 2002 | { |
garfieldsg | 0:662207e34fba | 2003 | i2Cdev.readByte(devAddr, MPU6050_RA_INT_STATUS, buffer); |
garfieldsg | 0:662207e34fba | 2004 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 2005 | } |
garfieldsg | 0:662207e34fba | 2006 | /** Get Free Fall interrupt status. |
garfieldsg | 0:662207e34fba | 2007 | * This bit automatically sets to 1 when a Free Fall interrupt has been |
garfieldsg | 0:662207e34fba | 2008 | * generated. The bit clears to 0 after the register has been read. |
garfieldsg | 0:662207e34fba | 2009 | * @return Current interrupt status |
garfieldsg | 0:662207e34fba | 2010 | * @see MPU6050_RA_INT_STATUS |
garfieldsg | 0:662207e34fba | 2011 | * @see MPU6050_INTERRUPT_FF_BIT |
garfieldsg | 0:662207e34fba | 2012 | */ |
garfieldsg | 0:662207e34fba | 2013 | bool MPU6050::getIntFreefallStatus() |
garfieldsg | 0:662207e34fba | 2014 | { |
garfieldsg | 0:662207e34fba | 2015 | i2Cdev.readBit(devAddr, MPU6050_RA_INT_STATUS, MPU6050_INTERRUPT_FF_BIT, buffer); |
garfieldsg | 0:662207e34fba | 2016 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 2017 | } |
garfieldsg | 0:662207e34fba | 2018 | /** Get Motion Detection interrupt status. |
garfieldsg | 0:662207e34fba | 2019 | * This bit automatically sets to 1 when a Motion Detection interrupt has been |
garfieldsg | 0:662207e34fba | 2020 | * generated. The bit clears to 0 after the register has been read. |
garfieldsg | 0:662207e34fba | 2021 | * @return Current interrupt status |
garfieldsg | 0:662207e34fba | 2022 | * @see MPU6050_RA_INT_STATUS |
garfieldsg | 0:662207e34fba | 2023 | * @see MPU6050_INTERRUPT_MOT_BIT |
garfieldsg | 0:662207e34fba | 2024 | */ |
garfieldsg | 0:662207e34fba | 2025 | bool MPU6050::getIntMotionStatus() |
garfieldsg | 0:662207e34fba | 2026 | { |
garfieldsg | 0:662207e34fba | 2027 | i2Cdev.readBit(devAddr, MPU6050_RA_INT_STATUS, MPU6050_INTERRUPT_MOT_BIT, buffer); |
garfieldsg | 0:662207e34fba | 2028 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 2029 | } |
garfieldsg | 0:662207e34fba | 2030 | /** Get Zero Motion Detection interrupt status. |
garfieldsg | 0:662207e34fba | 2031 | * This bit automatically sets to 1 when a Zero Motion Detection interrupt has |
garfieldsg | 0:662207e34fba | 2032 | * been generated. The bit clears to 0 after the register has been read. |
garfieldsg | 0:662207e34fba | 2033 | * @return Current interrupt status |
garfieldsg | 0:662207e34fba | 2034 | * @see MPU6050_RA_INT_STATUS |
garfieldsg | 0:662207e34fba | 2035 | * @see MPU6050_INTERRUPT_ZMOT_BIT |
garfieldsg | 0:662207e34fba | 2036 | */ |
garfieldsg | 0:662207e34fba | 2037 | bool MPU6050::getIntZeroMotionStatus() |
garfieldsg | 0:662207e34fba | 2038 | { |
garfieldsg | 0:662207e34fba | 2039 | i2Cdev.readBit(devAddr, MPU6050_RA_INT_STATUS, MPU6050_INTERRUPT_ZMOT_BIT, buffer); |
garfieldsg | 0:662207e34fba | 2040 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 2041 | } |
garfieldsg | 0:662207e34fba | 2042 | /** Get FIFO Buffer Overflow interrupt status. |
garfieldsg | 0:662207e34fba | 2043 | * This bit automatically sets to 1 when a Free Fall interrupt has been |
garfieldsg | 0:662207e34fba | 2044 | * generated. The bit clears to 0 after the register has been read. |
garfieldsg | 0:662207e34fba | 2045 | * @return Current interrupt status |
garfieldsg | 0:662207e34fba | 2046 | * @see MPU6050_RA_INT_STATUS |
garfieldsg | 0:662207e34fba | 2047 | * @see MPU6050_INTERRUPT_FIFO_OFLOW_BIT |
garfieldsg | 0:662207e34fba | 2048 | */ |
garfieldsg | 0:662207e34fba | 2049 | bool MPU6050::getIntFIFOBufferOverflowStatus() |
garfieldsg | 0:662207e34fba | 2050 | { |
garfieldsg | 0:662207e34fba | 2051 | i2Cdev.readBit(devAddr, MPU6050_RA_INT_STATUS, MPU6050_INTERRUPT_FIFO_OFLOW_BIT, buffer); |
garfieldsg | 0:662207e34fba | 2052 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 2053 | } |
garfieldsg | 0:662207e34fba | 2054 | /** Get I2C Master interrupt status. |
garfieldsg | 0:662207e34fba | 2055 | * This bit automatically sets to 1 when an I2C Master interrupt has been |
garfieldsg | 0:662207e34fba | 2056 | * generated. For a list of I2C Master interrupts, please refer to Register 54. |
garfieldsg | 0:662207e34fba | 2057 | * The bit clears to 0 after the register has been read. |
garfieldsg | 0:662207e34fba | 2058 | * @return Current interrupt status |
garfieldsg | 0:662207e34fba | 2059 | * @see MPU6050_RA_INT_STATUS |
garfieldsg | 0:662207e34fba | 2060 | * @see MPU6050_INTERRUPT_I2C_MST_INT_BIT |
garfieldsg | 0:662207e34fba | 2061 | */ |
garfieldsg | 0:662207e34fba | 2062 | bool MPU6050::getIntI2CMasterStatus() |
garfieldsg | 0:662207e34fba | 2063 | { |
garfieldsg | 0:662207e34fba | 2064 | i2Cdev.readBit(devAddr, MPU6050_RA_INT_STATUS, MPU6050_INTERRUPT_I2C_MST_INT_BIT, buffer); |
garfieldsg | 0:662207e34fba | 2065 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 2066 | } |
garfieldsg | 0:662207e34fba | 2067 | /** Get Data Ready interrupt status. |
garfieldsg | 0:662207e34fba | 2068 | * This bit automatically sets to 1 when a Data Ready interrupt has been |
garfieldsg | 0:662207e34fba | 2069 | * generated. The bit clears to 0 after the register has been read. |
garfieldsg | 0:662207e34fba | 2070 | * @return Current interrupt status |
garfieldsg | 0:662207e34fba | 2071 | * @see MPU6050_RA_INT_STATUS |
garfieldsg | 0:662207e34fba | 2072 | * @see MPU6050_INTERRUPT_DATA_RDY_BIT |
garfieldsg | 0:662207e34fba | 2073 | */ |
garfieldsg | 0:662207e34fba | 2074 | bool MPU6050::getIntDataReadyStatus() |
garfieldsg | 0:662207e34fba | 2075 | { |
garfieldsg | 0:662207e34fba | 2076 | i2Cdev.readBit(devAddr, MPU6050_RA_INT_STATUS, MPU6050_INTERRUPT_DATA_RDY_BIT, buffer); |
garfieldsg | 0:662207e34fba | 2077 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 2078 | } |
garfieldsg | 0:662207e34fba | 2079 | |
garfieldsg | 0:662207e34fba | 2080 | // ACCEL_*OUT_* registers |
garfieldsg | 0:662207e34fba | 2081 | |
garfieldsg | 0:662207e34fba | 2082 | /** Get raw 9-axis motion sensor readings (accel/gyro/compass). |
garfieldsg | 0:662207e34fba | 2083 | * FUNCTION NOT FULLY IMPLEMENTED YET. |
garfieldsg | 0:662207e34fba | 2084 | * @param ax 16-bit signed integer container for accelerometer X-axis value |
garfieldsg | 0:662207e34fba | 2085 | * @param ay 16-bit signed integer container for accelerometer Y-axis value |
garfieldsg | 0:662207e34fba | 2086 | * @param az 16-bit signed integer container for accelerometer Z-axis value |
garfieldsg | 0:662207e34fba | 2087 | * @param gx 16-bit signed integer container for gyroscope X-axis value |
garfieldsg | 0:662207e34fba | 2088 | * @param gy 16-bit signed integer container for gyroscope Y-axis value |
garfieldsg | 0:662207e34fba | 2089 | * @param gz 16-bit signed integer container for gyroscope Z-axis value |
garfieldsg | 0:662207e34fba | 2090 | * @param mx 16-bit signed integer container for magnetometer X-axis value |
garfieldsg | 0:662207e34fba | 2091 | * @param my 16-bit signed integer container for magnetometer Y-axis value |
garfieldsg | 0:662207e34fba | 2092 | * @param mz 16-bit signed integer container for magnetometer Z-axis value |
garfieldsg | 0:662207e34fba | 2093 | * @see getMotion6() |
garfieldsg | 0:662207e34fba | 2094 | * @see getAcceleration() |
garfieldsg | 0:662207e34fba | 2095 | * @see getRotation() |
garfieldsg | 0:662207e34fba | 2096 | * @see MPU6050_RA_ACCEL_XOUT_H |
garfieldsg | 0:662207e34fba | 2097 | */ |
garfieldsg | 0:662207e34fba | 2098 | void MPU6050::getMotion9(int16_t* ax, int16_t* ay, int16_t* az, int16_t* gx, int16_t* gy, int16_t* gz, int16_t* mx, int16_t* my, int16_t* mz) |
garfieldsg | 0:662207e34fba | 2099 | { |
garfieldsg | 0:662207e34fba | 2100 | getMotion6(ax, ay, az, gx, gy, gz); |
garfieldsg | 0:662207e34fba | 2101 | // TODO: magnetometer integration |
garfieldsg | 0:662207e34fba | 2102 | } |
garfieldsg | 0:662207e34fba | 2103 | /** Get raw 6-axis motion sensor readings (accel/gyro). |
garfieldsg | 0:662207e34fba | 2104 | * Retrieves all currently available motion sensor values. |
garfieldsg | 0:662207e34fba | 2105 | * @param ax 16-bit signed integer container for accelerometer X-axis value |
garfieldsg | 0:662207e34fba | 2106 | * @param ay 16-bit signed integer container for accelerometer Y-axis value |
garfieldsg | 0:662207e34fba | 2107 | * @param az 16-bit signed integer container for accelerometer Z-axis value |
garfieldsg | 0:662207e34fba | 2108 | * @param gx 16-bit signed integer container for gyroscope X-axis value |
garfieldsg | 0:662207e34fba | 2109 | * @param gy 16-bit signed integer container for gyroscope Y-axis value |
garfieldsg | 0:662207e34fba | 2110 | * @param gz 16-bit signed integer container for gyroscope Z-axis value |
garfieldsg | 0:662207e34fba | 2111 | * @see getAcceleration() |
garfieldsg | 0:662207e34fba | 2112 | * @see getRotation() |
garfieldsg | 0:662207e34fba | 2113 | * @see MPU6050_RA_ACCEL_XOUT_H |
garfieldsg | 0:662207e34fba | 2114 | */ |
garfieldsg | 0:662207e34fba | 2115 | void MPU6050::getMotion6(int16_t* ax, int16_t* ay, int16_t* az, int16_t* gx, int16_t* gy, int16_t* gz) |
garfieldsg | 0:662207e34fba | 2116 | { |
garfieldsg | 0:662207e34fba | 2117 | i2Cdev.readBytes(devAddr, MPU6050_RA_ACCEL_XOUT_H, 14, buffer); |
garfieldsg | 0:662207e34fba | 2118 | *ax = (((int16_t)buffer[0]) << 8) | buffer[1]; |
garfieldsg | 0:662207e34fba | 2119 | *ay = (((int16_t)buffer[2]) << 8) | buffer[3]; |
garfieldsg | 0:662207e34fba | 2120 | *az = (((int16_t)buffer[4]) << 8) | buffer[5]; |
garfieldsg | 0:662207e34fba | 2121 | *gx = (((int16_t)buffer[8]) << 8) | buffer[9]; |
garfieldsg | 0:662207e34fba | 2122 | *gy = (((int16_t)buffer[10]) << 8) | buffer[11]; |
garfieldsg | 0:662207e34fba | 2123 | *gz = (((int16_t)buffer[12]) << 8) | buffer[13]; |
garfieldsg | 0:662207e34fba | 2124 | } |
garfieldsg | 0:662207e34fba | 2125 | /** Get 3-axis accelerometer readings. |
garfieldsg | 0:662207e34fba | 2126 | * These registers store the most recent accelerometer measurements. |
garfieldsg | 0:662207e34fba | 2127 | * Accelerometer measurements are written to these registers at the Sample Rate |
garfieldsg | 0:662207e34fba | 2128 | * as defined in Register 25. |
garfieldsg | 0:662207e34fba | 2129 | * |
garfieldsg | 0:662207e34fba | 2130 | * The accelerometer measurement registers, along with the temperature |
garfieldsg | 0:662207e34fba | 2131 | * measurement registers, gyroscope measurement registers, and external sensor |
garfieldsg | 0:662207e34fba | 2132 | * data registers, are composed of two sets of registers: an internal register |
garfieldsg | 0:662207e34fba | 2133 | * set and a user-facing read register set. |
garfieldsg | 0:662207e34fba | 2134 | * |
garfieldsg | 0:662207e34fba | 2135 | * The data within the accelerometer sensors' internal register set is always |
garfieldsg | 0:662207e34fba | 2136 | * updated at the Sample Rate. Meanwhile, the user-facing read register set |
garfieldsg | 0:662207e34fba | 2137 | * duplicates the internal register set's data values whenever the serial |
garfieldsg | 0:662207e34fba | 2138 | * interface is idle. This guarantees that a burst read of sensor registers will |
garfieldsg | 0:662207e34fba | 2139 | * read measurements from the same sampling instant. Note that if burst reads |
garfieldsg | 0:662207e34fba | 2140 | * are not used, the user is responsible for ensuring a set of single byte reads |
garfieldsg | 0:662207e34fba | 2141 | * correspond to a single sampling instant by checking the Data Ready interrupt. |
garfieldsg | 0:662207e34fba | 2142 | * |
garfieldsg | 0:662207e34fba | 2143 | * Each 16-bit accelerometer measurement has a full scale defined in ACCEL_FS |
garfieldsg | 0:662207e34fba | 2144 | * (Register 28). For each full scale setting, the accelerometers' sensitivity |
garfieldsg | 0:662207e34fba | 2145 | * per LSB in ACCEL_xOUT is shown in the table below: |
garfieldsg | 0:662207e34fba | 2146 | * |
garfieldsg | 0:662207e34fba | 2147 | * <pre> |
garfieldsg | 0:662207e34fba | 2148 | * AFS_SEL | Full Scale Range | LSB Sensitivity |
garfieldsg | 0:662207e34fba | 2149 | * --------+------------------+---------------- |
garfieldsg | 0:662207e34fba | 2150 | * 0 | +/- 2g | 8192 LSB/mg |
garfieldsg | 0:662207e34fba | 2151 | * 1 | +/- 4g | 4096 LSB/mg |
garfieldsg | 0:662207e34fba | 2152 | * 2 | +/- 8g | 2048 LSB/mg |
garfieldsg | 0:662207e34fba | 2153 | * 3 | +/- 16g | 1024 LSB/mg |
garfieldsg | 0:662207e34fba | 2154 | * </pre> |
garfieldsg | 0:662207e34fba | 2155 | * |
garfieldsg | 0:662207e34fba | 2156 | * @param x 16-bit signed integer container for X-axis acceleration |
garfieldsg | 0:662207e34fba | 2157 | * @param y 16-bit signed integer container for Y-axis acceleration |
garfieldsg | 0:662207e34fba | 2158 | * @param z 16-bit signed integer container for Z-axis acceleration |
garfieldsg | 0:662207e34fba | 2159 | * @see MPU6050_RA_GYRO_XOUT_H |
garfieldsg | 0:662207e34fba | 2160 | */ |
garfieldsg | 0:662207e34fba | 2161 | void MPU6050::getAcceleration(int16_t* x, int16_t* y, int16_t* z) |
garfieldsg | 0:662207e34fba | 2162 | { |
garfieldsg | 0:662207e34fba | 2163 | i2Cdev.readBytes(devAddr, MPU6050_RA_ACCEL_XOUT_H, 6, buffer); |
garfieldsg | 0:662207e34fba | 2164 | *x = (((int16_t)buffer[0]) << 8) | buffer[1]; |
garfieldsg | 0:662207e34fba | 2165 | *y = (((int16_t)buffer[2]) << 8) | buffer[3]; |
garfieldsg | 0:662207e34fba | 2166 | *z = (((int16_t)buffer[4]) << 8) | buffer[5]; |
garfieldsg | 0:662207e34fba | 2167 | } |
garfieldsg | 0:662207e34fba | 2168 | /** Get X-axis accelerometer reading. |
garfieldsg | 0:662207e34fba | 2169 | * @return X-axis acceleration measurement in 16-bit 2's complement format |
garfieldsg | 0:662207e34fba | 2170 | * @see getMotion6() |
garfieldsg | 0:662207e34fba | 2171 | * @see MPU6050_RA_ACCEL_XOUT_H |
garfieldsg | 0:662207e34fba | 2172 | */ |
garfieldsg | 0:662207e34fba | 2173 | int16_t MPU6050::getAccelerationX() |
garfieldsg | 0:662207e34fba | 2174 | { |
garfieldsg | 0:662207e34fba | 2175 | i2Cdev.readBytes(devAddr, MPU6050_RA_ACCEL_XOUT_H, 2, buffer); |
garfieldsg | 0:662207e34fba | 2176 | return (((int16_t)buffer[0]) << 8) | buffer[1]; |
garfieldsg | 0:662207e34fba | 2177 | } |
garfieldsg | 0:662207e34fba | 2178 | /** Get Y-axis accelerometer reading. |
garfieldsg | 0:662207e34fba | 2179 | * @return Y-axis acceleration measurement in 16-bit 2's complement format |
garfieldsg | 0:662207e34fba | 2180 | * @see getMotion6() |
garfieldsg | 0:662207e34fba | 2181 | * @see MPU6050_RA_ACCEL_YOUT_H |
garfieldsg | 0:662207e34fba | 2182 | */ |
garfieldsg | 0:662207e34fba | 2183 | int16_t MPU6050::getAccelerationY() |
garfieldsg | 0:662207e34fba | 2184 | { |
garfieldsg | 0:662207e34fba | 2185 | i2Cdev.readBytes(devAddr, MPU6050_RA_ACCEL_YOUT_H, 2, buffer); |
garfieldsg | 0:662207e34fba | 2186 | return (((int16_t)buffer[0]) << 8) | buffer[1]; |
garfieldsg | 0:662207e34fba | 2187 | } |
garfieldsg | 0:662207e34fba | 2188 | /** Get Z-axis accelerometer reading. |
garfieldsg | 0:662207e34fba | 2189 | * @return Z-axis acceleration measurement in 16-bit 2's complement format |
garfieldsg | 0:662207e34fba | 2190 | * @see getMotion6() |
garfieldsg | 0:662207e34fba | 2191 | * @see MPU6050_RA_ACCEL_ZOUT_H |
garfieldsg | 0:662207e34fba | 2192 | */ |
garfieldsg | 0:662207e34fba | 2193 | int16_t MPU6050::getAccelerationZ() |
garfieldsg | 0:662207e34fba | 2194 | { |
garfieldsg | 0:662207e34fba | 2195 | i2Cdev.readBytes(devAddr, MPU6050_RA_ACCEL_ZOUT_H, 2, buffer); |
garfieldsg | 0:662207e34fba | 2196 | return (((int16_t)buffer[0]) << 8) | buffer[1]; |
garfieldsg | 0:662207e34fba | 2197 | } |
garfieldsg | 0:662207e34fba | 2198 | |
garfieldsg | 0:662207e34fba | 2199 | // TEMP_OUT_* registers |
garfieldsg | 0:662207e34fba | 2200 | |
garfieldsg | 0:662207e34fba | 2201 | /** Get current internal temperature. |
garfieldsg | 0:662207e34fba | 2202 | * @return Temperature reading in 16-bit 2's complement format |
garfieldsg | 0:662207e34fba | 2203 | * @see MPU6050_RA_TEMP_OUT_H |
garfieldsg | 0:662207e34fba | 2204 | */ |
garfieldsg | 0:662207e34fba | 2205 | int16_t MPU6050::getTemperature() |
garfieldsg | 0:662207e34fba | 2206 | { |
garfieldsg | 0:662207e34fba | 2207 | i2Cdev.readBytes(devAddr, MPU6050_RA_TEMP_OUT_H, 2, buffer); |
garfieldsg | 0:662207e34fba | 2208 | return (((int16_t)buffer[0]) << 8) | buffer[1]; |
garfieldsg | 0:662207e34fba | 2209 | } |
garfieldsg | 0:662207e34fba | 2210 | |
garfieldsg | 0:662207e34fba | 2211 | // GYRO_*OUT_* registers |
garfieldsg | 0:662207e34fba | 2212 | |
garfieldsg | 0:662207e34fba | 2213 | /** Get 3-axis gyroscope readings. |
garfieldsg | 0:662207e34fba | 2214 | * These gyroscope measurement registers, along with the accelerometer |
garfieldsg | 0:662207e34fba | 2215 | * measurement registers, temperature measurement registers, and external sensor |
garfieldsg | 0:662207e34fba | 2216 | * data registers, are composed of two sets of registers: an internal register |
garfieldsg | 0:662207e34fba | 2217 | * set and a user-facing read register set. |
garfieldsg | 0:662207e34fba | 2218 | * The data within the gyroscope sensors' internal register set is always |
garfieldsg | 0:662207e34fba | 2219 | * updated at the Sample Rate. Meanwhile, the user-facing read register set |
garfieldsg | 0:662207e34fba | 2220 | * duplicates the internal register set's data values whenever the serial |
garfieldsg | 0:662207e34fba | 2221 | * interface is idle. This guarantees that a burst read of sensor registers will |
garfieldsg | 0:662207e34fba | 2222 | * read measurements from the same sampling instant. Note that if burst reads |
garfieldsg | 0:662207e34fba | 2223 | * are not used, the user is responsible for ensuring a set of single byte reads |
garfieldsg | 0:662207e34fba | 2224 | * correspond to a single sampling instant by checking the Data Ready interrupt. |
garfieldsg | 0:662207e34fba | 2225 | * |
garfieldsg | 0:662207e34fba | 2226 | * Each 16-bit gyroscope measurement has a full scale defined in FS_SEL |
garfieldsg | 0:662207e34fba | 2227 | * (Register 27). For each full scale setting, the gyroscopes' sensitivity per |
garfieldsg | 0:662207e34fba | 2228 | * LSB in GYRO_xOUT is shown in the table below: |
garfieldsg | 0:662207e34fba | 2229 | * |
garfieldsg | 0:662207e34fba | 2230 | * <pre> |
garfieldsg | 0:662207e34fba | 2231 | * FS_SEL | Full Scale Range | LSB Sensitivity |
garfieldsg | 0:662207e34fba | 2232 | * -------+--------------------+---------------- |
garfieldsg | 0:662207e34fba | 2233 | * 0 | +/- 250 degrees/s | 131 LSB/deg/s |
garfieldsg | 0:662207e34fba | 2234 | * 1 | +/- 500 degrees/s | 65.5 LSB/deg/s |
garfieldsg | 0:662207e34fba | 2235 | * 2 | +/- 1000 degrees/s | 32.8 LSB/deg/s |
garfieldsg | 0:662207e34fba | 2236 | * 3 | +/- 2000 degrees/s | 16.4 LSB/deg/s |
garfieldsg | 0:662207e34fba | 2237 | * </pre> |
garfieldsg | 0:662207e34fba | 2238 | * |
garfieldsg | 0:662207e34fba | 2239 | * @param x 16-bit signed integer container for X-axis rotation |
garfieldsg | 0:662207e34fba | 2240 | * @param y 16-bit signed integer container for Y-axis rotation |
garfieldsg | 0:662207e34fba | 2241 | * @param z 16-bit signed integer container for Z-axis rotation |
garfieldsg | 0:662207e34fba | 2242 | * @see getMotion6() |
garfieldsg | 0:662207e34fba | 2243 | * @see MPU6050_RA_GYRO_XOUT_H |
garfieldsg | 0:662207e34fba | 2244 | */ |
garfieldsg | 0:662207e34fba | 2245 | void MPU6050::getRotation(int16_t* x, int16_t* y, int16_t* z) |
garfieldsg | 0:662207e34fba | 2246 | { |
garfieldsg | 0:662207e34fba | 2247 | i2Cdev.readBytes(devAddr, MPU6050_RA_GYRO_XOUT_H, 6, buffer); |
garfieldsg | 0:662207e34fba | 2248 | *x = (((int16_t)buffer[0]) << 8) | buffer[1]; |
garfieldsg | 0:662207e34fba | 2249 | *y = (((int16_t)buffer[2]) << 8) | buffer[3]; |
garfieldsg | 0:662207e34fba | 2250 | *z = (((int16_t)buffer[4]) << 8) | buffer[5]; |
garfieldsg | 0:662207e34fba | 2251 | } |
garfieldsg | 0:662207e34fba | 2252 | /** Get X-axis gyroscope reading. |
garfieldsg | 0:662207e34fba | 2253 | * @return X-axis rotation measurement in 16-bit 2's complement format |
garfieldsg | 0:662207e34fba | 2254 | * @see getMotion6() |
garfieldsg | 0:662207e34fba | 2255 | * @see MPU6050_RA_GYRO_XOUT_H |
garfieldsg | 0:662207e34fba | 2256 | */ |
garfieldsg | 0:662207e34fba | 2257 | int16_t MPU6050::getRotationX() |
garfieldsg | 0:662207e34fba | 2258 | { |
garfieldsg | 0:662207e34fba | 2259 | i2Cdev.readBytes(devAddr, MPU6050_RA_GYRO_XOUT_H, 2, buffer); |
garfieldsg | 0:662207e34fba | 2260 | return (((int16_t)buffer[0]) << 8) | buffer[1]; |
garfieldsg | 0:662207e34fba | 2261 | } |
garfieldsg | 0:662207e34fba | 2262 | /** Get Y-axis gyroscope reading. |
garfieldsg | 0:662207e34fba | 2263 | * @return Y-axis rotation measurement in 16-bit 2's complement format |
garfieldsg | 0:662207e34fba | 2264 | * @see getMotion6() |
garfieldsg | 0:662207e34fba | 2265 | * @see MPU6050_RA_GYRO_YOUT_H |
garfieldsg | 0:662207e34fba | 2266 | */ |
garfieldsg | 0:662207e34fba | 2267 | int16_t MPU6050::getRotationY() |
garfieldsg | 0:662207e34fba | 2268 | { |
garfieldsg | 0:662207e34fba | 2269 | i2Cdev.readBytes(devAddr, MPU6050_RA_GYRO_YOUT_H, 2, buffer); |
garfieldsg | 0:662207e34fba | 2270 | return (((int16_t)buffer[0]) << 8) | buffer[1]; |
garfieldsg | 0:662207e34fba | 2271 | } |
garfieldsg | 0:662207e34fba | 2272 | /** Get Z-axis gyroscope reading. |
garfieldsg | 0:662207e34fba | 2273 | * @return Z-axis rotation measurement in 16-bit 2's complement format |
garfieldsg | 0:662207e34fba | 2274 | * @see getMotion6() |
garfieldsg | 0:662207e34fba | 2275 | * @see MPU6050_RA_GYRO_ZOUT_H |
garfieldsg | 0:662207e34fba | 2276 | */ |
garfieldsg | 0:662207e34fba | 2277 | int16_t MPU6050::getRotationZ() |
garfieldsg | 0:662207e34fba | 2278 | { |
garfieldsg | 0:662207e34fba | 2279 | i2Cdev.readBytes(devAddr, MPU6050_RA_GYRO_ZOUT_H, 2, buffer); |
garfieldsg | 0:662207e34fba | 2280 | return (((int16_t)buffer[0]) << 8) | buffer[1]; |
garfieldsg | 0:662207e34fba | 2281 | } |
garfieldsg | 0:662207e34fba | 2282 | |
garfieldsg | 0:662207e34fba | 2283 | // EXT_SENS_DATA_* registers |
garfieldsg | 0:662207e34fba | 2284 | |
garfieldsg | 0:662207e34fba | 2285 | /** Read single byte from external sensor data register. |
garfieldsg | 0:662207e34fba | 2286 | * These registers store data read from external sensors by the Slave 0, 1, 2, |
garfieldsg | 0:662207e34fba | 2287 | * and 3 on the auxiliary I2C interface. Data read by Slave 4 is stored in |
garfieldsg | 0:662207e34fba | 2288 | * I2C_SLV4_DI (Register 53). |
garfieldsg | 0:662207e34fba | 2289 | * |
garfieldsg | 0:662207e34fba | 2290 | * External sensor data is written to these registers at the Sample Rate as |
garfieldsg | 0:662207e34fba | 2291 | * defined in Register 25. This access rate can be reduced by using the Slave |
garfieldsg | 0:662207e34fba | 2292 | * Delay Enable registers (Register 103). |
garfieldsg | 0:662207e34fba | 2293 | * |
garfieldsg | 0:662207e34fba | 2294 | * External sensor data registers, along with the gyroscope measurement |
garfieldsg | 0:662207e34fba | 2295 | * registers, accelerometer measurement registers, and temperature measurement |
garfieldsg | 0:662207e34fba | 2296 | * registers, are composed of two sets of registers: an internal register set |
garfieldsg | 0:662207e34fba | 2297 | * and a user-facing read register set. |
garfieldsg | 0:662207e34fba | 2298 | * |
garfieldsg | 0:662207e34fba | 2299 | * The data within the external sensors' internal register set is always updated |
garfieldsg | 0:662207e34fba | 2300 | * at the Sample Rate (or the reduced access rate) whenever the serial interface |
garfieldsg | 0:662207e34fba | 2301 | * is idle. This guarantees that a burst read of sensor registers will read |
garfieldsg | 0:662207e34fba | 2302 | * measurements from the same sampling instant. Note that if burst reads are not |
garfieldsg | 0:662207e34fba | 2303 | * used, the user is responsible for ensuring a set of single byte reads |
garfieldsg | 0:662207e34fba | 2304 | * correspond to a single sampling instant by checking the Data Ready interrupt. |
garfieldsg | 0:662207e34fba | 2305 | * |
garfieldsg | 0:662207e34fba | 2306 | * Data is placed in these external sensor data registers according to |
garfieldsg | 0:662207e34fba | 2307 | * I2C_SLV0_CTRL, I2C_SLV1_CTRL, I2C_SLV2_CTRL, and I2C_SLV3_CTRL (Registers 39, |
garfieldsg | 0:662207e34fba | 2308 | * 42, 45, and 48). When more than zero bytes are read (I2C_SLVx_LEN > 0) from |
garfieldsg | 0:662207e34fba | 2309 | * an enabled slave (I2C_SLVx_EN = 1), the slave is read at the Sample Rate (as |
garfieldsg | 0:662207e34fba | 2310 | * defined in Register 25) or delayed rate (if specified in Register 52 and |
garfieldsg | 0:662207e34fba | 2311 | * 103). During each Sample cycle, slave reads are performed in order of Slave |
garfieldsg | 0:662207e34fba | 2312 | * number. If all slaves are enabled with more than zero bytes to be read, the |
garfieldsg | 0:662207e34fba | 2313 | * order will be Slave 0, followed by Slave 1, Slave 2, and Slave 3. |
garfieldsg | 0:662207e34fba | 2314 | * |
garfieldsg | 0:662207e34fba | 2315 | * Each enabled slave will have EXT_SENS_DATA registers associated with it by |
garfieldsg | 0:662207e34fba | 2316 | * number of bytes read (I2C_SLVx_LEN) in order of slave number, starting from |
garfieldsg | 0:662207e34fba | 2317 | * EXT_SENS_DATA_00. Note that this means enabling or disabling a slave may |
garfieldsg | 0:662207e34fba | 2318 | * change the higher numbered slaves' associated registers. Furthermore, if |
garfieldsg | 0:662207e34fba | 2319 | * fewer total bytes are being read from the external sensors as a result of |
garfieldsg | 0:662207e34fba | 2320 | * such a change, then the data remaining in the registers which no longer have |
garfieldsg | 0:662207e34fba | 2321 | * an associated slave device (i.e. high numbered registers) will remain in |
garfieldsg | 0:662207e34fba | 2322 | * these previously allocated registers unless reset. |
garfieldsg | 0:662207e34fba | 2323 | * |
garfieldsg | 0:662207e34fba | 2324 | * If the sum of the read lengths of all SLVx transactions exceed the number of |
garfieldsg | 0:662207e34fba | 2325 | * available EXT_SENS_DATA registers, the excess bytes will be dropped. There |
garfieldsg | 0:662207e34fba | 2326 | * are 24 EXT_SENS_DATA registers and hence the total read lengths between all |
garfieldsg | 0:662207e34fba | 2327 | * the slaves cannot be greater than 24 or some bytes will be lost. |
garfieldsg | 0:662207e34fba | 2328 | * |
garfieldsg | 0:662207e34fba | 2329 | * Note: Slave 4's behavior is distinct from that of Slaves 0-3. For further |
garfieldsg | 0:662207e34fba | 2330 | * information regarding the characteristics of Slave 4, please refer to |
garfieldsg | 0:662207e34fba | 2331 | * Registers 49 to 53. |
garfieldsg | 0:662207e34fba | 2332 | * |
garfieldsg | 0:662207e34fba | 2333 | * EXAMPLE: |
garfieldsg | 0:662207e34fba | 2334 | * Suppose that Slave 0 is enabled with 4 bytes to be read (I2C_SLV0_EN = 1 and |
garfieldsg | 0:662207e34fba | 2335 | * I2C_SLV0_LEN = 4) while Slave 1 is enabled with 2 bytes to be read so that |
garfieldsg | 0:662207e34fba | 2336 | * I2C_SLV1_EN = 1 and I2C_SLV1_LEN = 2. In such a situation, EXT_SENS_DATA _00 |
garfieldsg | 0:662207e34fba | 2337 | * through _03 will be associated with Slave 0, while EXT_SENS_DATA _04 and 05 |
garfieldsg | 0:662207e34fba | 2338 | * will be associated with Slave 1. If Slave 2 is enabled as well, registers |
garfieldsg | 0:662207e34fba | 2339 | * starting from EXT_SENS_DATA_06 will be allocated to Slave 2. |
garfieldsg | 0:662207e34fba | 2340 | * |
garfieldsg | 0:662207e34fba | 2341 | * If Slave 2 is disabled while Slave 3 is enabled in this same situation, then |
garfieldsg | 0:662207e34fba | 2342 | * registers starting from EXT_SENS_DATA_06 will be allocated to Slave 3 |
garfieldsg | 0:662207e34fba | 2343 | * instead. |
garfieldsg | 0:662207e34fba | 2344 | * |
garfieldsg | 0:662207e34fba | 2345 | * REGISTER ALLOCATION FOR DYNAMIC DISABLE VS. NORMAL DISABLE: |
garfieldsg | 0:662207e34fba | 2346 | * If a slave is disabled at any time, the space initially allocated to the |
garfieldsg | 0:662207e34fba | 2347 | * slave in the EXT_SENS_DATA register, will remain associated with that slave. |
garfieldsg | 0:662207e34fba | 2348 | * This is to avoid dynamic adjustment of the register allocation. |
garfieldsg | 0:662207e34fba | 2349 | * |
garfieldsg | 0:662207e34fba | 2350 | * The allocation of the EXT_SENS_DATA registers is recomputed only when (1) all |
garfieldsg | 0:662207e34fba | 2351 | * slaves are disabled, or (2) the I2C_MST_RST bit is set (Register 106). |
garfieldsg | 0:662207e34fba | 2352 | * |
garfieldsg | 0:662207e34fba | 2353 | * This above is also true if one of the slaves gets NACKed and stops |
garfieldsg | 0:662207e34fba | 2354 | * functioning. |
garfieldsg | 0:662207e34fba | 2355 | * |
garfieldsg | 0:662207e34fba | 2356 | * @param position Starting position (0-23) |
garfieldsg | 0:662207e34fba | 2357 | * @return Byte read from register |
garfieldsg | 0:662207e34fba | 2358 | */ |
garfieldsg | 0:662207e34fba | 2359 | uint8_t MPU6050::getExternalSensorByte(int position) |
garfieldsg | 0:662207e34fba | 2360 | { |
garfieldsg | 0:662207e34fba | 2361 | i2Cdev.readByte(devAddr, MPU6050_RA_EXT_SENS_DATA_00 + position, buffer); |
garfieldsg | 0:662207e34fba | 2362 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 2363 | } |
garfieldsg | 0:662207e34fba | 2364 | /** Read word (2 bytes) from external sensor data registers. |
garfieldsg | 0:662207e34fba | 2365 | * @param position Starting position (0-21) |
garfieldsg | 0:662207e34fba | 2366 | * @return Word read from register |
garfieldsg | 0:662207e34fba | 2367 | * @see getExternalSensorByte() |
garfieldsg | 0:662207e34fba | 2368 | */ |
garfieldsg | 0:662207e34fba | 2369 | uint16_t MPU6050::getExternalSensorWord(int position) |
garfieldsg | 0:662207e34fba | 2370 | { |
garfieldsg | 0:662207e34fba | 2371 | i2Cdev.readBytes(devAddr, MPU6050_RA_EXT_SENS_DATA_00 + position, 2, buffer); |
garfieldsg | 0:662207e34fba | 2372 | return (((uint16_t)buffer[0]) << 8) | buffer[1]; |
garfieldsg | 0:662207e34fba | 2373 | } |
garfieldsg | 0:662207e34fba | 2374 | /** Read double word (4 bytes) from external sensor data registers. |
garfieldsg | 0:662207e34fba | 2375 | * @param position Starting position (0-20) |
garfieldsg | 0:662207e34fba | 2376 | * @return Double word read from registers |
garfieldsg | 0:662207e34fba | 2377 | * @see getExternalSensorByte() |
garfieldsg | 0:662207e34fba | 2378 | */ |
garfieldsg | 0:662207e34fba | 2379 | uint32_t MPU6050::getExternalSensorDWord(int position) |
garfieldsg | 0:662207e34fba | 2380 | { |
garfieldsg | 0:662207e34fba | 2381 | i2Cdev.readBytes(devAddr, MPU6050_RA_EXT_SENS_DATA_00 + position, 4, buffer); |
garfieldsg | 0:662207e34fba | 2382 | return (((uint32_t)buffer[0]) << 24) | (((uint32_t)buffer[1]) << 16) | (((uint16_t)buffer[2]) << 8) | buffer[3]; |
garfieldsg | 0:662207e34fba | 2383 | } |
garfieldsg | 0:662207e34fba | 2384 | |
garfieldsg | 0:662207e34fba | 2385 | // MOT_DETECT_STATUS register |
garfieldsg | 0:662207e34fba | 2386 | |
garfieldsg | 0:662207e34fba | 2387 | /** Get X-axis negative motion detection interrupt status. |
garfieldsg | 0:662207e34fba | 2388 | * @return Motion detection status |
garfieldsg | 0:662207e34fba | 2389 | * @see MPU6050_RA_MOT_DETECT_STATUS |
garfieldsg | 0:662207e34fba | 2390 | * @see MPU6050_MOTION_MOT_XNEG_BIT |
garfieldsg | 0:662207e34fba | 2391 | */ |
garfieldsg | 0:662207e34fba | 2392 | bool MPU6050::getXNegMotionDetected() |
garfieldsg | 0:662207e34fba | 2393 | { |
garfieldsg | 0:662207e34fba | 2394 | i2Cdev.readBit(devAddr, MPU6050_RA_MOT_DETECT_STATUS, MPU6050_MOTION_MOT_XNEG_BIT, buffer); |
garfieldsg | 0:662207e34fba | 2395 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 2396 | } |
garfieldsg | 0:662207e34fba | 2397 | /** Get X-axis positive motion detection interrupt status. |
garfieldsg | 0:662207e34fba | 2398 | * @return Motion detection status |
garfieldsg | 0:662207e34fba | 2399 | * @see MPU6050_RA_MOT_DETECT_STATUS |
garfieldsg | 0:662207e34fba | 2400 | * @see MPU6050_MOTION_MOT_XPOS_BIT |
garfieldsg | 0:662207e34fba | 2401 | */ |
garfieldsg | 0:662207e34fba | 2402 | bool MPU6050::getXPosMotionDetected() |
garfieldsg | 0:662207e34fba | 2403 | { |
garfieldsg | 0:662207e34fba | 2404 | i2Cdev.readBit(devAddr, MPU6050_RA_MOT_DETECT_STATUS, MPU6050_MOTION_MOT_XPOS_BIT, buffer); |
garfieldsg | 0:662207e34fba | 2405 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 2406 | } |
garfieldsg | 0:662207e34fba | 2407 | /** Get Y-axis negative motion detection interrupt status. |
garfieldsg | 0:662207e34fba | 2408 | * @return Motion detection status |
garfieldsg | 0:662207e34fba | 2409 | * @see MPU6050_RA_MOT_DETECT_STATUS |
garfieldsg | 0:662207e34fba | 2410 | * @see MPU6050_MOTION_MOT_YNEG_BIT |
garfieldsg | 0:662207e34fba | 2411 | */ |
garfieldsg | 0:662207e34fba | 2412 | bool MPU6050::getYNegMotionDetected() |
garfieldsg | 0:662207e34fba | 2413 | { |
garfieldsg | 0:662207e34fba | 2414 | i2Cdev.readBit(devAddr, MPU6050_RA_MOT_DETECT_STATUS, MPU6050_MOTION_MOT_YNEG_BIT, buffer); |
garfieldsg | 0:662207e34fba | 2415 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 2416 | } |
garfieldsg | 0:662207e34fba | 2417 | /** Get Y-axis positive motion detection interrupt status. |
garfieldsg | 0:662207e34fba | 2418 | * @return Motion detection status |
garfieldsg | 0:662207e34fba | 2419 | * @see MPU6050_RA_MOT_DETECT_STATUS |
garfieldsg | 0:662207e34fba | 2420 | * @see MPU6050_MOTION_MOT_YPOS_BIT |
garfieldsg | 0:662207e34fba | 2421 | */ |
garfieldsg | 0:662207e34fba | 2422 | bool MPU6050::getYPosMotionDetected() |
garfieldsg | 0:662207e34fba | 2423 | { |
garfieldsg | 0:662207e34fba | 2424 | i2Cdev.readBit(devAddr, MPU6050_RA_MOT_DETECT_STATUS, MPU6050_MOTION_MOT_YPOS_BIT, buffer); |
garfieldsg | 0:662207e34fba | 2425 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 2426 | } |
garfieldsg | 0:662207e34fba | 2427 | /** Get Z-axis negative motion detection interrupt status. |
garfieldsg | 0:662207e34fba | 2428 | * @return Motion detection status |
garfieldsg | 0:662207e34fba | 2429 | * @see MPU6050_RA_MOT_DETECT_STATUS |
garfieldsg | 0:662207e34fba | 2430 | * @see MPU6050_MOTION_MOT_ZNEG_BIT |
garfieldsg | 0:662207e34fba | 2431 | */ |
garfieldsg | 0:662207e34fba | 2432 | bool MPU6050::getZNegMotionDetected() |
garfieldsg | 0:662207e34fba | 2433 | { |
garfieldsg | 0:662207e34fba | 2434 | i2Cdev.readBit(devAddr, MPU6050_RA_MOT_DETECT_STATUS, MPU6050_MOTION_MOT_ZNEG_BIT, buffer); |
garfieldsg | 0:662207e34fba | 2435 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 2436 | } |
garfieldsg | 0:662207e34fba | 2437 | /** Get Z-axis positive motion detection interrupt status. |
garfieldsg | 0:662207e34fba | 2438 | * @return Motion detection status |
garfieldsg | 0:662207e34fba | 2439 | * @see MPU6050_RA_MOT_DETECT_STATUS |
garfieldsg | 0:662207e34fba | 2440 | * @see MPU6050_MOTION_MOT_ZPOS_BIT |
garfieldsg | 0:662207e34fba | 2441 | */ |
garfieldsg | 0:662207e34fba | 2442 | bool MPU6050::getZPosMotionDetected() |
garfieldsg | 0:662207e34fba | 2443 | { |
garfieldsg | 0:662207e34fba | 2444 | i2Cdev.readBit(devAddr, MPU6050_RA_MOT_DETECT_STATUS, MPU6050_MOTION_MOT_ZPOS_BIT, buffer); |
garfieldsg | 0:662207e34fba | 2445 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 2446 | } |
garfieldsg | 0:662207e34fba | 2447 | /** Get zero motion detection interrupt status. |
garfieldsg | 0:662207e34fba | 2448 | * @return Motion detection status |
garfieldsg | 0:662207e34fba | 2449 | * @see MPU6050_RA_MOT_DETECT_STATUS |
garfieldsg | 0:662207e34fba | 2450 | * @see MPU6050_MOTION_MOT_ZRMOT_BIT |
garfieldsg | 0:662207e34fba | 2451 | */ |
garfieldsg | 0:662207e34fba | 2452 | bool MPU6050::getZeroMotionDetected() |
garfieldsg | 0:662207e34fba | 2453 | { |
garfieldsg | 0:662207e34fba | 2454 | i2Cdev.readBit(devAddr, MPU6050_RA_MOT_DETECT_STATUS, MPU6050_MOTION_MOT_ZRMOT_BIT, buffer); |
garfieldsg | 0:662207e34fba | 2455 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 2456 | } |
garfieldsg | 0:662207e34fba | 2457 | |
garfieldsg | 0:662207e34fba | 2458 | // I2C_SLV*_DO register |
garfieldsg | 0:662207e34fba | 2459 | |
garfieldsg | 0:662207e34fba | 2460 | /** Write byte to Data Output container for specified slave. |
garfieldsg | 0:662207e34fba | 2461 | * This register holds the output data written into Slave when Slave is set to |
garfieldsg | 0:662207e34fba | 2462 | * write mode. For further information regarding Slave control, please |
garfieldsg | 0:662207e34fba | 2463 | * refer to Registers 37 to 39 and immediately following. |
garfieldsg | 0:662207e34fba | 2464 | * @param num Slave number (0-3) |
garfieldsg | 0:662207e34fba | 2465 | * @param data Byte to write |
garfieldsg | 0:662207e34fba | 2466 | * @see MPU6050_RA_I2C_SLV0_DO |
garfieldsg | 0:662207e34fba | 2467 | */ |
garfieldsg | 0:662207e34fba | 2468 | void MPU6050::setSlaveOutputByte(uint8_t num, uint8_t data) |
garfieldsg | 0:662207e34fba | 2469 | { |
garfieldsg | 0:662207e34fba | 2470 | if (num > 3) return; |
garfieldsg | 0:662207e34fba | 2471 | i2Cdev.writeByte(devAddr, MPU6050_RA_I2C_SLV0_DO + num, data); |
garfieldsg | 0:662207e34fba | 2472 | } |
garfieldsg | 0:662207e34fba | 2473 | |
garfieldsg | 0:662207e34fba | 2474 | // I2C_MST_DELAY_CTRL register |
garfieldsg | 0:662207e34fba | 2475 | |
garfieldsg | 0:662207e34fba | 2476 | /** Get external data shadow delay enabled status. |
garfieldsg | 0:662207e34fba | 2477 | * This register is used to specify the timing of external sensor data |
garfieldsg | 0:662207e34fba | 2478 | * shadowing. When DELAY_ES_SHADOW is set to 1, shadowing of external |
garfieldsg | 0:662207e34fba | 2479 | * sensor data is delayed until all data has been received. |
garfieldsg | 0:662207e34fba | 2480 | * @return Current external data shadow delay enabled status. |
garfieldsg | 0:662207e34fba | 2481 | * @see MPU6050_RA_I2C_MST_DELAY_CTRL |
garfieldsg | 0:662207e34fba | 2482 | * @see MPU6050_DELAYCTRL_DELAY_ES_SHADOW_BIT |
garfieldsg | 0:662207e34fba | 2483 | */ |
garfieldsg | 0:662207e34fba | 2484 | bool MPU6050::getExternalShadowDelayEnabled() |
garfieldsg | 0:662207e34fba | 2485 | { |
garfieldsg | 0:662207e34fba | 2486 | i2Cdev.readBit(devAddr, MPU6050_RA_I2C_MST_DELAY_CTRL, MPU6050_DELAYCTRL_DELAY_ES_SHADOW_BIT, buffer); |
garfieldsg | 0:662207e34fba | 2487 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 2488 | } |
garfieldsg | 0:662207e34fba | 2489 | /** Set external data shadow delay enabled status. |
garfieldsg | 0:662207e34fba | 2490 | * @param enabled New external data shadow delay enabled status. |
garfieldsg | 0:662207e34fba | 2491 | * @see getExternalShadowDelayEnabled() |
garfieldsg | 0:662207e34fba | 2492 | * @see MPU6050_RA_I2C_MST_DELAY_CTRL |
garfieldsg | 0:662207e34fba | 2493 | * @see MPU6050_DELAYCTRL_DELAY_ES_SHADOW_BIT |
garfieldsg | 0:662207e34fba | 2494 | */ |
garfieldsg | 0:662207e34fba | 2495 | void MPU6050::setExternalShadowDelayEnabled(bool enabled) |
garfieldsg | 0:662207e34fba | 2496 | { |
garfieldsg | 0:662207e34fba | 2497 | i2Cdev.writeBit(devAddr, MPU6050_RA_I2C_MST_DELAY_CTRL, MPU6050_DELAYCTRL_DELAY_ES_SHADOW_BIT, enabled); |
garfieldsg | 0:662207e34fba | 2498 | } |
garfieldsg | 0:662207e34fba | 2499 | /** Get slave delay enabled status. |
garfieldsg | 0:662207e34fba | 2500 | * When a particular slave delay is enabled, the rate of access for the that |
garfieldsg | 0:662207e34fba | 2501 | * slave device is reduced. When a slave's access rate is decreased relative to |
garfieldsg | 0:662207e34fba | 2502 | * the Sample Rate, the slave is accessed every: |
garfieldsg | 0:662207e34fba | 2503 | * |
garfieldsg | 0:662207e34fba | 2504 | * 1 / (1 + I2C_MST_DLY) Samples |
garfieldsg | 0:662207e34fba | 2505 | * |
garfieldsg | 0:662207e34fba | 2506 | * This base Sample Rate in turn is determined by SMPLRT_DIV (register * 25) |
garfieldsg | 0:662207e34fba | 2507 | * and DLPF_CFG (register 26). |
garfieldsg | 0:662207e34fba | 2508 | * |
garfieldsg | 0:662207e34fba | 2509 | * For further information regarding I2C_MST_DLY, please refer to register 52. |
garfieldsg | 0:662207e34fba | 2510 | * For further information regarding the Sample Rate, please refer to register 25. |
garfieldsg | 0:662207e34fba | 2511 | * |
garfieldsg | 0:662207e34fba | 2512 | * @param num Slave number (0-4) |
garfieldsg | 0:662207e34fba | 2513 | * @return Current slave delay enabled status. |
garfieldsg | 0:662207e34fba | 2514 | * @see MPU6050_RA_I2C_MST_DELAY_CTRL |
garfieldsg | 0:662207e34fba | 2515 | * @see MPU6050_DELAYCTRL_I2C_SLV0_DLY_EN_BIT |
garfieldsg | 0:662207e34fba | 2516 | */ |
garfieldsg | 0:662207e34fba | 2517 | bool MPU6050::getSlaveDelayEnabled(uint8_t num) |
garfieldsg | 0:662207e34fba | 2518 | { |
garfieldsg | 0:662207e34fba | 2519 | // MPU6050_DELAYCTRL_I2C_SLV4_DLY_EN_BIT is 4, SLV3 is 3, etc. |
garfieldsg | 0:662207e34fba | 2520 | if (num > 4) return 0; |
garfieldsg | 0:662207e34fba | 2521 | i2Cdev.readBit(devAddr, MPU6050_RA_I2C_MST_DELAY_CTRL, num, buffer); |
garfieldsg | 0:662207e34fba | 2522 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 2523 | } |
garfieldsg | 0:662207e34fba | 2524 | /** Set slave delay enabled status. |
garfieldsg | 0:662207e34fba | 2525 | * @param num Slave number (0-4) |
garfieldsg | 0:662207e34fba | 2526 | * @param enabled New slave delay enabled status. |
garfieldsg | 0:662207e34fba | 2527 | * @see MPU6050_RA_I2C_MST_DELAY_CTRL |
garfieldsg | 0:662207e34fba | 2528 | * @see MPU6050_DELAYCTRL_I2C_SLV0_DLY_EN_BIT |
garfieldsg | 0:662207e34fba | 2529 | */ |
garfieldsg | 0:662207e34fba | 2530 | void MPU6050::setSlaveDelayEnabled(uint8_t num, bool enabled) |
garfieldsg | 0:662207e34fba | 2531 | { |
garfieldsg | 0:662207e34fba | 2532 | i2Cdev.writeBit(devAddr, MPU6050_RA_I2C_MST_DELAY_CTRL, num, enabled); |
garfieldsg | 0:662207e34fba | 2533 | } |
garfieldsg | 0:662207e34fba | 2534 | |
garfieldsg | 0:662207e34fba | 2535 | // SIGNAL_PATH_RESET register |
garfieldsg | 0:662207e34fba | 2536 | |
garfieldsg | 0:662207e34fba | 2537 | /** Reset gyroscope signal path. |
garfieldsg | 0:662207e34fba | 2538 | * The reset will revert the signal path analog to digital converters and |
garfieldsg | 0:662207e34fba | 2539 | * filters to their power up configurations. |
garfieldsg | 0:662207e34fba | 2540 | * @see MPU6050_RA_SIGNAL_PATH_RESET |
garfieldsg | 0:662207e34fba | 2541 | * @see MPU6050_PATHRESET_GYRO_RESET_BIT |
garfieldsg | 0:662207e34fba | 2542 | */ |
garfieldsg | 0:662207e34fba | 2543 | void MPU6050::resetGyroscopePath() |
garfieldsg | 0:662207e34fba | 2544 | { |
garfieldsg | 0:662207e34fba | 2545 | i2Cdev.writeBit(devAddr, MPU6050_RA_SIGNAL_PATH_RESET, MPU6050_PATHRESET_GYRO_RESET_BIT, true); |
garfieldsg | 0:662207e34fba | 2546 | } |
garfieldsg | 0:662207e34fba | 2547 | /** Reset accelerometer signal path. |
garfieldsg | 0:662207e34fba | 2548 | * The reset will revert the signal path analog to digital converters and |
garfieldsg | 0:662207e34fba | 2549 | * filters to their power up configurations. |
garfieldsg | 0:662207e34fba | 2550 | * @see MPU6050_RA_SIGNAL_PATH_RESET |
garfieldsg | 0:662207e34fba | 2551 | * @see MPU6050_PATHRESET_ACCEL_RESET_BIT |
garfieldsg | 0:662207e34fba | 2552 | */ |
garfieldsg | 0:662207e34fba | 2553 | void MPU6050::resetAccelerometerPath() |
garfieldsg | 0:662207e34fba | 2554 | { |
garfieldsg | 0:662207e34fba | 2555 | i2Cdev.writeBit(devAddr, MPU6050_RA_SIGNAL_PATH_RESET, MPU6050_PATHRESET_ACCEL_RESET_BIT, true); |
garfieldsg | 0:662207e34fba | 2556 | } |
garfieldsg | 0:662207e34fba | 2557 | /** Reset temperature sensor signal path. |
garfieldsg | 0:662207e34fba | 2558 | * The reset will revert the signal path analog to digital converters and |
garfieldsg | 0:662207e34fba | 2559 | * filters to their power up configurations. |
garfieldsg | 0:662207e34fba | 2560 | * @see MPU6050_RA_SIGNAL_PATH_RESET |
garfieldsg | 0:662207e34fba | 2561 | * @see MPU6050_PATHRESET_TEMP_RESET_BIT |
garfieldsg | 0:662207e34fba | 2562 | */ |
garfieldsg | 0:662207e34fba | 2563 | void MPU6050::resetTemperaturePath() |
garfieldsg | 0:662207e34fba | 2564 | { |
garfieldsg | 0:662207e34fba | 2565 | i2Cdev.writeBit(devAddr, MPU6050_RA_SIGNAL_PATH_RESET, MPU6050_PATHRESET_TEMP_RESET_BIT, true); |
garfieldsg | 0:662207e34fba | 2566 | } |
garfieldsg | 0:662207e34fba | 2567 | |
garfieldsg | 0:662207e34fba | 2568 | // MOT_DETECT_CTRL register |
garfieldsg | 0:662207e34fba | 2569 | |
garfieldsg | 0:662207e34fba | 2570 | /** Get accelerometer power-on delay. |
garfieldsg | 0:662207e34fba | 2571 | * The accelerometer data path provides samples to the sensor registers, Motion |
garfieldsg | 0:662207e34fba | 2572 | * detection, Zero Motion detection, and Free Fall detection modules. The |
garfieldsg | 0:662207e34fba | 2573 | * signal path contains filters which must be flushed on wake-up with new |
garfieldsg | 0:662207e34fba | 2574 | * samples before the detection modules begin operations. The default wake-up |
garfieldsg | 0:662207e34fba | 2575 | * delay, of 4ms can be lengthened by up to 3ms. This additional delay is |
garfieldsg | 0:662207e34fba | 2576 | * specified in ACCEL_ON_DELAY in units of 1 LSB = 1 ms. The user may select |
garfieldsg | 0:662207e34fba | 2577 | * any value above zero unless instructed otherwise by InvenSense. Please refer |
garfieldsg | 0:662207e34fba | 2578 | * to Section 8 of the MPU-6000/MPU-6050 Product Specification document for |
garfieldsg | 0:662207e34fba | 2579 | * further information regarding the detection modules. |
garfieldsg | 0:662207e34fba | 2580 | * @return Current accelerometer power-on delay |
garfieldsg | 0:662207e34fba | 2581 | * @see MPU6050_RA_MOT_DETECT_CTRL |
garfieldsg | 0:662207e34fba | 2582 | * @see MPU6050_DETECT_ACCEL_ON_DELAY_BIT |
garfieldsg | 0:662207e34fba | 2583 | */ |
garfieldsg | 0:662207e34fba | 2584 | uint8_t MPU6050::getAccelerometerPowerOnDelay() |
garfieldsg | 0:662207e34fba | 2585 | { |
garfieldsg | 0:662207e34fba | 2586 | i2Cdev.readBits(devAddr, MPU6050_RA_MOT_DETECT_CTRL, MPU6050_DETECT_ACCEL_ON_DELAY_BIT, MPU6050_DETECT_ACCEL_ON_DELAY_LENGTH, buffer); |
garfieldsg | 0:662207e34fba | 2587 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 2588 | } |
garfieldsg | 0:662207e34fba | 2589 | /** Set accelerometer power-on delay. |
garfieldsg | 0:662207e34fba | 2590 | * @param delay New accelerometer power-on delay (0-3) |
garfieldsg | 0:662207e34fba | 2591 | * @see getAccelerometerPowerOnDelay() |
garfieldsg | 0:662207e34fba | 2592 | * @see MPU6050_RA_MOT_DETECT_CTRL |
garfieldsg | 0:662207e34fba | 2593 | * @see MPU6050_DETECT_ACCEL_ON_DELAY_BIT |
garfieldsg | 0:662207e34fba | 2594 | */ |
garfieldsg | 0:662207e34fba | 2595 | void MPU6050::setAccelerometerPowerOnDelay(uint8_t delay) |
garfieldsg | 0:662207e34fba | 2596 | { |
garfieldsg | 0:662207e34fba | 2597 | i2Cdev.writeBits(devAddr, MPU6050_RA_MOT_DETECT_CTRL, MPU6050_DETECT_ACCEL_ON_DELAY_BIT, MPU6050_DETECT_ACCEL_ON_DELAY_LENGTH, delay); |
garfieldsg | 0:662207e34fba | 2598 | } |
garfieldsg | 0:662207e34fba | 2599 | /** Get Free Fall detection counter decrement configuration. |
garfieldsg | 0:662207e34fba | 2600 | * Detection is registered by the Free Fall detection module after accelerometer |
garfieldsg | 0:662207e34fba | 2601 | * measurements meet their respective threshold conditions over a specified |
garfieldsg | 0:662207e34fba | 2602 | * number of samples. When the threshold conditions are met, the corresponding |
garfieldsg | 0:662207e34fba | 2603 | * detection counter increments by 1. The user may control the rate at which the |
garfieldsg | 0:662207e34fba | 2604 | * detection counter decrements when the threshold condition is not met by |
garfieldsg | 0:662207e34fba | 2605 | * configuring FF_COUNT. The decrement rate can be set according to the |
garfieldsg | 0:662207e34fba | 2606 | * following table: |
garfieldsg | 0:662207e34fba | 2607 | * |
garfieldsg | 0:662207e34fba | 2608 | * <pre> |
garfieldsg | 0:662207e34fba | 2609 | * FF_COUNT | Counter Decrement |
garfieldsg | 0:662207e34fba | 2610 | * ---------+------------------ |
garfieldsg | 0:662207e34fba | 2611 | * 0 | Reset |
garfieldsg | 0:662207e34fba | 2612 | * 1 | 1 |
garfieldsg | 0:662207e34fba | 2613 | * 2 | 2 |
garfieldsg | 0:662207e34fba | 2614 | * 3 | 4 |
garfieldsg | 0:662207e34fba | 2615 | * </pre> |
garfieldsg | 0:662207e34fba | 2616 | * |
garfieldsg | 0:662207e34fba | 2617 | * When FF_COUNT is configured to 0 (reset), any non-qualifying sample will |
garfieldsg | 0:662207e34fba | 2618 | * reset the counter to 0. For further information on Free Fall detection, |
garfieldsg | 0:662207e34fba | 2619 | * please refer to Registers 29 to 32. |
garfieldsg | 0:662207e34fba | 2620 | * |
garfieldsg | 0:662207e34fba | 2621 | * @return Current decrement configuration |
garfieldsg | 0:662207e34fba | 2622 | * @see MPU6050_RA_MOT_DETECT_CTRL |
garfieldsg | 0:662207e34fba | 2623 | * @see MPU6050_DETECT_FF_COUNT_BIT |
garfieldsg | 0:662207e34fba | 2624 | */ |
garfieldsg | 0:662207e34fba | 2625 | uint8_t MPU6050::getFreefallDetectionCounterDecrement() |
garfieldsg | 0:662207e34fba | 2626 | { |
garfieldsg | 0:662207e34fba | 2627 | i2Cdev.readBits(devAddr, MPU6050_RA_MOT_DETECT_CTRL, MPU6050_DETECT_FF_COUNT_BIT, MPU6050_DETECT_FF_COUNT_LENGTH, buffer); |
garfieldsg | 0:662207e34fba | 2628 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 2629 | } |
garfieldsg | 0:662207e34fba | 2630 | /** Set Free Fall detection counter decrement configuration. |
garfieldsg | 0:662207e34fba | 2631 | * @param decrement New decrement configuration value |
garfieldsg | 0:662207e34fba | 2632 | * @see getFreefallDetectionCounterDecrement() |
garfieldsg | 0:662207e34fba | 2633 | * @see MPU6050_RA_MOT_DETECT_CTRL |
garfieldsg | 0:662207e34fba | 2634 | * @see MPU6050_DETECT_FF_COUNT_BIT |
garfieldsg | 0:662207e34fba | 2635 | */ |
garfieldsg | 0:662207e34fba | 2636 | void MPU6050::setFreefallDetectionCounterDecrement(uint8_t decrement) |
garfieldsg | 0:662207e34fba | 2637 | { |
garfieldsg | 0:662207e34fba | 2638 | i2Cdev.writeBits(devAddr, MPU6050_RA_MOT_DETECT_CTRL, MPU6050_DETECT_FF_COUNT_BIT, MPU6050_DETECT_FF_COUNT_LENGTH, decrement); |
garfieldsg | 0:662207e34fba | 2639 | } |
garfieldsg | 0:662207e34fba | 2640 | /** Get Motion detection counter decrement configuration. |
garfieldsg | 0:662207e34fba | 2641 | * Detection is registered by the Motion detection module after accelerometer |
garfieldsg | 0:662207e34fba | 2642 | * measurements meet their respective threshold conditions over a specified |
garfieldsg | 0:662207e34fba | 2643 | * number of samples. When the threshold conditions are met, the corresponding |
garfieldsg | 0:662207e34fba | 2644 | * detection counter increments by 1. The user may control the rate at which the |
garfieldsg | 0:662207e34fba | 2645 | * detection counter decrements when the threshold condition is not met by |
garfieldsg | 0:662207e34fba | 2646 | * configuring MOT_COUNT. The decrement rate can be set according to the |
garfieldsg | 0:662207e34fba | 2647 | * following table: |
garfieldsg | 0:662207e34fba | 2648 | * |
garfieldsg | 0:662207e34fba | 2649 | * <pre> |
garfieldsg | 0:662207e34fba | 2650 | * MOT_COUNT | Counter Decrement |
garfieldsg | 0:662207e34fba | 2651 | * ----------+------------------ |
garfieldsg | 0:662207e34fba | 2652 | * 0 | Reset |
garfieldsg | 0:662207e34fba | 2653 | * 1 | 1 |
garfieldsg | 0:662207e34fba | 2654 | * 2 | 2 |
garfieldsg | 0:662207e34fba | 2655 | * 3 | 4 |
garfieldsg | 0:662207e34fba | 2656 | * </pre> |
garfieldsg | 0:662207e34fba | 2657 | * |
garfieldsg | 0:662207e34fba | 2658 | * When MOT_COUNT is configured to 0 (reset), any non-qualifying sample will |
garfieldsg | 0:662207e34fba | 2659 | * reset the counter to 0. For further information on Motion detection, |
garfieldsg | 0:662207e34fba | 2660 | * please refer to Registers 29 to 32. |
garfieldsg | 0:662207e34fba | 2661 | * |
garfieldsg | 0:662207e34fba | 2662 | */ |
garfieldsg | 0:662207e34fba | 2663 | uint8_t MPU6050::getMotionDetectionCounterDecrement() |
garfieldsg | 0:662207e34fba | 2664 | { |
garfieldsg | 0:662207e34fba | 2665 | i2Cdev.readBits(devAddr, MPU6050_RA_MOT_DETECT_CTRL, MPU6050_DETECT_MOT_COUNT_BIT, MPU6050_DETECT_MOT_COUNT_LENGTH, buffer); |
garfieldsg | 0:662207e34fba | 2666 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 2667 | } |
garfieldsg | 0:662207e34fba | 2668 | /** Set Motion detection counter decrement configuration. |
garfieldsg | 0:662207e34fba | 2669 | * @param decrement New decrement configuration value |
garfieldsg | 0:662207e34fba | 2670 | * @see getMotionDetectionCounterDecrement() |
garfieldsg | 0:662207e34fba | 2671 | * @see MPU6050_RA_MOT_DETECT_CTRL |
garfieldsg | 0:662207e34fba | 2672 | * @see MPU6050_DETECT_MOT_COUNT_BIT |
garfieldsg | 0:662207e34fba | 2673 | */ |
garfieldsg | 0:662207e34fba | 2674 | void MPU6050::setMotionDetectionCounterDecrement(uint8_t decrement) |
garfieldsg | 0:662207e34fba | 2675 | { |
garfieldsg | 0:662207e34fba | 2676 | i2Cdev.writeBits(devAddr, MPU6050_RA_MOT_DETECT_CTRL, MPU6050_DETECT_MOT_COUNT_BIT, MPU6050_DETECT_MOT_COUNT_LENGTH, decrement); |
garfieldsg | 0:662207e34fba | 2677 | } |
garfieldsg | 0:662207e34fba | 2678 | |
garfieldsg | 0:662207e34fba | 2679 | // USER_CTRL register |
garfieldsg | 0:662207e34fba | 2680 | |
garfieldsg | 0:662207e34fba | 2681 | /** Get FIFO enabled status. |
garfieldsg | 0:662207e34fba | 2682 | * When this bit is set to 0, the FIFO buffer is disabled. The FIFO buffer |
garfieldsg | 0:662207e34fba | 2683 | * cannot be written to or read from while disabled. The FIFO buffer's state |
garfieldsg | 0:662207e34fba | 2684 | * does not change unless the MPU-60X0 is power cycled. |
garfieldsg | 0:662207e34fba | 2685 | * @return Current FIFO enabled status |
garfieldsg | 0:662207e34fba | 2686 | * @see MPU6050_RA_USER_CTRL |
garfieldsg | 0:662207e34fba | 2687 | * @see MPU6050_USERCTRL_FIFO_EN_BIT |
garfieldsg | 0:662207e34fba | 2688 | */ |
garfieldsg | 0:662207e34fba | 2689 | bool MPU6050::getFIFOEnabled() |
garfieldsg | 0:662207e34fba | 2690 | { |
garfieldsg | 0:662207e34fba | 2691 | i2Cdev.readBit(devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_FIFO_EN_BIT, buffer); |
garfieldsg | 0:662207e34fba | 2692 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 2693 | } |
garfieldsg | 0:662207e34fba | 2694 | /** Set FIFO enabled status. |
garfieldsg | 0:662207e34fba | 2695 | * @param enabled New FIFO enabled status |
garfieldsg | 0:662207e34fba | 2696 | * @see getFIFOEnabled() |
garfieldsg | 0:662207e34fba | 2697 | * @see MPU6050_RA_USER_CTRL |
garfieldsg | 0:662207e34fba | 2698 | * @see MPU6050_USERCTRL_FIFO_EN_BIT |
garfieldsg | 0:662207e34fba | 2699 | */ |
garfieldsg | 0:662207e34fba | 2700 | void MPU6050::setFIFOEnabled(bool enabled) |
garfieldsg | 0:662207e34fba | 2701 | { |
garfieldsg | 0:662207e34fba | 2702 | i2Cdev.writeBit(devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_FIFO_EN_BIT, enabled); |
garfieldsg | 0:662207e34fba | 2703 | } |
garfieldsg | 0:662207e34fba | 2704 | /** Get I2C Master Mode enabled status. |
garfieldsg | 0:662207e34fba | 2705 | * When this mode is enabled, the MPU-60X0 acts as the I2C Master to the |
garfieldsg | 0:662207e34fba | 2706 | * external sensor slave devices on the auxiliary I2C bus. When this bit is |
garfieldsg | 0:662207e34fba | 2707 | * cleared to 0, the auxiliary I2C bus lines (AUX_DA and AUX_CL) are logically |
garfieldsg | 0:662207e34fba | 2708 | * driven by the primary I2C bus (SDA and SCL). This is a precondition to |
garfieldsg | 0:662207e34fba | 2709 | * enabling Bypass Mode. For further information regarding Bypass Mode, please |
garfieldsg | 0:662207e34fba | 2710 | * refer to Register 55. |
garfieldsg | 0:662207e34fba | 2711 | * @return Current I2C Master Mode enabled status |
garfieldsg | 0:662207e34fba | 2712 | * @see MPU6050_RA_USER_CTRL |
garfieldsg | 0:662207e34fba | 2713 | * @see MPU6050_USERCTRL_I2C_MST_EN_BIT |
garfieldsg | 0:662207e34fba | 2714 | */ |
garfieldsg | 0:662207e34fba | 2715 | bool MPU6050::getI2CMasterModeEnabled() |
garfieldsg | 0:662207e34fba | 2716 | { |
garfieldsg | 0:662207e34fba | 2717 | i2Cdev.readBit(devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_I2C_MST_EN_BIT, buffer); |
garfieldsg | 0:662207e34fba | 2718 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 2719 | } |
garfieldsg | 0:662207e34fba | 2720 | /** Set I2C Master Mode enabled status. |
garfieldsg | 0:662207e34fba | 2721 | * @param enabled New I2C Master Mode enabled status |
garfieldsg | 0:662207e34fba | 2722 | * @see getI2CMasterModeEnabled() |
garfieldsg | 0:662207e34fba | 2723 | * @see MPU6050_RA_USER_CTRL |
garfieldsg | 0:662207e34fba | 2724 | * @see MPU6050_USERCTRL_I2C_MST_EN_BIT |
garfieldsg | 0:662207e34fba | 2725 | */ |
garfieldsg | 0:662207e34fba | 2726 | void MPU6050::setI2CMasterModeEnabled(bool enabled) |
garfieldsg | 0:662207e34fba | 2727 | { |
garfieldsg | 0:662207e34fba | 2728 | i2Cdev.writeBit(devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_I2C_MST_EN_BIT, enabled); |
garfieldsg | 0:662207e34fba | 2729 | } |
garfieldsg | 0:662207e34fba | 2730 | /** Switch from I2C to SPI mode (MPU-6000 only) |
garfieldsg | 0:662207e34fba | 2731 | * If this is set, the primary SPI interface will be enabled in place of the |
garfieldsg | 0:662207e34fba | 2732 | * disabled primary I2C interface. |
garfieldsg | 0:662207e34fba | 2733 | */ |
garfieldsg | 0:662207e34fba | 2734 | void MPU6050::switchSPIEnabled(bool enabled) |
garfieldsg | 0:662207e34fba | 2735 | { |
garfieldsg | 0:662207e34fba | 2736 | i2Cdev.writeBit(devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_I2C_IF_DIS_BIT, enabled); |
garfieldsg | 0:662207e34fba | 2737 | } |
garfieldsg | 0:662207e34fba | 2738 | /** Reset the FIFO. |
garfieldsg | 0:662207e34fba | 2739 | * This bit resets the FIFO buffer when set to 1 while FIFO_EN equals 0. This |
garfieldsg | 0:662207e34fba | 2740 | * bit automatically clears to 0 after the reset has been triggered. |
garfieldsg | 0:662207e34fba | 2741 | * @see MPU6050_RA_USER_CTRL |
garfieldsg | 0:662207e34fba | 2742 | * @see MPU6050_USERCTRL_FIFO_RESET_BIT |
garfieldsg | 0:662207e34fba | 2743 | */ |
garfieldsg | 0:662207e34fba | 2744 | void MPU6050::resetFIFO() |
garfieldsg | 0:662207e34fba | 2745 | { |
garfieldsg | 0:662207e34fba | 2746 | i2Cdev.writeBit(devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_FIFO_RESET_BIT, true); |
garfieldsg | 0:662207e34fba | 2747 | } |
garfieldsg | 0:662207e34fba | 2748 | /** Reset the I2C Master. |
garfieldsg | 0:662207e34fba | 2749 | * This bit resets the I2C Master when set to 1 while I2C_MST_EN equals 0. |
garfieldsg | 0:662207e34fba | 2750 | * This bit automatically clears to 0 after the reset has been triggered. |
garfieldsg | 0:662207e34fba | 2751 | * @see MPU6050_RA_USER_CTRL |
garfieldsg | 0:662207e34fba | 2752 | * @see MPU6050_USERCTRL_I2C_MST_RESET_BIT |
garfieldsg | 0:662207e34fba | 2753 | */ |
garfieldsg | 0:662207e34fba | 2754 | void MPU6050::resetI2CMaster() |
garfieldsg | 0:662207e34fba | 2755 | { |
garfieldsg | 0:662207e34fba | 2756 | i2Cdev.writeBit(devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_I2C_MST_RESET_BIT, true); |
garfieldsg | 0:662207e34fba | 2757 | } |
garfieldsg | 0:662207e34fba | 2758 | /** Reset all sensor registers and signal paths. |
garfieldsg | 0:662207e34fba | 2759 | * When set to 1, this bit resets the signal paths for all sensors (gyroscopes, |
garfieldsg | 0:662207e34fba | 2760 | * accelerometers, and temperature sensor). This operation will also clear the |
garfieldsg | 0:662207e34fba | 2761 | * sensor registers. This bit automatically clears to 0 after the reset has been |
garfieldsg | 0:662207e34fba | 2762 | * triggered. |
garfieldsg | 0:662207e34fba | 2763 | * |
garfieldsg | 0:662207e34fba | 2764 | * When resetting only the signal path (and not the sensor registers), please |
garfieldsg | 0:662207e34fba | 2765 | * use Register 104, SIGNAL_PATH_RESET. |
garfieldsg | 0:662207e34fba | 2766 | * |
garfieldsg | 0:662207e34fba | 2767 | * @see MPU6050_RA_USER_CTRL |
garfieldsg | 0:662207e34fba | 2768 | * @see MPU6050_USERCTRL_SIG_COND_RESET_BIT |
garfieldsg | 0:662207e34fba | 2769 | */ |
garfieldsg | 0:662207e34fba | 2770 | void MPU6050::resetSensors() |
garfieldsg | 0:662207e34fba | 2771 | { |
garfieldsg | 0:662207e34fba | 2772 | i2Cdev.writeBit(devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_SIG_COND_RESET_BIT, true); |
garfieldsg | 0:662207e34fba | 2773 | } |
garfieldsg | 0:662207e34fba | 2774 | |
garfieldsg | 0:662207e34fba | 2775 | // PWR_MGMT_1 register |
garfieldsg | 0:662207e34fba | 2776 | |
garfieldsg | 0:662207e34fba | 2777 | /** Trigger a full device reset. |
garfieldsg | 0:662207e34fba | 2778 | * A small delay of ~50ms may be desirable after triggering a reset. |
garfieldsg | 0:662207e34fba | 2779 | * @see MPU6050_RA_PWR_MGMT_1 |
garfieldsg | 0:662207e34fba | 2780 | * @see MPU6050_PWR1_DEVICE_RESET_BIT |
garfieldsg | 0:662207e34fba | 2781 | */ |
garfieldsg | 0:662207e34fba | 2782 | void MPU6050::reset() |
garfieldsg | 0:662207e34fba | 2783 | { |
garfieldsg | 0:662207e34fba | 2784 | i2Cdev.writeBit(devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_DEVICE_RESET_BIT, true); |
garfieldsg | 0:662207e34fba | 2785 | } |
garfieldsg | 0:662207e34fba | 2786 | /** Get sleep mode status. |
garfieldsg | 0:662207e34fba | 2787 | * Setting the SLEEP bit in the register puts the device into very low power |
garfieldsg | 0:662207e34fba | 2788 | * sleep mode. In this mode, only the serial interface and internal registers |
garfieldsg | 0:662207e34fba | 2789 | * remain active, allowing for a very low standby current. Clearing this bit |
garfieldsg | 0:662207e34fba | 2790 | * puts the device back into normal mode. To save power, the individual standby |
garfieldsg | 0:662207e34fba | 2791 | * selections for each of the gyros should be used if any gyro axis is not used |
garfieldsg | 0:662207e34fba | 2792 | * by the application. |
garfieldsg | 0:662207e34fba | 2793 | * @return Current sleep mode enabled status |
garfieldsg | 0:662207e34fba | 2794 | * @see MPU6050_RA_PWR_MGMT_1 |
garfieldsg | 0:662207e34fba | 2795 | * @see MPU6050_PWR1_SLEEP_BIT |
garfieldsg | 0:662207e34fba | 2796 | */ |
garfieldsg | 0:662207e34fba | 2797 | bool MPU6050::getSleepEnabled() |
garfieldsg | 0:662207e34fba | 2798 | { |
garfieldsg | 0:662207e34fba | 2799 | i2Cdev.readBit(devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_SLEEP_BIT, buffer); |
garfieldsg | 0:662207e34fba | 2800 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 2801 | } |
garfieldsg | 0:662207e34fba | 2802 | /** Set sleep mode status. |
garfieldsg | 0:662207e34fba | 2803 | * @param enabled New sleep mode enabled status |
garfieldsg | 0:662207e34fba | 2804 | * @see getSleepEnabled() |
garfieldsg | 0:662207e34fba | 2805 | * @see MPU6050_RA_PWR_MGMT_1 |
garfieldsg | 0:662207e34fba | 2806 | * @see MPU6050_PWR1_SLEEP_BIT |
garfieldsg | 0:662207e34fba | 2807 | */ |
garfieldsg | 0:662207e34fba | 2808 | void MPU6050::setSleepEnabled(bool enabled) |
garfieldsg | 0:662207e34fba | 2809 | { |
garfieldsg | 0:662207e34fba | 2810 | i2Cdev.writeBit(devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_SLEEP_BIT, enabled); |
garfieldsg | 0:662207e34fba | 2811 | } |
garfieldsg | 0:662207e34fba | 2812 | /** Get wake cycle enabled status. |
garfieldsg | 0:662207e34fba | 2813 | * When this bit is set to 1 and SLEEP is disabled, the MPU-60X0 will cycle |
garfieldsg | 0:662207e34fba | 2814 | * between sleep mode and waking up to take a single sample of data from active |
garfieldsg | 0:662207e34fba | 2815 | * sensors at a rate determined by LP_WAKE_CTRL (register 108). |
garfieldsg | 0:662207e34fba | 2816 | * @return Current sleep mode enabled status |
garfieldsg | 0:662207e34fba | 2817 | * @see MPU6050_RA_PWR_MGMT_1 |
garfieldsg | 0:662207e34fba | 2818 | * @see MPU6050_PWR1_CYCLE_BIT |
garfieldsg | 0:662207e34fba | 2819 | */ |
garfieldsg | 0:662207e34fba | 2820 | bool MPU6050::getWakeCycleEnabled() |
garfieldsg | 0:662207e34fba | 2821 | { |
garfieldsg | 0:662207e34fba | 2822 | i2Cdev.readBit(devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_CYCLE_BIT, buffer); |
garfieldsg | 0:662207e34fba | 2823 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 2824 | } |
garfieldsg | 0:662207e34fba | 2825 | /** Set wake cycle enabled status. |
garfieldsg | 0:662207e34fba | 2826 | * @param enabled New sleep mode enabled status |
garfieldsg | 0:662207e34fba | 2827 | * @see getWakeCycleEnabled() |
garfieldsg | 0:662207e34fba | 2828 | * @see MPU6050_RA_PWR_MGMT_1 |
garfieldsg | 0:662207e34fba | 2829 | * @see MPU6050_PWR1_CYCLE_BIT |
garfieldsg | 0:662207e34fba | 2830 | */ |
garfieldsg | 0:662207e34fba | 2831 | void MPU6050::setWakeCycleEnabled(bool enabled) |
garfieldsg | 0:662207e34fba | 2832 | { |
garfieldsg | 0:662207e34fba | 2833 | i2Cdev.writeBit(devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_CYCLE_BIT, enabled); |
garfieldsg | 0:662207e34fba | 2834 | } |
garfieldsg | 0:662207e34fba | 2835 | /** Get temperature sensor enabled status. |
garfieldsg | 0:662207e34fba | 2836 | * Control the usage of the internal temperature sensor. |
garfieldsg | 0:662207e34fba | 2837 | * |
garfieldsg | 0:662207e34fba | 2838 | * Note: this register stores the *disabled* value, but for consistency with the |
garfieldsg | 0:662207e34fba | 2839 | * rest of the code, the function is named and used with standard true/false |
garfieldsg | 0:662207e34fba | 2840 | * values to indicate whether the sensor is enabled or disabled, respectively. |
garfieldsg | 0:662207e34fba | 2841 | * |
garfieldsg | 0:662207e34fba | 2842 | * @return Current temperature sensor enabled status |
garfieldsg | 0:662207e34fba | 2843 | * @see MPU6050_RA_PWR_MGMT_1 |
garfieldsg | 0:662207e34fba | 2844 | * @see MPU6050_PWR1_TEMP_DIS_BIT |
garfieldsg | 0:662207e34fba | 2845 | */ |
garfieldsg | 0:662207e34fba | 2846 | bool MPU6050::getTempSensorEnabled() |
garfieldsg | 0:662207e34fba | 2847 | { |
garfieldsg | 0:662207e34fba | 2848 | i2Cdev.readBit(devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_TEMP_DIS_BIT, buffer); |
garfieldsg | 0:662207e34fba | 2849 | return buffer[0] == 0; // 1 is actually disabled here |
garfieldsg | 0:662207e34fba | 2850 | } |
garfieldsg | 0:662207e34fba | 2851 | /** Set temperature sensor enabled status. |
garfieldsg | 0:662207e34fba | 2852 | * Note: this register stores the *disabled* value, but for consistency with the |
garfieldsg | 0:662207e34fba | 2853 | * rest of the code, the function is named and used with standard true/false |
garfieldsg | 0:662207e34fba | 2854 | * values to indicate whether the sensor is enabled or disabled, respectively. |
garfieldsg | 0:662207e34fba | 2855 | * |
garfieldsg | 0:662207e34fba | 2856 | * @param enabled New temperature sensor enabled status |
garfieldsg | 0:662207e34fba | 2857 | * @see getTempSensorEnabled() |
garfieldsg | 0:662207e34fba | 2858 | * @see MPU6050_RA_PWR_MGMT_1 |
garfieldsg | 0:662207e34fba | 2859 | * @see MPU6050_PWR1_TEMP_DIS_BIT |
garfieldsg | 0:662207e34fba | 2860 | */ |
garfieldsg | 0:662207e34fba | 2861 | void MPU6050::setTempSensorEnabled(bool enabled) |
garfieldsg | 0:662207e34fba | 2862 | { |
garfieldsg | 0:662207e34fba | 2863 | // 1 is actually disabled here |
garfieldsg | 0:662207e34fba | 2864 | i2Cdev.writeBit(devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_TEMP_DIS_BIT, !enabled); |
garfieldsg | 0:662207e34fba | 2865 | } |
garfieldsg | 0:662207e34fba | 2866 | /** Get clock source setting. |
garfieldsg | 0:662207e34fba | 2867 | * @return Current clock source setting |
garfieldsg | 0:662207e34fba | 2868 | * @see MPU6050_RA_PWR_MGMT_1 |
garfieldsg | 0:662207e34fba | 2869 | * @see MPU6050_PWR1_CLKSEL_BIT |
garfieldsg | 0:662207e34fba | 2870 | * @see MPU6050_PWR1_CLKSEL_LENGTH |
garfieldsg | 0:662207e34fba | 2871 | */ |
garfieldsg | 0:662207e34fba | 2872 | uint8_t MPU6050::getClockSource() |
garfieldsg | 0:662207e34fba | 2873 | { |
garfieldsg | 0:662207e34fba | 2874 | i2Cdev.readBits(devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_CLKSEL_BIT, MPU6050_PWR1_CLKSEL_LENGTH, buffer); |
garfieldsg | 0:662207e34fba | 2875 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 2876 | } |
garfieldsg | 0:662207e34fba | 2877 | /** Set clock source setting. |
garfieldsg | 0:662207e34fba | 2878 | * An internal 8MHz oscillator, gyroscope based clock, or external sources can |
garfieldsg | 0:662207e34fba | 2879 | * be selected as the MPU-60X0 clock source. When the internal 8 MHz oscillator |
garfieldsg | 0:662207e34fba | 2880 | * or an external source is chosen as the clock source, the MPU-60X0 can operate |
garfieldsg | 0:662207e34fba | 2881 | * in low power modes with the gyroscopes disabled. |
garfieldsg | 0:662207e34fba | 2882 | * |
garfieldsg | 0:662207e34fba | 2883 | * Upon power up, the MPU-60X0 clock source defaults to the internal oscillator. |
garfieldsg | 0:662207e34fba | 2884 | * However, it is highly recommended that the device be configured to use one of |
garfieldsg | 0:662207e34fba | 2885 | * the gyroscopes (or an external clock source) as the clock reference for |
garfieldsg | 0:662207e34fba | 2886 | * improved stability. The clock source can be selected according to the following table: |
garfieldsg | 0:662207e34fba | 2887 | * |
garfieldsg | 0:662207e34fba | 2888 | * <pre> |
garfieldsg | 0:662207e34fba | 2889 | * CLK_SEL | Clock Source |
garfieldsg | 0:662207e34fba | 2890 | * --------+-------------------------------------- |
garfieldsg | 0:662207e34fba | 2891 | * 0 | Internal oscillator |
garfieldsg | 0:662207e34fba | 2892 | * 1 | PLL with X Gyro reference |
garfieldsg | 0:662207e34fba | 2893 | * 2 | PLL with Y Gyro reference |
garfieldsg | 0:662207e34fba | 2894 | * 3 | PLL with Z Gyro reference |
garfieldsg | 0:662207e34fba | 2895 | * 4 | PLL with external 32.768kHz reference |
garfieldsg | 0:662207e34fba | 2896 | * 5 | PLL with external 19.2MHz reference |
garfieldsg | 0:662207e34fba | 2897 | * 6 | Reserved |
garfieldsg | 0:662207e34fba | 2898 | * 7 | Stops the clock and keeps the timing generator in reset |
garfieldsg | 0:662207e34fba | 2899 | * </pre> |
garfieldsg | 0:662207e34fba | 2900 | * |
garfieldsg | 0:662207e34fba | 2901 | * @param source New clock source setting |
garfieldsg | 0:662207e34fba | 2902 | * @see getClockSource() |
garfieldsg | 0:662207e34fba | 2903 | * @see MPU6050_RA_PWR_MGMT_1 |
garfieldsg | 0:662207e34fba | 2904 | * @see MPU6050_PWR1_CLKSEL_BIT |
garfieldsg | 0:662207e34fba | 2905 | * @see MPU6050_PWR1_CLKSEL_LENGTH |
garfieldsg | 0:662207e34fba | 2906 | */ |
garfieldsg | 0:662207e34fba | 2907 | void MPU6050::setClockSource(uint8_t source) |
garfieldsg | 0:662207e34fba | 2908 | { |
garfieldsg | 0:662207e34fba | 2909 | i2Cdev.writeBits(devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_CLKSEL_BIT, MPU6050_PWR1_CLKSEL_LENGTH, source); |
garfieldsg | 0:662207e34fba | 2910 | } |
garfieldsg | 0:662207e34fba | 2911 | |
garfieldsg | 0:662207e34fba | 2912 | // PWR_MGMT_2 register |
garfieldsg | 0:662207e34fba | 2913 | |
garfieldsg | 0:662207e34fba | 2914 | /** Get wake frequency in Accel-Only Low Power Mode. |
garfieldsg | 0:662207e34fba | 2915 | * The MPU-60X0 can be put into Accerlerometer Only Low Power Mode by setting |
garfieldsg | 0:662207e34fba | 2916 | * PWRSEL to 1 in the Power Management 1 register (Register 107). In this mode, |
garfieldsg | 0:662207e34fba | 2917 | * the device will power off all devices except for the primary I2C interface, |
garfieldsg | 0:662207e34fba | 2918 | * waking only the accelerometer at fixed intervals to take a single |
garfieldsg | 0:662207e34fba | 2919 | * measurement. The frequency of wake-ups can be configured with LP_WAKE_CTRL |
garfieldsg | 0:662207e34fba | 2920 | * as shown below: |
garfieldsg | 0:662207e34fba | 2921 | * |
garfieldsg | 0:662207e34fba | 2922 | * <pre> |
garfieldsg | 0:662207e34fba | 2923 | * LP_WAKE_CTRL | Wake-up Frequency |
garfieldsg | 0:662207e34fba | 2924 | * -------------+------------------ |
garfieldsg | 0:662207e34fba | 2925 | * 0 | 1.25 Hz |
garfieldsg | 0:662207e34fba | 2926 | * 1 | 2.5 Hz |
garfieldsg | 0:662207e34fba | 2927 | * 2 | 5 Hz |
garfieldsg | 0:662207e34fba | 2928 | * 3 | 10 Hz |
garfieldsg | 0:662207e34fba | 2929 | * <pre> |
garfieldsg | 0:662207e34fba | 2930 | * |
garfieldsg | 0:662207e34fba | 2931 | * For further information regarding the MPU-60X0's power modes, please refer to |
garfieldsg | 0:662207e34fba | 2932 | * Register 107. |
garfieldsg | 0:662207e34fba | 2933 | * |
garfieldsg | 0:662207e34fba | 2934 | * @return Current wake frequency |
garfieldsg | 0:662207e34fba | 2935 | * @see MPU6050_RA_PWR_MGMT_2 |
garfieldsg | 0:662207e34fba | 2936 | */ |
garfieldsg | 0:662207e34fba | 2937 | uint8_t MPU6050::getWakeFrequency() |
garfieldsg | 0:662207e34fba | 2938 | { |
garfieldsg | 0:662207e34fba | 2939 | i2Cdev.readBits(devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_LP_WAKE_CTRL_BIT, MPU6050_PWR2_LP_WAKE_CTRL_LENGTH, buffer); |
garfieldsg | 0:662207e34fba | 2940 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 2941 | } |
garfieldsg | 0:662207e34fba | 2942 | /** Set wake frequency in Accel-Only Low Power Mode. |
garfieldsg | 0:662207e34fba | 2943 | * @param frequency New wake frequency |
garfieldsg | 0:662207e34fba | 2944 | * @see MPU6050_RA_PWR_MGMT_2 |
garfieldsg | 0:662207e34fba | 2945 | */ |
garfieldsg | 0:662207e34fba | 2946 | void MPU6050::setWakeFrequency(uint8_t frequency) |
garfieldsg | 0:662207e34fba | 2947 | { |
garfieldsg | 0:662207e34fba | 2948 | i2Cdev.writeBits(devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_LP_WAKE_CTRL_BIT, MPU6050_PWR2_LP_WAKE_CTRL_LENGTH, frequency); |
garfieldsg | 0:662207e34fba | 2949 | } |
garfieldsg | 0:662207e34fba | 2950 | |
garfieldsg | 0:662207e34fba | 2951 | /** Get X-axis accelerometer standby enabled status. |
garfieldsg | 0:662207e34fba | 2952 | * If enabled, the X-axis will not gather or report data (or use power). |
garfieldsg | 0:662207e34fba | 2953 | * @return Current X-axis standby enabled status |
garfieldsg | 0:662207e34fba | 2954 | * @see MPU6050_RA_PWR_MGMT_2 |
garfieldsg | 0:662207e34fba | 2955 | * @see MPU6050_PWR2_STBY_XA_BIT |
garfieldsg | 0:662207e34fba | 2956 | */ |
garfieldsg | 0:662207e34fba | 2957 | bool MPU6050::getStandbyXAccelEnabled() |
garfieldsg | 0:662207e34fba | 2958 | { |
garfieldsg | 0:662207e34fba | 2959 | i2Cdev.readBit(devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_XA_BIT, buffer); |
garfieldsg | 0:662207e34fba | 2960 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 2961 | } |
garfieldsg | 0:662207e34fba | 2962 | /** Set X-axis accelerometer standby enabled status. |
garfieldsg | 0:662207e34fba | 2963 | * @param New X-axis standby enabled status |
garfieldsg | 0:662207e34fba | 2964 | * @see getStandbyXAccelEnabled() |
garfieldsg | 0:662207e34fba | 2965 | * @see MPU6050_RA_PWR_MGMT_2 |
garfieldsg | 0:662207e34fba | 2966 | * @see MPU6050_PWR2_STBY_XA_BIT |
garfieldsg | 0:662207e34fba | 2967 | */ |
garfieldsg | 0:662207e34fba | 2968 | void MPU6050::setStandbyXAccelEnabled(bool enabled) |
garfieldsg | 0:662207e34fba | 2969 | { |
garfieldsg | 0:662207e34fba | 2970 | i2Cdev.writeBit(devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_XA_BIT, enabled); |
garfieldsg | 0:662207e34fba | 2971 | } |
garfieldsg | 0:662207e34fba | 2972 | /** Get Y-axis accelerometer standby enabled status. |
garfieldsg | 0:662207e34fba | 2973 | * If enabled, the Y-axis will not gather or report data (or use power). |
garfieldsg | 0:662207e34fba | 2974 | * @return Current Y-axis standby enabled status |
garfieldsg | 0:662207e34fba | 2975 | * @see MPU6050_RA_PWR_MGMT_2 |
garfieldsg | 0:662207e34fba | 2976 | * @see MPU6050_PWR2_STBY_YA_BIT |
garfieldsg | 0:662207e34fba | 2977 | */ |
garfieldsg | 0:662207e34fba | 2978 | bool MPU6050::getStandbyYAccelEnabled() |
garfieldsg | 0:662207e34fba | 2979 | { |
garfieldsg | 0:662207e34fba | 2980 | i2Cdev.readBit(devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_YA_BIT, buffer); |
garfieldsg | 0:662207e34fba | 2981 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 2982 | } |
garfieldsg | 0:662207e34fba | 2983 | /** Set Y-axis accelerometer standby enabled status. |
garfieldsg | 0:662207e34fba | 2984 | * @param New Y-axis standby enabled status |
garfieldsg | 0:662207e34fba | 2985 | * @see getStandbyYAccelEnabled() |
garfieldsg | 0:662207e34fba | 2986 | * @see MPU6050_RA_PWR_MGMT_2 |
garfieldsg | 0:662207e34fba | 2987 | * @see MPU6050_PWR2_STBY_YA_BIT |
garfieldsg | 0:662207e34fba | 2988 | */ |
garfieldsg | 0:662207e34fba | 2989 | void MPU6050::setStandbyYAccelEnabled(bool enabled) |
garfieldsg | 0:662207e34fba | 2990 | { |
garfieldsg | 0:662207e34fba | 2991 | i2Cdev.writeBit(devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_YA_BIT, enabled); |
garfieldsg | 0:662207e34fba | 2992 | } |
garfieldsg | 0:662207e34fba | 2993 | /** Get Z-axis accelerometer standby enabled status. |
garfieldsg | 0:662207e34fba | 2994 | * If enabled, the Z-axis will not gather or report data (or use power). |
garfieldsg | 0:662207e34fba | 2995 | * @return Current Z-axis standby enabled status |
garfieldsg | 0:662207e34fba | 2996 | * @see MPU6050_RA_PWR_MGMT_2 |
garfieldsg | 0:662207e34fba | 2997 | * @see MPU6050_PWR2_STBY_ZA_BIT |
garfieldsg | 0:662207e34fba | 2998 | */ |
garfieldsg | 0:662207e34fba | 2999 | bool MPU6050::getStandbyZAccelEnabled() |
garfieldsg | 0:662207e34fba | 3000 | { |
garfieldsg | 0:662207e34fba | 3001 | i2Cdev.readBit(devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_ZA_BIT, buffer); |
garfieldsg | 0:662207e34fba | 3002 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 3003 | } |
garfieldsg | 0:662207e34fba | 3004 | /** Set Z-axis accelerometer standby enabled status. |
garfieldsg | 0:662207e34fba | 3005 | * @param New Z-axis standby enabled status |
garfieldsg | 0:662207e34fba | 3006 | * @see getStandbyZAccelEnabled() |
garfieldsg | 0:662207e34fba | 3007 | * @see MPU6050_RA_PWR_MGMT_2 |
garfieldsg | 0:662207e34fba | 3008 | * @see MPU6050_PWR2_STBY_ZA_BIT |
garfieldsg | 0:662207e34fba | 3009 | */ |
garfieldsg | 0:662207e34fba | 3010 | void MPU6050::setStandbyZAccelEnabled(bool enabled) |
garfieldsg | 0:662207e34fba | 3011 | { |
garfieldsg | 0:662207e34fba | 3012 | i2Cdev.writeBit(devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_ZA_BIT, enabled); |
garfieldsg | 0:662207e34fba | 3013 | } |
garfieldsg | 0:662207e34fba | 3014 | /** Get X-axis gyroscope standby enabled status. |
garfieldsg | 0:662207e34fba | 3015 | * If enabled, the X-axis will not gather or report data (or use power). |
garfieldsg | 0:662207e34fba | 3016 | * @return Current X-axis standby enabled status |
garfieldsg | 0:662207e34fba | 3017 | * @see MPU6050_RA_PWR_MGMT_2 |
garfieldsg | 0:662207e34fba | 3018 | * @see MPU6050_PWR2_STBY_XG_BIT |
garfieldsg | 0:662207e34fba | 3019 | */ |
garfieldsg | 0:662207e34fba | 3020 | bool MPU6050::getStandbyXGyroEnabled() |
garfieldsg | 0:662207e34fba | 3021 | { |
garfieldsg | 0:662207e34fba | 3022 | i2Cdev.readBit(devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_XG_BIT, buffer); |
garfieldsg | 0:662207e34fba | 3023 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 3024 | } |
garfieldsg | 0:662207e34fba | 3025 | /** Set X-axis gyroscope standby enabled status. |
garfieldsg | 0:662207e34fba | 3026 | * @param New X-axis standby enabled status |
garfieldsg | 0:662207e34fba | 3027 | * @see getStandbyXGyroEnabled() |
garfieldsg | 0:662207e34fba | 3028 | * @see MPU6050_RA_PWR_MGMT_2 |
garfieldsg | 0:662207e34fba | 3029 | * @see MPU6050_PWR2_STBY_XG_BIT |
garfieldsg | 0:662207e34fba | 3030 | */ |
garfieldsg | 0:662207e34fba | 3031 | void MPU6050::setStandbyXGyroEnabled(bool enabled) |
garfieldsg | 0:662207e34fba | 3032 | { |
garfieldsg | 0:662207e34fba | 3033 | i2Cdev.writeBit(devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_XG_BIT, enabled); |
garfieldsg | 0:662207e34fba | 3034 | } |
garfieldsg | 0:662207e34fba | 3035 | /** Get Y-axis gyroscope standby enabled status. |
garfieldsg | 0:662207e34fba | 3036 | * If enabled, the Y-axis will not gather or report data (or use power). |
garfieldsg | 0:662207e34fba | 3037 | * @return Current Y-axis standby enabled status |
garfieldsg | 0:662207e34fba | 3038 | * @see MPU6050_RA_PWR_MGMT_2 |
garfieldsg | 0:662207e34fba | 3039 | * @see MPU6050_PWR2_STBY_YG_BIT |
garfieldsg | 0:662207e34fba | 3040 | */ |
garfieldsg | 0:662207e34fba | 3041 | bool MPU6050::getStandbyYGyroEnabled() |
garfieldsg | 0:662207e34fba | 3042 | { |
garfieldsg | 0:662207e34fba | 3043 | i2Cdev.readBit(devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_YG_BIT, buffer); |
garfieldsg | 0:662207e34fba | 3044 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 3045 | } |
garfieldsg | 0:662207e34fba | 3046 | /** Set Y-axis gyroscope standby enabled status. |
garfieldsg | 0:662207e34fba | 3047 | * @param New Y-axis standby enabled status |
garfieldsg | 0:662207e34fba | 3048 | * @see getStandbyYGyroEnabled() |
garfieldsg | 0:662207e34fba | 3049 | * @see MPU6050_RA_PWR_MGMT_2 |
garfieldsg | 0:662207e34fba | 3050 | * @see MPU6050_PWR2_STBY_YG_BIT |
garfieldsg | 0:662207e34fba | 3051 | */ |
garfieldsg | 0:662207e34fba | 3052 | void MPU6050::setStandbyYGyroEnabled(bool enabled) |
garfieldsg | 0:662207e34fba | 3053 | { |
garfieldsg | 0:662207e34fba | 3054 | i2Cdev.writeBit(devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_YG_BIT, enabled); |
garfieldsg | 0:662207e34fba | 3055 | } |
garfieldsg | 0:662207e34fba | 3056 | /** Get Z-axis gyroscope standby enabled status. |
garfieldsg | 0:662207e34fba | 3057 | * If enabled, the Z-axis will not gather or report data (or use power). |
garfieldsg | 0:662207e34fba | 3058 | * @return Current Z-axis standby enabled status |
garfieldsg | 0:662207e34fba | 3059 | * @see MPU6050_RA_PWR_MGMT_2 |
garfieldsg | 0:662207e34fba | 3060 | * @see MPU6050_PWR2_STBY_ZG_BIT |
garfieldsg | 0:662207e34fba | 3061 | */ |
garfieldsg | 0:662207e34fba | 3062 | bool MPU6050::getStandbyZGyroEnabled() |
garfieldsg | 0:662207e34fba | 3063 | { |
garfieldsg | 0:662207e34fba | 3064 | i2Cdev.readBit(devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_ZG_BIT, buffer); |
garfieldsg | 0:662207e34fba | 3065 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 3066 | } |
garfieldsg | 0:662207e34fba | 3067 | /** Set Z-axis gyroscope standby enabled status. |
garfieldsg | 0:662207e34fba | 3068 | * @param New Z-axis standby enabled status |
garfieldsg | 0:662207e34fba | 3069 | * @see getStandbyZGyroEnabled() |
garfieldsg | 0:662207e34fba | 3070 | * @see MPU6050_RA_PWR_MGMT_2 |
garfieldsg | 0:662207e34fba | 3071 | * @see MPU6050_PWR2_STBY_ZG_BIT |
garfieldsg | 0:662207e34fba | 3072 | */ |
garfieldsg | 0:662207e34fba | 3073 | void MPU6050::setStandbyZGyroEnabled(bool enabled) |
garfieldsg | 0:662207e34fba | 3074 | { |
garfieldsg | 0:662207e34fba | 3075 | i2Cdev.writeBit(devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_ZG_BIT, enabled); |
garfieldsg | 0:662207e34fba | 3076 | } |
garfieldsg | 0:662207e34fba | 3077 | |
garfieldsg | 0:662207e34fba | 3078 | // FIFO_COUNT* registers |
garfieldsg | 0:662207e34fba | 3079 | |
garfieldsg | 0:662207e34fba | 3080 | /** Get current FIFO buffer size. |
garfieldsg | 0:662207e34fba | 3081 | * This value indicates the number of bytes stored in the FIFO buffer. This |
garfieldsg | 0:662207e34fba | 3082 | * number is in turn the number of bytes that can be read from the FIFO buffer |
garfieldsg | 0:662207e34fba | 3083 | * and it is directly proportional to the number of samples available given the |
garfieldsg | 0:662207e34fba | 3084 | * set of sensor data bound to be stored in the FIFO (register 35 and 36). |
garfieldsg | 0:662207e34fba | 3085 | * @return Current FIFO buffer size |
garfieldsg | 0:662207e34fba | 3086 | */ |
garfieldsg | 0:662207e34fba | 3087 | uint16_t MPU6050::getFIFOCount() |
garfieldsg | 0:662207e34fba | 3088 | { |
garfieldsg | 0:662207e34fba | 3089 | i2Cdev.readBytes(devAddr, MPU6050_RA_FIFO_COUNTH, 2, buffer); |
garfieldsg | 0:662207e34fba | 3090 | return (((uint16_t)buffer[0]) << 8) | buffer[1]; |
garfieldsg | 0:662207e34fba | 3091 | } |
garfieldsg | 0:662207e34fba | 3092 | |
garfieldsg | 0:662207e34fba | 3093 | // FIFO_R_W register |
garfieldsg | 0:662207e34fba | 3094 | |
garfieldsg | 0:662207e34fba | 3095 | /** Get byte from FIFO buffer. |
garfieldsg | 0:662207e34fba | 3096 | * This register is used to read and write data from the FIFO buffer. Data is |
garfieldsg | 0:662207e34fba | 3097 | * written to the FIFO in order of register number (from lowest to highest). If |
garfieldsg | 0:662207e34fba | 3098 | * all the FIFO enable flags (see below) are enabled and all External Sensor |
garfieldsg | 0:662207e34fba | 3099 | * Data registers (Registers 73 to 96) are associated with a Slave device, the |
garfieldsg | 0:662207e34fba | 3100 | * contents of registers 59 through 96 will be written in order at the Sample |
garfieldsg | 0:662207e34fba | 3101 | * Rate. |
garfieldsg | 0:662207e34fba | 3102 | * |
garfieldsg | 0:662207e34fba | 3103 | * The contents of the sensor data registers (Registers 59 to 96) are written |
garfieldsg | 0:662207e34fba | 3104 | * into the FIFO buffer when their corresponding FIFO enable flags are set to 1 |
garfieldsg | 0:662207e34fba | 3105 | * in FIFO_EN (Register 35). An additional flag for the sensor data registers |
garfieldsg | 0:662207e34fba | 3106 | * associated with I2C Slave 3 can be found in I2C_MST_CTRL (Register 36). |
garfieldsg | 0:662207e34fba | 3107 | * |
garfieldsg | 0:662207e34fba | 3108 | * If the FIFO buffer has overflowed, the status bit FIFO_OFLOW_INT is |
garfieldsg | 0:662207e34fba | 3109 | * automatically set to 1. This bit is located in INT_STATUS (Register 58). |
garfieldsg | 0:662207e34fba | 3110 | * When the FIFO buffer has overflowed, the oldest data will be lost and new |
garfieldsg | 0:662207e34fba | 3111 | * data will be written to the FIFO. |
garfieldsg | 0:662207e34fba | 3112 | * |
garfieldsg | 0:662207e34fba | 3113 | * If the FIFO buffer is empty, reading this register will return the last byte |
garfieldsg | 0:662207e34fba | 3114 | * that was previously read from the FIFO until new data is available. The user |
garfieldsg | 0:662207e34fba | 3115 | * should check FIFO_COUNT to ensure that the FIFO buffer is not read when |
garfieldsg | 0:662207e34fba | 3116 | * empty. |
garfieldsg | 0:662207e34fba | 3117 | * |
garfieldsg | 0:662207e34fba | 3118 | * @return Byte from FIFO buffer |
garfieldsg | 0:662207e34fba | 3119 | */ |
garfieldsg | 0:662207e34fba | 3120 | uint8_t MPU6050::getFIFOByte() |
garfieldsg | 0:662207e34fba | 3121 | { |
garfieldsg | 0:662207e34fba | 3122 | i2Cdev.readByte(devAddr, MPU6050_RA_FIFO_R_W, buffer); |
garfieldsg | 0:662207e34fba | 3123 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 3124 | } |
garfieldsg | 0:662207e34fba | 3125 | void MPU6050::getFIFOBytes(uint8_t *data, uint8_t length) |
garfieldsg | 0:662207e34fba | 3126 | { |
garfieldsg | 0:662207e34fba | 3127 | i2Cdev.readBytes(devAddr, MPU6050_RA_FIFO_R_W, length, data); |
garfieldsg | 0:662207e34fba | 3128 | } |
garfieldsg | 0:662207e34fba | 3129 | /** Write byte to FIFO buffer. |
garfieldsg | 0:662207e34fba | 3130 | * @see getFIFOByte() |
garfieldsg | 0:662207e34fba | 3131 | * @see MPU6050_RA_FIFO_R_W |
garfieldsg | 0:662207e34fba | 3132 | */ |
garfieldsg | 0:662207e34fba | 3133 | void MPU6050::setFIFOByte(uint8_t data) |
garfieldsg | 0:662207e34fba | 3134 | { |
garfieldsg | 0:662207e34fba | 3135 | i2Cdev.writeByte(devAddr, MPU6050_RA_FIFO_R_W, data); |
garfieldsg | 0:662207e34fba | 3136 | } |
garfieldsg | 0:662207e34fba | 3137 | |
garfieldsg | 0:662207e34fba | 3138 | // WHO_AM_I register |
garfieldsg | 0:662207e34fba | 3139 | |
garfieldsg | 0:662207e34fba | 3140 | /** Get Device ID. |
garfieldsg | 0:662207e34fba | 3141 | * This register is used to verify the identity of the device (0b110100, 0x34). |
garfieldsg | 0:662207e34fba | 3142 | * @return Device ID (6 bits only! should be 0x34) |
garfieldsg | 0:662207e34fba | 3143 | * @see MPU6050_RA_WHO_AM_I |
garfieldsg | 0:662207e34fba | 3144 | * @see MPU6050_WHO_AM_I_BIT |
garfieldsg | 0:662207e34fba | 3145 | * @see MPU6050_WHO_AM_I_LENGTH |
garfieldsg | 0:662207e34fba | 3146 | */ |
garfieldsg | 0:662207e34fba | 3147 | uint8_t MPU6050::getDeviceID() |
garfieldsg | 0:662207e34fba | 3148 | { |
garfieldsg | 0:662207e34fba | 3149 | i2Cdev.readBits(devAddr, MPU6050_RA_WHO_AM_I, MPU6050_WHO_AM_I_BIT, MPU6050_WHO_AM_I_LENGTH, buffer); |
garfieldsg | 0:662207e34fba | 3150 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 3151 | } |
garfieldsg | 0:662207e34fba | 3152 | /** Set Device ID. |
garfieldsg | 0:662207e34fba | 3153 | * Write a new ID into the WHO_AM_I register (no idea why this should ever be |
garfieldsg | 0:662207e34fba | 3154 | * necessary though). |
garfieldsg | 0:662207e34fba | 3155 | * @param id New device ID to set. |
garfieldsg | 0:662207e34fba | 3156 | * @see getDeviceID() |
garfieldsg | 0:662207e34fba | 3157 | * @see MPU6050_RA_WHO_AM_I |
garfieldsg | 0:662207e34fba | 3158 | * @see MPU6050_WHO_AM_I_BIT |
garfieldsg | 0:662207e34fba | 3159 | * @see MPU6050_WHO_AM_I_LENGTH |
garfieldsg | 0:662207e34fba | 3160 | */ |
garfieldsg | 0:662207e34fba | 3161 | void MPU6050::setDeviceID(uint8_t id) |
garfieldsg | 0:662207e34fba | 3162 | { |
garfieldsg | 0:662207e34fba | 3163 | i2Cdev.writeBits(devAddr, MPU6050_RA_WHO_AM_I, MPU6050_WHO_AM_I_BIT, MPU6050_WHO_AM_I_LENGTH, id); |
garfieldsg | 0:662207e34fba | 3164 | } |
garfieldsg | 0:662207e34fba | 3165 | |
garfieldsg | 0:662207e34fba | 3166 | // ======== UNDOCUMENTED/DMP REGISTERS/METHODS ======== |
garfieldsg | 0:662207e34fba | 3167 | |
garfieldsg | 0:662207e34fba | 3168 | // XG_OFFS_TC register |
garfieldsg | 0:662207e34fba | 3169 | |
garfieldsg | 0:662207e34fba | 3170 | uint8_t MPU6050::getOTPBankValid() |
garfieldsg | 0:662207e34fba | 3171 | { |
garfieldsg | 0:662207e34fba | 3172 | i2Cdev.readBit(devAddr, MPU6050_RA_XG_OFFS_TC, MPU6050_TC_OTP_BNK_VLD_BIT, buffer); |
garfieldsg | 0:662207e34fba | 3173 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 3174 | } |
garfieldsg | 0:662207e34fba | 3175 | void MPU6050::setOTPBankValid(bool enabled) |
garfieldsg | 0:662207e34fba | 3176 | { |
garfieldsg | 0:662207e34fba | 3177 | i2Cdev.writeBit(devAddr, MPU6050_RA_XG_OFFS_TC, MPU6050_TC_OTP_BNK_VLD_BIT, enabled); |
garfieldsg | 0:662207e34fba | 3178 | } |
garfieldsg | 0:662207e34fba | 3179 | int8_t MPU6050::getXGyroOffset() |
garfieldsg | 0:662207e34fba | 3180 | { |
garfieldsg | 0:662207e34fba | 3181 | i2Cdev.readBits(devAddr, MPU6050_RA_XG_OFFS_TC, MPU6050_TC_OFFSET_BIT, MPU6050_TC_OFFSET_LENGTH, buffer); |
garfieldsg | 0:662207e34fba | 3182 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 3183 | } |
garfieldsg | 0:662207e34fba | 3184 | void MPU6050::setXGyroOffset(int8_t offset) |
garfieldsg | 0:662207e34fba | 3185 | { |
garfieldsg | 0:662207e34fba | 3186 | i2Cdev.writeBits(devAddr, MPU6050_RA_XG_OFFS_TC, MPU6050_TC_OFFSET_BIT, MPU6050_TC_OFFSET_LENGTH, offset); |
garfieldsg | 0:662207e34fba | 3187 | } |
garfieldsg | 0:662207e34fba | 3188 | |
garfieldsg | 0:662207e34fba | 3189 | // YG_OFFS_TC register |
garfieldsg | 0:662207e34fba | 3190 | |
garfieldsg | 0:662207e34fba | 3191 | int8_t MPU6050::getYGyroOffset() |
garfieldsg | 0:662207e34fba | 3192 | { |
garfieldsg | 0:662207e34fba | 3193 | i2Cdev.readBits(devAddr, MPU6050_RA_YG_OFFS_TC, MPU6050_TC_OFFSET_BIT, MPU6050_TC_OFFSET_LENGTH, buffer); |
garfieldsg | 0:662207e34fba | 3194 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 3195 | } |
garfieldsg | 0:662207e34fba | 3196 | void MPU6050::setYGyroOffset(int8_t offset) |
garfieldsg | 0:662207e34fba | 3197 | { |
garfieldsg | 0:662207e34fba | 3198 | i2Cdev.writeBits(devAddr, MPU6050_RA_YG_OFFS_TC, MPU6050_TC_OFFSET_BIT, MPU6050_TC_OFFSET_LENGTH, offset); |
garfieldsg | 0:662207e34fba | 3199 | } |
garfieldsg | 0:662207e34fba | 3200 | |
garfieldsg | 0:662207e34fba | 3201 | // ZG_OFFS_TC register |
garfieldsg | 0:662207e34fba | 3202 | |
garfieldsg | 0:662207e34fba | 3203 | int8_t MPU6050::getZGyroOffset() |
garfieldsg | 0:662207e34fba | 3204 | { |
garfieldsg | 0:662207e34fba | 3205 | i2Cdev.readBits(devAddr, MPU6050_RA_ZG_OFFS_TC, MPU6050_TC_OFFSET_BIT, MPU6050_TC_OFFSET_LENGTH, buffer); |
garfieldsg | 0:662207e34fba | 3206 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 3207 | } |
garfieldsg | 0:662207e34fba | 3208 | void MPU6050::setZGyroOffset(int8_t offset) |
garfieldsg | 0:662207e34fba | 3209 | { |
garfieldsg | 0:662207e34fba | 3210 | i2Cdev.writeBits(devAddr, MPU6050_RA_ZG_OFFS_TC, MPU6050_TC_OFFSET_BIT, MPU6050_TC_OFFSET_LENGTH, offset); |
garfieldsg | 0:662207e34fba | 3211 | } |
garfieldsg | 0:662207e34fba | 3212 | |
garfieldsg | 0:662207e34fba | 3213 | // X_FINE_GAIN register |
garfieldsg | 0:662207e34fba | 3214 | |
garfieldsg | 0:662207e34fba | 3215 | int8_t MPU6050::getXFineGain() |
garfieldsg | 0:662207e34fba | 3216 | { |
garfieldsg | 0:662207e34fba | 3217 | i2Cdev.readByte(devAddr, MPU6050_RA_X_FINE_GAIN, buffer); |
garfieldsg | 0:662207e34fba | 3218 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 3219 | } |
garfieldsg | 0:662207e34fba | 3220 | void MPU6050::setXFineGain(int8_t gain) |
garfieldsg | 0:662207e34fba | 3221 | { |
garfieldsg | 0:662207e34fba | 3222 | i2Cdev.writeByte(devAddr, MPU6050_RA_X_FINE_GAIN, gain); |
garfieldsg | 0:662207e34fba | 3223 | } |
garfieldsg | 0:662207e34fba | 3224 | |
garfieldsg | 0:662207e34fba | 3225 | // Y_FINE_GAIN register |
garfieldsg | 0:662207e34fba | 3226 | |
garfieldsg | 0:662207e34fba | 3227 | int8_t MPU6050::getYFineGain() |
garfieldsg | 0:662207e34fba | 3228 | { |
garfieldsg | 0:662207e34fba | 3229 | i2Cdev.readByte(devAddr, MPU6050_RA_Y_FINE_GAIN, buffer); |
garfieldsg | 0:662207e34fba | 3230 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 3231 | } |
garfieldsg | 0:662207e34fba | 3232 | void MPU6050::setYFineGain(int8_t gain) |
garfieldsg | 0:662207e34fba | 3233 | { |
garfieldsg | 0:662207e34fba | 3234 | i2Cdev.writeByte(devAddr, MPU6050_RA_Y_FINE_GAIN, gain); |
garfieldsg | 0:662207e34fba | 3235 | } |
garfieldsg | 0:662207e34fba | 3236 | |
garfieldsg | 0:662207e34fba | 3237 | // Z_FINE_GAIN register |
garfieldsg | 0:662207e34fba | 3238 | |
garfieldsg | 0:662207e34fba | 3239 | int8_t MPU6050::getZFineGain() |
garfieldsg | 0:662207e34fba | 3240 | { |
garfieldsg | 0:662207e34fba | 3241 | i2Cdev.readByte(devAddr, MPU6050_RA_Z_FINE_GAIN, buffer); |
garfieldsg | 0:662207e34fba | 3242 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 3243 | } |
garfieldsg | 0:662207e34fba | 3244 | void MPU6050::setZFineGain(int8_t gain) |
garfieldsg | 0:662207e34fba | 3245 | { |
garfieldsg | 0:662207e34fba | 3246 | i2Cdev.writeByte(devAddr, MPU6050_RA_Z_FINE_GAIN, gain); |
garfieldsg | 0:662207e34fba | 3247 | } |
garfieldsg | 0:662207e34fba | 3248 | |
garfieldsg | 0:662207e34fba | 3249 | // XA_OFFS_* registers |
garfieldsg | 0:662207e34fba | 3250 | |
garfieldsg | 0:662207e34fba | 3251 | int16_t MPU6050::getXAccelOffset() |
garfieldsg | 0:662207e34fba | 3252 | { |
garfieldsg | 0:662207e34fba | 3253 | i2Cdev.readBytes(devAddr, MPU6050_RA_XA_OFFS_H, 2, buffer); |
garfieldsg | 0:662207e34fba | 3254 | return (((int16_t)buffer[0]) << 8) | buffer[1]; |
garfieldsg | 0:662207e34fba | 3255 | } |
garfieldsg | 0:662207e34fba | 3256 | void MPU6050::setXAccelOffset(int16_t offset) |
garfieldsg | 0:662207e34fba | 3257 | { |
garfieldsg | 0:662207e34fba | 3258 | i2Cdev.writeWord(devAddr, MPU6050_RA_XA_OFFS_H, offset); |
garfieldsg | 0:662207e34fba | 3259 | } |
garfieldsg | 0:662207e34fba | 3260 | |
garfieldsg | 0:662207e34fba | 3261 | // YA_OFFS_* register |
garfieldsg | 0:662207e34fba | 3262 | |
garfieldsg | 0:662207e34fba | 3263 | int16_t MPU6050::getYAccelOffset() |
garfieldsg | 0:662207e34fba | 3264 | { |
garfieldsg | 0:662207e34fba | 3265 | i2Cdev.readBytes(devAddr, MPU6050_RA_YA_OFFS_H, 2, buffer); |
garfieldsg | 0:662207e34fba | 3266 | return (((int16_t)buffer[0]) << 8) | buffer[1]; |
garfieldsg | 0:662207e34fba | 3267 | } |
garfieldsg | 0:662207e34fba | 3268 | void MPU6050::setYAccelOffset(int16_t offset) |
garfieldsg | 0:662207e34fba | 3269 | { |
garfieldsg | 0:662207e34fba | 3270 | i2Cdev.writeWord(devAddr, MPU6050_RA_YA_OFFS_H, offset); |
garfieldsg | 0:662207e34fba | 3271 | } |
garfieldsg | 0:662207e34fba | 3272 | |
garfieldsg | 0:662207e34fba | 3273 | // ZA_OFFS_* register |
garfieldsg | 0:662207e34fba | 3274 | |
garfieldsg | 0:662207e34fba | 3275 | int16_t MPU6050::getZAccelOffset() |
garfieldsg | 0:662207e34fba | 3276 | { |
garfieldsg | 0:662207e34fba | 3277 | i2Cdev.readBytes(devAddr, MPU6050_RA_ZA_OFFS_H, 2, buffer); |
garfieldsg | 0:662207e34fba | 3278 | return (((int16_t)buffer[0]) << 8) | buffer[1]; |
garfieldsg | 0:662207e34fba | 3279 | } |
garfieldsg | 0:662207e34fba | 3280 | void MPU6050::setZAccelOffset(int16_t offset) |
garfieldsg | 0:662207e34fba | 3281 | { |
garfieldsg | 0:662207e34fba | 3282 | i2Cdev.writeWord(devAddr, MPU6050_RA_ZA_OFFS_H, offset); |
garfieldsg | 0:662207e34fba | 3283 | } |
garfieldsg | 0:662207e34fba | 3284 | |
garfieldsg | 0:662207e34fba | 3285 | // XG_OFFS_USR* registers |
garfieldsg | 0:662207e34fba | 3286 | |
garfieldsg | 0:662207e34fba | 3287 | int16_t MPU6050::getXGyroOffsetUser() |
garfieldsg | 0:662207e34fba | 3288 | { |
garfieldsg | 0:662207e34fba | 3289 | i2Cdev.readBytes(devAddr, MPU6050_RA_XG_OFFS_USRH, 2, buffer); |
garfieldsg | 0:662207e34fba | 3290 | return (((int16_t)buffer[0]) << 8) | buffer[1]; |
garfieldsg | 0:662207e34fba | 3291 | } |
garfieldsg | 0:662207e34fba | 3292 | void MPU6050::setXGyroOffsetUser(int16_t offset) |
garfieldsg | 0:662207e34fba | 3293 | { |
garfieldsg | 0:662207e34fba | 3294 | i2Cdev.writeWord(devAddr, MPU6050_RA_XG_OFFS_USRH, offset); |
garfieldsg | 0:662207e34fba | 3295 | } |
garfieldsg | 0:662207e34fba | 3296 | |
garfieldsg | 0:662207e34fba | 3297 | // YG_OFFS_USR* register |
garfieldsg | 0:662207e34fba | 3298 | |
garfieldsg | 0:662207e34fba | 3299 | int16_t MPU6050::getYGyroOffsetUser() |
garfieldsg | 0:662207e34fba | 3300 | { |
garfieldsg | 0:662207e34fba | 3301 | i2Cdev.readBytes(devAddr, MPU6050_RA_YG_OFFS_USRH, 2, buffer); |
garfieldsg | 0:662207e34fba | 3302 | return (((int16_t)buffer[0]) << 8) | buffer[1]; |
garfieldsg | 0:662207e34fba | 3303 | } |
garfieldsg | 0:662207e34fba | 3304 | void MPU6050::setYGyroOffsetUser(int16_t offset) |
garfieldsg | 0:662207e34fba | 3305 | { |
garfieldsg | 0:662207e34fba | 3306 | i2Cdev.writeWord(devAddr, MPU6050_RA_YG_OFFS_USRH, offset); |
garfieldsg | 0:662207e34fba | 3307 | } |
garfieldsg | 0:662207e34fba | 3308 | |
garfieldsg | 0:662207e34fba | 3309 | // ZG_OFFS_USR* register |
garfieldsg | 0:662207e34fba | 3310 | |
garfieldsg | 0:662207e34fba | 3311 | int16_t MPU6050::getZGyroOffsetUser() |
garfieldsg | 0:662207e34fba | 3312 | { |
garfieldsg | 0:662207e34fba | 3313 | i2Cdev.readBytes(devAddr, MPU6050_RA_ZG_OFFS_USRH, 2, buffer); |
garfieldsg | 0:662207e34fba | 3314 | return (((int16_t)buffer[0]) << 8) | buffer[1]; |
garfieldsg | 0:662207e34fba | 3315 | } |
garfieldsg | 0:662207e34fba | 3316 | void MPU6050::setZGyroOffsetUser(int16_t offset) |
garfieldsg | 0:662207e34fba | 3317 | { |
garfieldsg | 0:662207e34fba | 3318 | i2Cdev.writeWord(devAddr, MPU6050_RA_ZG_OFFS_USRH, offset); |
garfieldsg | 0:662207e34fba | 3319 | } |
garfieldsg | 0:662207e34fba | 3320 | |
garfieldsg | 0:662207e34fba | 3321 | // INT_ENABLE register (DMP functions) |
garfieldsg | 0:662207e34fba | 3322 | |
garfieldsg | 0:662207e34fba | 3323 | bool MPU6050::getIntPLLReadyEnabled() |
garfieldsg | 0:662207e34fba | 3324 | { |
garfieldsg | 0:662207e34fba | 3325 | i2Cdev.readBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_PLL_RDY_INT_BIT, buffer); |
garfieldsg | 0:662207e34fba | 3326 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 3327 | } |
garfieldsg | 0:662207e34fba | 3328 | void MPU6050::setIntPLLReadyEnabled(bool enabled) |
garfieldsg | 0:662207e34fba | 3329 | { |
garfieldsg | 0:662207e34fba | 3330 | i2Cdev.writeBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_PLL_RDY_INT_BIT, enabled); |
garfieldsg | 0:662207e34fba | 3331 | } |
garfieldsg | 0:662207e34fba | 3332 | bool MPU6050::getIntDMPEnabled() |
garfieldsg | 0:662207e34fba | 3333 | { |
garfieldsg | 0:662207e34fba | 3334 | i2Cdev.readBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_DMP_INT_BIT, buffer); |
garfieldsg | 0:662207e34fba | 3335 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 3336 | } |
garfieldsg | 0:662207e34fba | 3337 | void MPU6050::setIntDMPEnabled(bool enabled) |
garfieldsg | 0:662207e34fba | 3338 | { |
garfieldsg | 0:662207e34fba | 3339 | i2Cdev.writeBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_DMP_INT_BIT, enabled); |
garfieldsg | 0:662207e34fba | 3340 | } |
garfieldsg | 0:662207e34fba | 3341 | |
garfieldsg | 0:662207e34fba | 3342 | // DMP_INT_STATUS |
garfieldsg | 0:662207e34fba | 3343 | |
garfieldsg | 0:662207e34fba | 3344 | bool MPU6050::getDMPInt5Status() |
garfieldsg | 0:662207e34fba | 3345 | { |
garfieldsg | 0:662207e34fba | 3346 | i2Cdev.readBit(devAddr, MPU6050_RA_DMP_INT_STATUS, MPU6050_DMPINT_5_BIT, buffer); |
garfieldsg | 0:662207e34fba | 3347 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 3348 | } |
garfieldsg | 0:662207e34fba | 3349 | bool MPU6050::getDMPInt4Status() |
garfieldsg | 0:662207e34fba | 3350 | { |
garfieldsg | 0:662207e34fba | 3351 | i2Cdev.readBit(devAddr, MPU6050_RA_DMP_INT_STATUS, MPU6050_DMPINT_4_BIT, buffer); |
garfieldsg | 0:662207e34fba | 3352 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 3353 | } |
garfieldsg | 0:662207e34fba | 3354 | bool MPU6050::getDMPInt3Status() |
garfieldsg | 0:662207e34fba | 3355 | { |
garfieldsg | 0:662207e34fba | 3356 | i2Cdev.readBit(devAddr, MPU6050_RA_DMP_INT_STATUS, MPU6050_DMPINT_3_BIT, buffer); |
garfieldsg | 0:662207e34fba | 3357 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 3358 | } |
garfieldsg | 0:662207e34fba | 3359 | bool MPU6050::getDMPInt2Status() |
garfieldsg | 0:662207e34fba | 3360 | { |
garfieldsg | 0:662207e34fba | 3361 | i2Cdev.readBit(devAddr, MPU6050_RA_DMP_INT_STATUS, MPU6050_DMPINT_2_BIT, buffer); |
garfieldsg | 0:662207e34fba | 3362 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 3363 | } |
garfieldsg | 0:662207e34fba | 3364 | bool MPU6050::getDMPInt1Status() |
garfieldsg | 0:662207e34fba | 3365 | { |
garfieldsg | 0:662207e34fba | 3366 | i2Cdev.readBit(devAddr, MPU6050_RA_DMP_INT_STATUS, MPU6050_DMPINT_1_BIT, buffer); |
garfieldsg | 0:662207e34fba | 3367 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 3368 | } |
garfieldsg | 0:662207e34fba | 3369 | bool MPU6050::getDMPInt0Status() |
garfieldsg | 0:662207e34fba | 3370 | { |
garfieldsg | 0:662207e34fba | 3371 | i2Cdev.readBit(devAddr, MPU6050_RA_DMP_INT_STATUS, MPU6050_DMPINT_0_BIT, buffer); |
garfieldsg | 0:662207e34fba | 3372 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 3373 | } |
garfieldsg | 0:662207e34fba | 3374 | |
garfieldsg | 0:662207e34fba | 3375 | // INT_STATUS register (DMP functions) |
garfieldsg | 0:662207e34fba | 3376 | |
garfieldsg | 0:662207e34fba | 3377 | bool MPU6050::getIntPLLReadyStatus() |
garfieldsg | 0:662207e34fba | 3378 | { |
garfieldsg | 0:662207e34fba | 3379 | i2Cdev.readBit(devAddr, MPU6050_RA_INT_STATUS, MPU6050_INTERRUPT_PLL_RDY_INT_BIT, buffer); |
garfieldsg | 0:662207e34fba | 3380 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 3381 | } |
garfieldsg | 0:662207e34fba | 3382 | bool MPU6050::getIntDMPStatus() |
garfieldsg | 0:662207e34fba | 3383 | { |
garfieldsg | 0:662207e34fba | 3384 | i2Cdev.readBit(devAddr, MPU6050_RA_INT_STATUS, MPU6050_INTERRUPT_DMP_INT_BIT, buffer); |
garfieldsg | 0:662207e34fba | 3385 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 3386 | } |
garfieldsg | 0:662207e34fba | 3387 | |
garfieldsg | 0:662207e34fba | 3388 | // USER_CTRL register (DMP functions) |
garfieldsg | 0:662207e34fba | 3389 | |
garfieldsg | 0:662207e34fba | 3390 | bool MPU6050::getDMPEnabled() |
garfieldsg | 0:662207e34fba | 3391 | { |
garfieldsg | 0:662207e34fba | 3392 | i2Cdev.readBit(devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_DMP_EN_BIT, buffer); |
garfieldsg | 0:662207e34fba | 3393 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 3394 | } |
garfieldsg | 0:662207e34fba | 3395 | void MPU6050::setDMPEnabled(bool enabled) |
garfieldsg | 0:662207e34fba | 3396 | { |
garfieldsg | 0:662207e34fba | 3397 | i2Cdev.writeBit(devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_DMP_EN_BIT, enabled); |
garfieldsg | 0:662207e34fba | 3398 | } |
garfieldsg | 0:662207e34fba | 3399 | void MPU6050::resetDMP() |
garfieldsg | 0:662207e34fba | 3400 | { |
garfieldsg | 0:662207e34fba | 3401 | i2Cdev.writeBit(devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_DMP_RESET_BIT, true); |
garfieldsg | 0:662207e34fba | 3402 | } |
garfieldsg | 0:662207e34fba | 3403 | |
garfieldsg | 0:662207e34fba | 3404 | // BANK_SEL register |
garfieldsg | 0:662207e34fba | 3405 | |
garfieldsg | 0:662207e34fba | 3406 | void MPU6050::setMemoryBank(uint8_t bank, bool prefetchEnabled, bool userBank) |
garfieldsg | 0:662207e34fba | 3407 | { |
garfieldsg | 0:662207e34fba | 3408 | bank &= 0x1F; |
garfieldsg | 0:662207e34fba | 3409 | if (userBank) bank |= 0x20; |
garfieldsg | 0:662207e34fba | 3410 | if (prefetchEnabled) bank |= 0x40; |
garfieldsg | 0:662207e34fba | 3411 | i2Cdev.writeByte(devAddr, MPU6050_RA_BANK_SEL, bank); |
garfieldsg | 0:662207e34fba | 3412 | } |
OsmanKameric | 2:e2081d9de7af | 3413 | //Read certain register |
OsmanKameric | 2:e2081d9de7af | 3414 | uint8_t MPU6050::readThisByte(uint8_t address) |
OsmanKameric | 2:e2081d9de7af | 3415 | { |
OsmanKameric | 2:e2081d9de7af | 3416 | i2Cdev.readByte(devAddr, address, buffer); |
OsmanKameric | 2:e2081d9de7af | 3417 | return buffer[0]; |
OsmanKameric | 2:e2081d9de7af | 3418 | } |
garfieldsg | 0:662207e34fba | 3419 | // MEM_START_ADDR register |
garfieldsg | 0:662207e34fba | 3420 | |
garfieldsg | 0:662207e34fba | 3421 | void MPU6050::setMemoryStartAddress(uint8_t address) |
garfieldsg | 0:662207e34fba | 3422 | { |
garfieldsg | 0:662207e34fba | 3423 | i2Cdev.writeByte(devAddr, MPU6050_RA_MEM_START_ADDR, address); |
garfieldsg | 0:662207e34fba | 3424 | } |
garfieldsg | 0:662207e34fba | 3425 | |
garfieldsg | 0:662207e34fba | 3426 | // MEM_R_W register |
garfieldsg | 0:662207e34fba | 3427 | |
garfieldsg | 0:662207e34fba | 3428 | uint8_t MPU6050::readMemoryByte() |
garfieldsg | 0:662207e34fba | 3429 | { |
garfieldsg | 0:662207e34fba | 3430 | i2Cdev.readByte(devAddr, MPU6050_RA_MEM_R_W, buffer); |
garfieldsg | 0:662207e34fba | 3431 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 3432 | } |
garfieldsg | 0:662207e34fba | 3433 | void MPU6050::writeMemoryByte(uint8_t data) |
garfieldsg | 0:662207e34fba | 3434 | { |
garfieldsg | 0:662207e34fba | 3435 | i2Cdev.writeByte(devAddr, MPU6050_RA_MEM_R_W, data); |
garfieldsg | 0:662207e34fba | 3436 | } |
garfieldsg | 0:662207e34fba | 3437 | void MPU6050::readMemoryBlock(uint8_t *data, uint16_t dataSize, uint8_t bank, uint8_t address) |
garfieldsg | 0:662207e34fba | 3438 | { |
garfieldsg | 0:662207e34fba | 3439 | setMemoryBank(bank); |
garfieldsg | 0:662207e34fba | 3440 | setMemoryStartAddress(address); |
garfieldsg | 0:662207e34fba | 3441 | uint8_t chunkSize; |
garfieldsg | 0:662207e34fba | 3442 | for (uint16_t i = 0; i < dataSize;) { |
garfieldsg | 0:662207e34fba | 3443 | // determine correct chunk size according to bank position and data size |
garfieldsg | 0:662207e34fba | 3444 | chunkSize = MPU6050_DMP_MEMORY_CHUNK_SIZE; |
garfieldsg | 0:662207e34fba | 3445 | |
garfieldsg | 0:662207e34fba | 3446 | // make sure we don't go past the data size |
garfieldsg | 0:662207e34fba | 3447 | if (i + chunkSize > dataSize) chunkSize = dataSize - i; |
garfieldsg | 0:662207e34fba | 3448 | |
garfieldsg | 0:662207e34fba | 3449 | // make sure this chunk doesn't go past the bank boundary (256 bytes) |
garfieldsg | 0:662207e34fba | 3450 | if (chunkSize > 256 - address) chunkSize = 256 - address; |
garfieldsg | 0:662207e34fba | 3451 | |
garfieldsg | 0:662207e34fba | 3452 | // read the chunk of data as specified |
garfieldsg | 0:662207e34fba | 3453 | i2Cdev.readBytes(devAddr, MPU6050_RA_MEM_R_W, chunkSize, data + i); |
garfieldsg | 0:662207e34fba | 3454 | |
garfieldsg | 0:662207e34fba | 3455 | // increase byte index by [chunkSize] |
garfieldsg | 0:662207e34fba | 3456 | i += chunkSize; |
garfieldsg | 0:662207e34fba | 3457 | |
garfieldsg | 0:662207e34fba | 3458 | // uint8_t automatically wraps to 0 at 256 |
garfieldsg | 0:662207e34fba | 3459 | address += chunkSize; |
garfieldsg | 0:662207e34fba | 3460 | |
garfieldsg | 0:662207e34fba | 3461 | // if we aren't done, update bank (if necessary) and address |
garfieldsg | 0:662207e34fba | 3462 | if (i < dataSize) { |
garfieldsg | 0:662207e34fba | 3463 | if (address == 0) bank++; |
garfieldsg | 0:662207e34fba | 3464 | setMemoryBank(bank); |
garfieldsg | 0:662207e34fba | 3465 | setMemoryStartAddress(address); |
garfieldsg | 0:662207e34fba | 3466 | } |
garfieldsg | 0:662207e34fba | 3467 | } |
garfieldsg | 0:662207e34fba | 3468 | } |
garfieldsg | 0:662207e34fba | 3469 | bool MPU6050::writeMemoryBlock(const uint8_t *data, uint16_t dataSize, uint8_t bank, uint8_t address, bool verify, bool useProgMem) |
garfieldsg | 0:662207e34fba | 3470 | { |
garfieldsg | 0:662207e34fba | 3471 | setMemoryBank(bank); |
garfieldsg | 0:662207e34fba | 3472 | setMemoryStartAddress(address); |
garfieldsg | 0:662207e34fba | 3473 | uint8_t chunkSize; |
garfieldsg | 0:662207e34fba | 3474 | uint8_t *verifyBuffer; |
garfieldsg | 0:662207e34fba | 3475 | uint8_t *progBuffer; |
garfieldsg | 0:662207e34fba | 3476 | uint16_t i; |
garfieldsg | 0:662207e34fba | 3477 | uint8_t j; |
garfieldsg | 0:662207e34fba | 3478 | if (verify) verifyBuffer = (uint8_t *)malloc(MPU6050_DMP_MEMORY_CHUNK_SIZE); |
garfieldsg | 0:662207e34fba | 3479 | if (useProgMem) progBuffer = (uint8_t *)malloc(MPU6050_DMP_MEMORY_CHUNK_SIZE); |
garfieldsg | 0:662207e34fba | 3480 | for (i = 0; i < dataSize;) { |
garfieldsg | 0:662207e34fba | 3481 | // determine correct chunk size according to bank position and data size |
garfieldsg | 0:662207e34fba | 3482 | chunkSize = MPU6050_DMP_MEMORY_CHUNK_SIZE; |
garfieldsg | 0:662207e34fba | 3483 | |
garfieldsg | 0:662207e34fba | 3484 | // make sure we don't go past the data size |
garfieldsg | 0:662207e34fba | 3485 | if (i + chunkSize > dataSize) chunkSize = dataSize - i; |
garfieldsg | 0:662207e34fba | 3486 | |
garfieldsg | 0:662207e34fba | 3487 | // make sure this chunk doesn't go past the bank boundary (256 bytes) |
garfieldsg | 0:662207e34fba | 3488 | if (chunkSize > 256 - address) chunkSize = 256 - address; |
garfieldsg | 0:662207e34fba | 3489 | |
garfieldsg | 0:662207e34fba | 3490 | if (useProgMem) { |
garfieldsg | 0:662207e34fba | 3491 | // write the chunk of data as specified |
garfieldsg | 0:662207e34fba | 3492 | for (j = 0; j < chunkSize; j++) progBuffer[j] = pgm_read_byte(data + i + j); |
garfieldsg | 0:662207e34fba | 3493 | } else { |
garfieldsg | 0:662207e34fba | 3494 | // write the chunk of data as specified |
garfieldsg | 0:662207e34fba | 3495 | progBuffer = (uint8_t *)data + i; |
garfieldsg | 0:662207e34fba | 3496 | } |
garfieldsg | 0:662207e34fba | 3497 | |
garfieldsg | 0:662207e34fba | 3498 | i2Cdev.writeBytes(devAddr, MPU6050_RA_MEM_R_W, chunkSize, progBuffer); |
garfieldsg | 0:662207e34fba | 3499 | |
garfieldsg | 0:662207e34fba | 3500 | // verify data if needed |
garfieldsg | 0:662207e34fba | 3501 | if (verify && verifyBuffer) { |
garfieldsg | 0:662207e34fba | 3502 | setMemoryBank(bank); |
garfieldsg | 0:662207e34fba | 3503 | setMemoryStartAddress(address); |
garfieldsg | 0:662207e34fba | 3504 | i2Cdev.readBytes(devAddr, MPU6050_RA_MEM_R_W, chunkSize, verifyBuffer); |
garfieldsg | 0:662207e34fba | 3505 | if (memcmp(progBuffer, verifyBuffer, chunkSize) != 0) { |
garfieldsg | 0:662207e34fba | 3506 | /*Serial.print("Block write verification error, bank "); |
garfieldsg | 0:662207e34fba | 3507 | Serial.print(bank, DEC); |
garfieldsg | 0:662207e34fba | 3508 | Serial.print(", address "); |
garfieldsg | 0:662207e34fba | 3509 | Serial.print(address, DEC); |
garfieldsg | 0:662207e34fba | 3510 | Serial.print("!\nExpected:"); |
garfieldsg | 0:662207e34fba | 3511 | for (j = 0; j < chunkSize; j++) { |
garfieldsg | 0:662207e34fba | 3512 | Serial.print(" 0x"); |
garfieldsg | 0:662207e34fba | 3513 | if (progBuffer[j] < 16) Serial.print("0"); |
garfieldsg | 0:662207e34fba | 3514 | Serial.print(progBuffer[j], HEX); |
garfieldsg | 0:662207e34fba | 3515 | } |
garfieldsg | 0:662207e34fba | 3516 | Serial.print("\nReceived:"); |
garfieldsg | 0:662207e34fba | 3517 | for (uint8_t j = 0; j < chunkSize; j++) { |
garfieldsg | 0:662207e34fba | 3518 | Serial.print(" 0x"); |
garfieldsg | 0:662207e34fba | 3519 | if (verifyBuffer[i + j] < 16) Serial.print("0"); |
garfieldsg | 0:662207e34fba | 3520 | Serial.print(verifyBuffer[i + j], HEX); |
garfieldsg | 0:662207e34fba | 3521 | } |
garfieldsg | 0:662207e34fba | 3522 | Serial.print("\n");*/ |
garfieldsg | 0:662207e34fba | 3523 | free(verifyBuffer); |
garfieldsg | 0:662207e34fba | 3524 | if (useProgMem) free(progBuffer); |
garfieldsg | 0:662207e34fba | 3525 | return false; // uh oh. |
garfieldsg | 0:662207e34fba | 3526 | } |
garfieldsg | 0:662207e34fba | 3527 | } |
garfieldsg | 0:662207e34fba | 3528 | |
garfieldsg | 0:662207e34fba | 3529 | // increase byte index by [chunkSize] |
garfieldsg | 0:662207e34fba | 3530 | i += chunkSize; |
garfieldsg | 0:662207e34fba | 3531 | |
garfieldsg | 0:662207e34fba | 3532 | // uint8_t automatically wraps to 0 at 256 |
garfieldsg | 0:662207e34fba | 3533 | address += chunkSize; |
garfieldsg | 0:662207e34fba | 3534 | |
garfieldsg | 0:662207e34fba | 3535 | // if we aren't done, update bank (if necessary) and address |
garfieldsg | 0:662207e34fba | 3536 | if (i < dataSize) { |
garfieldsg | 0:662207e34fba | 3537 | if (address == 0) bank++; |
garfieldsg | 0:662207e34fba | 3538 | setMemoryBank(bank); |
garfieldsg | 0:662207e34fba | 3539 | setMemoryStartAddress(address); |
garfieldsg | 0:662207e34fba | 3540 | } |
garfieldsg | 0:662207e34fba | 3541 | } |
garfieldsg | 0:662207e34fba | 3542 | if (verify) free(verifyBuffer); |
garfieldsg | 0:662207e34fba | 3543 | if (useProgMem) free(progBuffer); |
garfieldsg | 0:662207e34fba | 3544 | return true; |
garfieldsg | 0:662207e34fba | 3545 | } |
garfieldsg | 0:662207e34fba | 3546 | bool MPU6050::writeProgMemoryBlock(const uint8_t *data, uint16_t dataSize, uint8_t bank, uint8_t address, bool verify) |
garfieldsg | 0:662207e34fba | 3547 | { |
garfieldsg | 0:662207e34fba | 3548 | return writeMemoryBlock(data, dataSize, bank, address, verify, true); |
garfieldsg | 0:662207e34fba | 3549 | } |
garfieldsg | 0:662207e34fba | 3550 | bool MPU6050::writeDMPConfigurationSet(const uint8_t *data, uint16_t dataSize, bool useProgMem) |
garfieldsg | 0:662207e34fba | 3551 | { |
garfieldsg | 0:662207e34fba | 3552 | uint8_t *progBuffer, success, special; |
garfieldsg | 0:662207e34fba | 3553 | uint16_t i, j; |
garfieldsg | 0:662207e34fba | 3554 | if (useProgMem) { |
garfieldsg | 0:662207e34fba | 3555 | progBuffer = (uint8_t *)malloc(8); // assume 8-byte blocks, realloc later if necessary |
garfieldsg | 0:662207e34fba | 3556 | } |
garfieldsg | 0:662207e34fba | 3557 | |
garfieldsg | 0:662207e34fba | 3558 | // config set data is a long string of blocks with the following structure: |
garfieldsg | 0:662207e34fba | 3559 | // [bank] [offset] [length] [byte[0], byte[1], ..., byte[length]] |
garfieldsg | 0:662207e34fba | 3560 | uint8_t bank, offset, length; |
garfieldsg | 0:662207e34fba | 3561 | for (i = 0; i < dataSize;) { |
garfieldsg | 0:662207e34fba | 3562 | if (useProgMem) { |
garfieldsg | 0:662207e34fba | 3563 | bank = pgm_read_byte(data + i++); |
garfieldsg | 0:662207e34fba | 3564 | offset = pgm_read_byte(data + i++); |
garfieldsg | 0:662207e34fba | 3565 | length = pgm_read_byte(data + i++); |
garfieldsg | 0:662207e34fba | 3566 | } else { |
garfieldsg | 0:662207e34fba | 3567 | bank = data[i++]; |
garfieldsg | 0:662207e34fba | 3568 | offset = data[i++]; |
garfieldsg | 0:662207e34fba | 3569 | length = data[i++]; |
garfieldsg | 0:662207e34fba | 3570 | } |
garfieldsg | 0:662207e34fba | 3571 | |
garfieldsg | 0:662207e34fba | 3572 | // write data or perform special action |
garfieldsg | 0:662207e34fba | 3573 | if (length > 0) { |
garfieldsg | 0:662207e34fba | 3574 | // regular block of data to write |
garfieldsg | 0:662207e34fba | 3575 | /*Serial.print("Writing config block to bank "); |
garfieldsg | 0:662207e34fba | 3576 | Serial.print(bank); |
garfieldsg | 0:662207e34fba | 3577 | Serial.print(", offset "); |
garfieldsg | 0:662207e34fba | 3578 | Serial.print(offset); |
garfieldsg | 0:662207e34fba | 3579 | Serial.print(", length="); |
garfieldsg | 0:662207e34fba | 3580 | Serial.println(length);*/ |
garfieldsg | 0:662207e34fba | 3581 | if (useProgMem) { |
garfieldsg | 0:662207e34fba | 3582 | if (sizeof(progBuffer) < length) progBuffer = (uint8_t *)realloc(progBuffer, length); |
garfieldsg | 0:662207e34fba | 3583 | for (j = 0; j < length; j++) progBuffer[j] = pgm_read_byte(data + i + j); |
garfieldsg | 0:662207e34fba | 3584 | } else { |
garfieldsg | 0:662207e34fba | 3585 | progBuffer = (uint8_t *)data + i; |
garfieldsg | 0:662207e34fba | 3586 | } |
garfieldsg | 0:662207e34fba | 3587 | success = writeMemoryBlock(progBuffer, length, bank, offset, true); |
garfieldsg | 0:662207e34fba | 3588 | i += length; |
garfieldsg | 0:662207e34fba | 3589 | } else { |
garfieldsg | 0:662207e34fba | 3590 | // special instruction |
garfieldsg | 0:662207e34fba | 3591 | // NOTE: this kind of behavior (what and when to do certain things) |
garfieldsg | 0:662207e34fba | 3592 | // is totally undocumented. This code is in here based on observed |
garfieldsg | 0:662207e34fba | 3593 | // behavior only, and exactly why (or even whether) it has to be here |
garfieldsg | 0:662207e34fba | 3594 | // is anybody's guess for now. |
garfieldsg | 0:662207e34fba | 3595 | if (useProgMem) { |
garfieldsg | 0:662207e34fba | 3596 | special = pgm_read_byte(data + i++); |
garfieldsg | 0:662207e34fba | 3597 | } else { |
garfieldsg | 0:662207e34fba | 3598 | special = data[i++]; |
garfieldsg | 0:662207e34fba | 3599 | } |
garfieldsg | 0:662207e34fba | 3600 | /*Serial.print("Special command code "); |
garfieldsg | 0:662207e34fba | 3601 | Serial.print(special, HEX); |
garfieldsg | 0:662207e34fba | 3602 | Serial.println(" found...");*/ |
garfieldsg | 0:662207e34fba | 3603 | if (special == 0x01) { |
garfieldsg | 0:662207e34fba | 3604 | // enable DMP-related interrupts |
garfieldsg | 0:662207e34fba | 3605 | |
garfieldsg | 0:662207e34fba | 3606 | //setIntZeroMotionEnabled(true); |
garfieldsg | 0:662207e34fba | 3607 | //setIntFIFOBufferOverflowEnabled(true); |
garfieldsg | 0:662207e34fba | 3608 | //setIntDMPEnabled(true); |
garfieldsg | 0:662207e34fba | 3609 | i2Cdev.writeByte(devAddr, MPU6050_RA_INT_ENABLE, 0x32); // single operation |
garfieldsg | 0:662207e34fba | 3610 | |
garfieldsg | 0:662207e34fba | 3611 | success = true; |
garfieldsg | 0:662207e34fba | 3612 | } else { |
garfieldsg | 0:662207e34fba | 3613 | // unknown special command |
garfieldsg | 0:662207e34fba | 3614 | success = false; |
garfieldsg | 0:662207e34fba | 3615 | } |
garfieldsg | 0:662207e34fba | 3616 | } |
garfieldsg | 0:662207e34fba | 3617 | |
garfieldsg | 0:662207e34fba | 3618 | if (!success) { |
garfieldsg | 0:662207e34fba | 3619 | if (useProgMem) free(progBuffer); |
garfieldsg | 0:662207e34fba | 3620 | return false; // uh oh |
garfieldsg | 0:662207e34fba | 3621 | } |
garfieldsg | 0:662207e34fba | 3622 | } |
garfieldsg | 0:662207e34fba | 3623 | if (useProgMem) free(progBuffer); |
garfieldsg | 0:662207e34fba | 3624 | return true; |
garfieldsg | 0:662207e34fba | 3625 | } |
garfieldsg | 0:662207e34fba | 3626 | bool MPU6050::writeProgDMPConfigurationSet(const uint8_t *data, uint16_t dataSize) |
garfieldsg | 0:662207e34fba | 3627 | { |
garfieldsg | 0:662207e34fba | 3628 | return writeDMPConfigurationSet(data, dataSize, false); |
garfieldsg | 0:662207e34fba | 3629 | } |
garfieldsg | 0:662207e34fba | 3630 | |
garfieldsg | 0:662207e34fba | 3631 | // DMP_CFG_1 register |
garfieldsg | 0:662207e34fba | 3632 | |
garfieldsg | 0:662207e34fba | 3633 | uint8_t MPU6050::getDMPConfig1() |
garfieldsg | 0:662207e34fba | 3634 | { |
garfieldsg | 0:662207e34fba | 3635 | i2Cdev.readByte(devAddr, MPU6050_RA_DMP_CFG_1, buffer); |
garfieldsg | 0:662207e34fba | 3636 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 3637 | } |
garfieldsg | 0:662207e34fba | 3638 | void MPU6050::setDMPConfig1(uint8_t config) |
garfieldsg | 0:662207e34fba | 3639 | { |
garfieldsg | 0:662207e34fba | 3640 | i2Cdev.writeByte(devAddr, MPU6050_RA_DMP_CFG_1, config); |
garfieldsg | 0:662207e34fba | 3641 | } |
garfieldsg | 0:662207e34fba | 3642 | |
garfieldsg | 0:662207e34fba | 3643 | // DMP_CFG_2 register |
garfieldsg | 0:662207e34fba | 3644 | |
garfieldsg | 0:662207e34fba | 3645 | uint8_t MPU6050::getDMPConfig2() |
garfieldsg | 0:662207e34fba | 3646 | { |
garfieldsg | 0:662207e34fba | 3647 | i2Cdev.readByte(devAddr, MPU6050_RA_DMP_CFG_2, buffer); |
garfieldsg | 0:662207e34fba | 3648 | return buffer[0]; |
garfieldsg | 0:662207e34fba | 3649 | } |
garfieldsg | 0:662207e34fba | 3650 | void MPU6050::setDMPConfig2(uint8_t config) |
garfieldsg | 0:662207e34fba | 3651 | { |
garfieldsg | 0:662207e34fba | 3652 | i2Cdev.writeByte(devAddr, MPU6050_RA_DMP_CFG_2, config); |
garfieldsg | 0:662207e34fba | 3653 | } |