From 9b7697e00f5f34a728eb43753fef03de2f516292 Mon Sep 17 00:00:00 2001 From: Philippe Roy Date: Sat, 13 May 2023 17:25:13 +0200 Subject: [PATCH] =?UTF-8?q?Ajout=20des=20propri=C3=A9t=C3=A9s=20=C3=A0=20B?= =?UTF-8?q?ille=20:=20chute=20et=20victoire?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../4-labyrinthe-imu/4-labyrinthe-imu.ino | 84 - .../etape1/4-labyrinthe-imu/I2Cdev.cpp | 1466 -------- .../etape1/4-labyrinthe-imu/I2Cdev.h | 272 -- .../etape1/4-labyrinthe-imu/MPU6050.cpp | 3237 ----------------- .../etape1/4-labyrinthe-imu/MPU6050.h | 997 ----- .../etape1/4-labyrinthe.blend | Bin 1152424 -> 0 bytes .../4-arduino_pyserial/etape1/4-labyrinthe.py | 151 - 7 files changed, 6207 deletions(-) delete mode 100644 labyrinthe/4-arduino_pyserial/etape1/4-labyrinthe-imu/4-labyrinthe-imu.ino delete mode 100755 labyrinthe/4-arduino_pyserial/etape1/4-labyrinthe-imu/I2Cdev.cpp delete mode 100755 labyrinthe/4-arduino_pyserial/etape1/4-labyrinthe-imu/I2Cdev.h delete mode 100644 labyrinthe/4-arduino_pyserial/etape1/4-labyrinthe-imu/MPU6050.cpp delete mode 100644 labyrinthe/4-arduino_pyserial/etape1/4-labyrinthe-imu/MPU6050.h delete mode 100644 labyrinthe/4-arduino_pyserial/etape1/4-labyrinthe.blend delete mode 100644 labyrinthe/4-arduino_pyserial/etape1/4-labyrinthe.py diff --git a/labyrinthe/4-arduino_pyserial/etape1/4-labyrinthe-imu/4-labyrinthe-imu.ino b/labyrinthe/4-arduino_pyserial/etape1/4-labyrinthe-imu/4-labyrinthe-imu.ino deleted file mode 100644 index 6be7a33..0000000 --- a/labyrinthe/4-arduino_pyserial/etape1/4-labyrinthe-imu/4-labyrinthe-imu.ino +++ /dev/null @@ -1,84 +0,0 @@ -#include "Wire.h" -#include "MPU6050.h" - -/****************************************************************************** - * 4-labyrinthe-imu.ino - * @title: Programme pour la carte Arduino de gestion de centrale inertielle (capteur IMU) - * @project: Blender-EduTech - Tutoriel 4 : Labyrinthe à bille - Interfacer avec une carte Arduino par la liaision série - * @lang: fr - * @authors: Philippe Roy - * @copyright: Copyright (C) 2023 Philippe Roy - * @license: GNU GPL - * - ******************************************************************************/ - -/****************************************************************************** - * IMU - I2C - ******************************************************************************/ - -MPU6050 accelgyro; - -int16_t ax, ay, az; -int16_t gx, gy, gz; -int16_t mx, my, mz; -float Axyz[3]; -float roll; -float pitch; -float roll_deg; -float pitch_deg; -String roll_txt; -String pitch_txt; -String serial_msg_int_txt; - -/****************************************************************************** - * Communication serie - ******************************************************************************/ - -String serial_msg = ""; // Message - -/****************************************************************************** - * Initialisation - ******************************************************************************/ - -void setup() { - - // Liaison série - Serial.begin(115200); - - // IMU - Wire.begin(); - accelgyro.initialize(); -} - -/****************************************************************************** - * Boucle principale - ******************************************************************************/ - -void loop() { - - /***** - * Lecture des accélérations - *****/ - - accelgyro.getMotion9(&ax, &ay, &az, &gx, &gy, &gz, &mx, &my, &mz); - Axyz[0] = (double) ax / 16384; - Axyz[1] = (double) ay / 16384; - Axyz[2] = (double) az / 16384; - roll = asin(-Axyz[0]); - roll_deg = roll*57.3; - roll_txt = String(roll_deg); - pitch = -asin(Axyz[1]/cos(roll)); // position capteur (X vers la gauche, Y vers l'arriere, Z vers le haut) - pitch_deg = pitch*57.3; - pitch_txt = String(pitch_deg); - - /***** - * IMU : Arduino -> UPBGE - *****/ - - Serial.print(roll_txt); - Serial.print(","); - Serial.print(pitch_txt); - Serial.println(); - -} - diff --git a/labyrinthe/4-arduino_pyserial/etape1/4-labyrinthe-imu/I2Cdev.cpp b/labyrinthe/4-arduino_pyserial/etape1/4-labyrinthe-imu/I2Cdev.cpp deleted file mode 100755 index 7f52fe0..0000000 --- a/labyrinthe/4-arduino_pyserial/etape1/4-labyrinthe-imu/I2Cdev.cpp +++ /dev/null @@ -1,1466 +0,0 @@ -// I2Cdev library collection - Main I2C device class -// Abstracts bit and byte I2C R/W functions into a convenient class -// 6/9/2012 by Jeff Rowberg -// -// Changelog: -// 2012-06-09 - fix major issue with reading > 32 bytes at a time with Arduino Wire -// - add compiler warnings when using outdated or IDE or limited I2Cdev implementation -// 2011-11-01 - fix write*Bits mask calculation (thanks sasquatch @ Arduino forums) -// 2011-10-03 - added automatic Arduino version detection for ease of use -// 2011-10-02 - added Gene Knight's NBWire TwoWire class implementation with small modifications -// 2011-08-31 - added support for Arduino 1.0 Wire library (methods are different from 0.x) -// 2011-08-03 - added optional timeout parameter to read* methods to easily change from default -// 2011-08-02 - added support for 16-bit registers -// - fixed incorrect Doxygen comments on some methods -// - added timeout value for read operations (thanks mem @ Arduino forums) -// 2011-07-30 - changed read/write function structures to return success or byte counts -// - made all methods static for multi-device memory savings -// 2011-07-28 - initial release - -/* ============================================ - I2Cdev device library code is placed under the MIT license - Copyright (c) 2012 Jeff Rowberg - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. - =============================================== -*/ - -#include "I2Cdev.h" - -#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE - - #ifdef I2CDEV_IMPLEMENTATION_WARNINGS - #if ARDUINO < 100 - #warning Using outdated Arduino IDE with Wire library is functionally limiting. - #warning Arduino IDE v1.0.1+ with I2Cdev Fastwire implementation is recommended. - #warning This I2Cdev implementation does not support: - #warning - Repeated starts conditions - #warning - Timeout detection (some Wire requests block forever) - #elif ARDUINO == 100 - #warning Using outdated Arduino IDE with Wire library is functionally limiting. - #warning Arduino IDE v1.0.1+ with I2Cdev Fastwire implementation is recommended. - #warning This I2Cdev implementation does not support: - #warning - Repeated starts conditions - #warning - Timeout detection (some Wire requests block forever) - #elif ARDUINO > 100 - /* - #warning Using current Arduino IDE with Wire library is functionally limiting. - #warning Arduino IDE v1.0.1+ with I2CDEV_BUILTIN_FASTWIRE implementation is recommended. - #warning This I2Cdev implementation does not support: - #warning - Timeout detection (some Wire requests block forever) - */ - #endif - #endif - -#elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE - - #error The I2CDEV_BUILTIN_FASTWIRE implementation is known to be broken right now. Patience, Iago! - -#elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_NBWIRE - - #ifdef I2CDEV_IMPLEMENTATION_WARNINGS - #warning Using I2CDEV_BUILTIN_NBWIRE implementation may adversely affect interrupt detection. - #warning This I2Cdev implementation does not support: - #warning - Repeated starts conditions - #endif - - // NBWire implementation based heavily on code by Gene Knight - // Originally posted on the Arduino forum at http://arduino.cc/forum/index.php/topic,70705.0.html - // Originally offered to the i2cdevlib project at http://arduino.cc/forum/index.php/topic,68210.30.html - TwoWire Wire; - -#endif - -/** Default constructor. -*/ -I2Cdev::I2Cdev() { -} - -/** Read a single bit from an 8-bit device register. - @param devAddr I2C slave device address - @param regAddr Register regAddr to read from - @param bitNum Bit position to read (0-7) - @param data Container for single bit value - @param timeout Optional read timeout in milliseconds (0 to disable, leave off to use default class value in I2Cdev::readTimeout) - @return Status of read operation (true = success) -*/ -int8_t I2Cdev::readBit(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint8_t* data, uint16_t timeout) { - uint8_t b; - uint8_t count = readByte(devAddr, regAddr, &b, timeout); - *data = b & (1 << bitNum); - return count; -} - -/** Read a single bit from a 16-bit device register. - @param devAddr I2C slave device address - @param regAddr Register regAddr to read from - @param bitNum Bit position to read (0-15) - @param data Container for single bit value - @param timeout Optional read timeout in milliseconds (0 to disable, leave off to use default class value in I2Cdev::readTimeout) - @return Status of read operation (true = success) -*/ -int8_t I2Cdev::readBitW(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint16_t* data, uint16_t timeout) { - uint16_t b; - uint8_t count = readWord(devAddr, regAddr, &b, timeout); - *data = b & (1 << bitNum); - return count; -} - -/** Read multiple bits from an 8-bit device register. - @param devAddr I2C slave device address - @param regAddr Register regAddr to read from - @param bitStart First bit position to read (0-7) - @param length Number of bits to read (not more than 8) - @param data Container for right-aligned value (i.e. '101' read from any bitStart position will equal 0x05) - @param timeout Optional read timeout in milliseconds (0 to disable, leave off to use default class value in I2Cdev::readTimeout) - @return Status of read operation (true = success) -*/ -int8_t I2Cdev::readBits(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint8_t* data, - uint16_t timeout) { - // 01101001 read byte - // 76543210 bit numbers - // xxx args: bitStart=4, length=3 - // 010 masked - // -> 010 shifted - uint8_t count, b; - if ((count = readByte(devAddr, regAddr, &b, timeout)) != 0) { - uint8_t mask = ((1 << length) - 1) << (bitStart - length + 1); - b &= mask; - b >>= (bitStart - length + 1); - *data = b; - } - return count; -} - -/** Read multiple bits from a 16-bit device register. - @param devAddr I2C slave device address - @param regAddr Register regAddr to read from - @param bitStart First bit position to read (0-15) - @param length Number of bits to read (not more than 16) - @param data Container for right-aligned value (i.e. '101' read from any bitStart position will equal 0x05) - @param timeout Optional read timeout in milliseconds (0 to disable, leave off to use default class value in I2Cdev::readTimeout) - @return Status of read operation (1 = success, 0 = failure, -1 = timeout) -*/ -int8_t I2Cdev::readBitsW(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint16_t* data, - uint16_t timeout) { - // 1101011001101001 read byte - // fedcba9876543210 bit numbers - // xxx args: bitStart=12, length=3 - // 010 masked - // -> 010 shifted - uint8_t count; - uint16_t w; - if ((count = readWord(devAddr, regAddr, &w, timeout)) != 0) { - uint16_t mask = ((1 << length) - 1) << (bitStart - length + 1); - w &= mask; - w >>= (bitStart - length + 1); - *data = w; - } - return count; -} - -/** Read single byte from an 8-bit device register. - @param devAddr I2C slave device address - @param regAddr Register regAddr to read from - @param data Container for byte value read from device - @param timeout Optional read timeout in milliseconds (0 to disable, leave off to use default class value in I2Cdev::readTimeout) - @return Status of read operation (true = success) -*/ -int8_t I2Cdev::readByte(uint8_t devAddr, uint8_t regAddr, uint8_t* data, uint16_t timeout) { - return readBytes(devAddr, regAddr, 1, data, timeout); -} - -/** Read single word from a 16-bit device register. - @param devAddr I2C slave device address - @param regAddr Register regAddr to read from - @param data Container for word value read from device - @param timeout Optional read timeout in milliseconds (0 to disable, leave off to use default class value in I2Cdev::readTimeout) - @return Status of read operation (true = success) -*/ -int8_t I2Cdev::readWord(uint8_t devAddr, uint8_t regAddr, uint16_t* data, uint16_t timeout) { - return readWords(devAddr, regAddr, 1, data, timeout); -} - -/** Read multiple bytes from an 8-bit device register. - @param devAddr I2C slave device address - @param regAddr First register regAddr to read from - @param length Number of bytes to read - @param data Buffer to store read data in - @param timeout Optional read timeout in milliseconds (0 to disable, leave off to use default class value in I2Cdev::readTimeout) - @return Number of bytes read (-1 indicates failure) -*/ -int8_t I2Cdev::readBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8_t* data, uint16_t timeout) { - #ifdef I2CDEV_SERIAL_DEBUG - Serial.print("I2C (0x"); - Serial.print(devAddr, HEX); - Serial.print(") reading "); - Serial.print(length, DEC); - Serial.print(" bytes from 0x"); - Serial.print(regAddr, HEX); - Serial.print("..."); - #endif - - int8_t count = 0; - uint32_t t1 = millis(); - - #if (I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE) - - #if (ARDUINO < 100) - // Arduino v00xx (before v1.0), Wire library - - // I2C/TWI subsystem uses internal buffer that breaks with large data requests - // so if user requests more than BUFFER_LENGTH bytes, we have to do it in - // smaller chunks instead of all at once - for (uint8_t k = 0; k < length; k += min(length, BUFFER_LENGTH)) { - Wire.beginTransmission(devAddr); - Wire.send(regAddr); - Wire.endTransmission(); - Wire.beginTransmission(devAddr); - Wire.requestFrom(devAddr, (uint8_t)min(length - k, BUFFER_LENGTH)); - - for (; Wire.available() && (timeout == 0 || millis() - t1 < timeout); count++) { - data[count] = Wire.receive(); - #ifdef I2CDEV_SERIAL_DEBUG - Serial.print(data[count], HEX); - if (count + 1 < length) { - Serial.print(" "); - } - #endif - } - - Wire.endTransmission(); - } - #elif (ARDUINO == 100) - // Arduino v1.0.0, Wire library - // Adds standardized write() and read() stream methods instead of send() and receive() - - // I2C/TWI subsystem uses internal buffer that breaks with large data requests - // so if user requests more than BUFFER_LENGTH bytes, we have to do it in - // smaller chunks instead of all at once - for (uint8_t k = 0; k < length; k += min(length, BUFFER_LENGTH)) { - Wire.beginTransmission(devAddr); - Wire.write(regAddr); - Wire.endTransmission(); - Wire.beginTransmission(devAddr); - Wire.requestFrom(devAddr, (uint8_t)min(length - k, BUFFER_LENGTH)); - - for (; Wire.available() && (timeout == 0 || millis() - t1 < timeout); count++) { - data[count] = Wire.read(); - #ifdef I2CDEV_SERIAL_DEBUG - Serial.print(data[count], HEX); - if (count + 1 < length) { - Serial.print(" "); - } - #endif - } - - Wire.endTransmission(); - } - #elif (ARDUINO > 100) - // Arduino v1.0.1+, Wire library - // Adds official support for repeated start condition, yay! - - // I2C/TWI subsystem uses internal buffer that breaks with large data requests - // so if user requests more than BUFFER_LENGTH bytes, we have to do it in - // smaller chunks instead of all at once - for (uint8_t k = 0; k < length; k += min(length, BUFFER_LENGTH)) { - Wire.beginTransmission(devAddr); - Wire.write(regAddr); - Wire.endTransmission(); - Wire.beginTransmission(devAddr); - Wire.requestFrom(devAddr, (uint8_t)min(length - k, BUFFER_LENGTH)); - - for (; Wire.available() && (timeout == 0 || millis() - t1 < timeout); count++) { - data[count] = Wire.read(); - #ifdef I2CDEV_SERIAL_DEBUG - Serial.print(data[count], HEX); - if (count + 1 < length) { - Serial.print(" "); - } - #endif - } - - Wire.endTransmission(); - } - #endif - - #elif (I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE) - // Fastwire library (STILL UNDER DEVELOPMENT, NON-FUNCTIONAL!) - - // no loop required for fastwire - uint8_t status = Fastwire::readBuf(devAddr, regAddr, data, length); - if (status == 0) { - count = length; // success - } else { - count = -1; // error - } - - #endif - - // check for timeout - if (timeout > 0 && millis() - t1 >= timeout && count < length) { - count = -1; // timeout - } - - #ifdef I2CDEV_SERIAL_DEBUG - Serial.print(". Done ("); - Serial.print(count, DEC); - Serial.println(" read)."); - #endif - - return count; -} - -/** Read multiple words from a 16-bit device register. - @param devAddr I2C slave device address - @param regAddr First register regAddr to read from - @param length Number of words to read - @param data Buffer to store read data in - @param timeout Optional read timeout in milliseconds (0 to disable, leave off to use default class value in I2Cdev::readTimeout) - @return Number of words read (0 indicates failure) -*/ -int8_t I2Cdev::readWords(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint16_t* data, uint16_t timeout) { - #ifdef I2CDEV_SERIAL_DEBUG - Serial.print("I2C (0x"); - Serial.print(devAddr, HEX); - Serial.print(") reading "); - Serial.print(length, DEC); - Serial.print(" words from 0x"); - Serial.print(regAddr, HEX); - Serial.print("..."); - #endif - - int8_t count = 0; - uint32_t t1 = millis(); - - #if (I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE) - - #if (ARDUINO < 100) - // Arduino v00xx (before v1.0), Wire library - - // I2C/TWI subsystem uses internal buffer that breaks with large data requests - // so if user requests more than BUFFER_LENGTH bytes, we have to do it in - // smaller chunks instead of all at once - for (uint8_t k = 0; k < length * 2; k += min(length * 2, BUFFER_LENGTH)) { - Wire.beginTransmission(devAddr); - Wire.send(regAddr); - Wire.endTransmission(); - Wire.beginTransmission(devAddr); - Wire.requestFrom(devAddr, (uint8_t)(length * 2)); // length=words, this wants bytes - - bool msb = true; // starts with MSB, then LSB - for (; Wire.available() && count < length && (timeout == 0 || millis() - t1 < timeout);) { - if (msb) { - // first byte is bits 15-8 (MSb=15) - data[count] = Wire.receive() << 8; - } else { - // second byte is bits 7-0 (LSb=0) - data[count] |= Wire.receive(); - #ifdef I2CDEV_SERIAL_DEBUG - Serial.print(data[count], HEX); - if (count + 1 < length) { - Serial.print(" "); - } - #endif - count++; - } - msb = !msb; - } - - Wire.endTransmission(); - } - #elif (ARDUINO == 100) - // Arduino v1.0.0, Wire library - // Adds standardized write() and read() stream methods instead of send() and receive() - - // I2C/TWI subsystem uses internal buffer that breaks with large data requests - // so if user requests more than BUFFER_LENGTH bytes, we have to do it in - // smaller chunks instead of all at once - for (uint8_t k = 0; k < length * 2; k += min(length * 2, BUFFER_LENGTH)) { - Wire.beginTransmission(devAddr); - Wire.write(regAddr); - Wire.endTransmission(); - Wire.beginTransmission(devAddr); - Wire.requestFrom(devAddr, (uint8_t)(length * 2)); // length=words, this wants bytes - - bool msb = true; // starts with MSB, then LSB - for (; Wire.available() && count < length && (timeout == 0 || millis() - t1 < timeout);) { - if (msb) { - // first byte is bits 15-8 (MSb=15) - data[count] = Wire.read() << 8; - } else { - // second byte is bits 7-0 (LSb=0) - data[count] |= Wire.read(); - #ifdef I2CDEV_SERIAL_DEBUG - Serial.print(data[count], HEX); - if (count + 1 < length) { - Serial.print(" "); - } - #endif - count++; - } - msb = !msb; - } - - Wire.endTransmission(); - } - #elif (ARDUINO > 100) - // Arduino v1.0.1+, Wire library - // Adds official support for repeated start condition, yay! - - // I2C/TWI subsystem uses internal buffer that breaks with large data requests - // so if user requests more than BUFFER_LENGTH bytes, we have to do it in - // smaller chunks instead of all at once - for (uint8_t k = 0; k < length * 2; k += min(length * 2, BUFFER_LENGTH)) { - Wire.beginTransmission(devAddr); - Wire.write(regAddr); - Wire.endTransmission(); - Wire.beginTransmission(devAddr); - Wire.requestFrom(devAddr, (uint8_t)(length * 2)); // length=words, this wants bytes - - bool msb = true; // starts with MSB, then LSB - for (; Wire.available() && count < length && (timeout == 0 || millis() - t1 < timeout);) { - if (msb) { - // first byte is bits 15-8 (MSb=15) - data[count] = Wire.read() << 8; - } else { - // second byte is bits 7-0 (LSb=0) - data[count] |= Wire.read(); - #ifdef I2CDEV_SERIAL_DEBUG - Serial.print(data[count], HEX); - if (count + 1 < length) { - Serial.print(" "); - } - #endif - count++; - } - msb = !msb; - } - - Wire.endTransmission(); - } - #endif - - #elif (I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE) - // Fastwire library (STILL UNDER DEVELOPMENT, NON-FUNCTIONAL!) - - // no loop required for fastwire - uint16_t intermediate[(uint8_t)length]; - uint8_t status = Fastwire::readBuf(devAddr, regAddr, (uint8_t*)intermediate, (uint8_t)(length * 2)); - if (status == 0) { - count = length; // success - for (uint8_t i = 0; i < length; i++) { - data[i] = (intermediate[2 * i] << 8) | intermediate[2 * i + 1]; - } - } else { - count = -1; // error - } - - #endif - - if (timeout > 0 && millis() - t1 >= timeout && count < length) { - count = -1; // timeout - } - - #ifdef I2CDEV_SERIAL_DEBUG - Serial.print(". Done ("); - Serial.print(count, DEC); - Serial.println(" read)."); - #endif - - return count; -} - -/** write a single bit in an 8-bit device register. - @param devAddr I2C slave device address - @param regAddr Register regAddr to write to - @param bitNum Bit position to write (0-7) - @param value New bit value to write - @return Status of operation (true = success) -*/ -bool I2Cdev::writeBit(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint8_t data) { - uint8_t b; - readByte(devAddr, regAddr, &b); - b = (data != 0) ? (b | (1 << bitNum)) : (b & ~(1 << bitNum)); - return writeByte(devAddr, regAddr, b); -} - -/** write a single bit in a 16-bit device register. - @param devAddr I2C slave device address - @param regAddr Register regAddr to write to - @param bitNum Bit position to write (0-15) - @param value New bit value to write - @return Status of operation (true = success) -*/ -bool I2Cdev::writeBitW(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint16_t data) { - uint16_t w; - readWord(devAddr, regAddr, &w); - w = (data != 0) ? (w | (1 << bitNum)) : (w & ~(1 << bitNum)); - return writeWord(devAddr, regAddr, w); -} - -/** Write multiple bits in an 8-bit device register. - @param devAddr I2C slave device address - @param regAddr Register regAddr to write to - @param bitStart First bit position to write (0-7) - @param length Number of bits to write (not more than 8) - @param data Right-aligned value to write - @return Status of operation (true = success) -*/ -bool I2Cdev::writeBits(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint8_t data) { - // 010 value to write - // 76543210 bit numbers - // xxx args: bitStart=4, length=3 - // 00011100 mask byte - // 10101111 original value (sample) - // 10100011 original & ~mask - // 10101011 masked | value - uint8_t b; - if (readByte(devAddr, regAddr, &b) != 0) { - uint8_t mask = ((1 << length) - 1) << (bitStart - length + 1); - data <<= (bitStart - length + 1); // shift data into correct position - data &= mask; // zero all non-important bits in data - b &= ~(mask); // zero all important bits in existing byte - b |= data; // combine data with existing byte - return writeByte(devAddr, regAddr, b); - } else { - return false; - } -} - -/** Write multiple bits in a 16-bit device register. - @param devAddr I2C slave device address - @param regAddr Register regAddr to write to - @param bitStart First bit position to write (0-15) - @param length Number of bits to write (not more than 16) - @param data Right-aligned value to write - @return Status of operation (true = success) -*/ -bool I2Cdev::writeBitsW(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint16_t data) { - // 010 value to write - // fedcba9876543210 bit numbers - // xxx args: bitStart=12, length=3 - // 0001110000000000 mask byte - // 1010111110010110 original value (sample) - // 1010001110010110 original & ~mask - // 1010101110010110 masked | value - uint16_t w; - if (readWord(devAddr, regAddr, &w) != 0) { - uint8_t mask = ((1 << length) - 1) << (bitStart - length + 1); - data <<= (bitStart - length + 1); // shift data into correct position - data &= mask; // zero all non-important bits in data - w &= ~(mask); // zero all important bits in existing word - w |= data; // combine data with existing word - return writeWord(devAddr, regAddr, w); - } else { - return false; - } -} - -/** Write single byte to an 8-bit device register. - @param devAddr I2C slave device address - @param regAddr Register address to write to - @param data New byte value to write - @return Status of operation (true = success) -*/ -bool I2Cdev::writeByte(uint8_t devAddr, uint8_t regAddr, uint8_t data) { - return writeBytes(devAddr, regAddr, 1, &data); -} - -/** Write single word to a 16-bit device register. - @param devAddr I2C slave device address - @param regAddr Register address to write to - @param data New word value to write - @return Status of operation (true = success) -*/ -bool I2Cdev::writeWord(uint8_t devAddr, uint8_t regAddr, uint16_t data) { - return writeWords(devAddr, regAddr, 1, &data); -} - -/** Write multiple bytes to an 8-bit device register. - @param devAddr I2C slave device address - @param regAddr First register address to write to - @param length Number of bytes to write - @param data Buffer to copy new data from - @return Status of operation (true = success) -*/ -bool I2Cdev::writeBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8_t* data) { - #ifdef I2CDEV_SERIAL_DEBUG - Serial.print("I2C (0x"); - Serial.print(devAddr, HEX); - Serial.print(") writing "); - Serial.print(length, DEC); - Serial.print(" bytes to 0x"); - Serial.print(regAddr, HEX); - Serial.print("..."); - #endif - uint8_t status = 0; - #if ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO < 100) || I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_NBWIRE) - Wire.beginTransmission(devAddr); - Wire.send((uint8_t) regAddr); // send address - #elif (I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO >= 100) - Wire.beginTransmission(devAddr); - Wire.write((uint8_t) regAddr); // send address - #endif - for (uint8_t i = 0; i < length; i++) { - #if ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO < 100) || I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_NBWIRE) - Wire.send((uint8_t) data[i]); - #elif (I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO >= 100) - Wire.write((uint8_t) data[i]); - #elif (I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE) - status = Fastwire::write(devAddr, regAddr, data[i]); - Serial.println(status); - #endif - #ifdef I2CDEV_SERIAL_DEBUG - Serial.print(data[i], HEX); - if (i + 1 < length) { - Serial.print(" "); - } - #endif - } - #if ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO < 100) || I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_NBWIRE) - Wire.endTransmission(); - #elif (I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO >= 100) - status = Wire.endTransmission(); - #endif - #ifdef I2CDEV_SERIAL_DEBUG - Serial.println(". Done."); - #endif - return status == 0; -} - -/** Write multiple words to a 16-bit device register. - @param devAddr I2C slave device address - @param regAddr First register address to write to - @param length Number of words to write - @param data Buffer to copy new data from - @return Status of operation (true = success) -*/ -bool I2Cdev::writeWords(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint16_t* data) { - #ifdef I2CDEV_SERIAL_DEBUG - Serial.print("I2C (0x"); - Serial.print(devAddr, HEX); - Serial.print(") writing "); - Serial.print(length, DEC); - Serial.print(" words to 0x"); - Serial.print(regAddr, HEX); - Serial.print("..."); - #endif - uint8_t status = 0; - #if ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO < 100) || I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_NBWIRE) - Wire.beginTransmission(devAddr); - Wire.send(regAddr); // send address - #elif (I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO >= 100) - Wire.beginTransmission(devAddr); - Wire.write(regAddr); // send address - #endif - for (uint8_t i = 0; i < length * 2; i++) { - #if ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO < 100) || I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_NBWIRE) - Wire.send((uint8_t)(data[i++] >> 8)); // send MSB - Wire.send((uint8_t)data[i]); // send LSB - #elif (I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO >= 100) - Wire.write((uint8_t)(data[i++] >> 8)); // send MSB - Wire.write((uint8_t)data[i]); // send LSB - #elif (I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE) - status = Fastwire::write(devAddr, regAddr, (uint8_t)(data[i++] >> 8)); - status = Fastwire::write(devAddr, regAddr + 1, (uint8_t)data[i]); - #endif - #ifdef I2CDEV_SERIAL_DEBUG - Serial.print(data[i], HEX); - if (i + 1 < length) { - Serial.print(" "); - } - #endif - } - #if ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO < 100) || I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_NBWIRE) - Wire.endTransmission(); - #elif (I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO >= 100) - status = Wire.endTransmission(); - #endif - #ifdef I2CDEV_SERIAL_DEBUG - Serial.println(". Done."); - #endif - return status == 0; -} - -/** Default timeout value for read operations. - Set this to 0 to disable timeout detection. -*/ -uint16_t I2Cdev::readTimeout = I2CDEV_DEFAULT_READ_TIMEOUT; - -#if I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE -/* - FastWire 0.2 - This is a library to help faster programs to read I2C devices. - Copyright(C) 2011 Francesco Ferrara - occhiobello at gmail dot com -*/ - -boolean Fastwire::waitInt() { - int l = 250; - while (!(TWCR & (1 << TWINT)) && l-- > 0); - return l > 0; -} - -void Fastwire::setup(int khz, boolean pullup) { - TWCR = 0; - #if defined(__AVR_ATmega168__) || defined(__AVR_ATmega8__) || defined(__AVR_ATmega328P__) - // activate internal pull-ups for twi (PORTC bits 4 & 5) - // as per note from atmega8 manual pg167 - if (pullup) { - PORTC |= ((1 << 4) | (1 << 5)); - } else { - PORTC &= ~((1 << 4) | (1 << 5)); - } - #elif defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644__) - // activate internal pull-ups for twi (PORTC bits 0 & 1) - if (pullup) { - PORTC |= ((1 << 0) | (1 << 1)); - } else { - PORTC &= ~((1 << 0) | (1 << 1)); - } - #else - // activate internal pull-ups for twi (PORTD bits 0 & 1) - // as per note from atmega128 manual pg204 - if (pullup) { - PORTD |= ((1 << 0) | (1 << 1)); - } else { - PORTD &= ~((1 << 0) | (1 << 1)); - } - #endif - - TWSR = 0; // no prescaler => prescaler = 1 - TWBR = ((16000L / khz) - 16) / 2; // change the I2C clock rate - TWCR = 1 << TWEN; // enable twi module, no interrupt -} - -byte Fastwire::write(byte device, byte address, byte value) { - byte twst, retry; - - retry = 2; - do { - TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO) | (1 << TWSTA); - if (!waitInt()) { - return 1; - } - twst = TWSR & 0xF8; - if (twst != TW_START && twst != TW_REP_START) { - return 2; - } - - TWDR = device & 0xFE; // send device address without read bit (1) - TWCR = (1 << TWINT) | (1 << TWEN); - if (!waitInt()) { - return 3; - } - twst = TWSR & 0xF8; - } while (twst == TW_MT_SLA_NACK && retry-- > 0); - if (twst != TW_MT_SLA_ACK) { - return 4; - } - - TWDR = address; // send data to the previously addressed device - TWCR = (1 << TWINT) | (1 << TWEN); - if (!waitInt()) { - return 5; - } - twst = TWSR & 0xF8; - if (twst != TW_MT_DATA_ACK) { - return 6; - } - - TWDR = value; // send data to the previously addressed device - TWCR = (1 << TWINT) | (1 << TWEN); - if (!waitInt()) { - return 7; - } - twst = TWSR & 0xF8; - if (twst != TW_MT_DATA_ACK) { - return 8; - } - - return 0; -} - -byte Fastwire::readBuf(byte device, byte address, byte* data, byte num) { - byte twst, retry; - - retry = 2; - do { - TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO) | (1 << TWSTA); - if (!waitInt()) { - return 16; - } - twst = TWSR & 0xF8; - if (twst != TW_START && twst != TW_REP_START) { - return 17; - } - - TWDR = device & 0xfe; // send device address to write - TWCR = (1 << TWINT) | (1 << TWEN); - if (!waitInt()) { - return 18; - } - twst = TWSR & 0xF8; - } while (twst == TW_MT_SLA_NACK && retry-- > 0); - if (twst != TW_MT_SLA_ACK) { - return 19; - } - - TWDR = address; // send data to the previously addressed device - TWCR = (1 << TWINT) | (1 << TWEN); - if (!waitInt()) { - return 20; - } - twst = TWSR & 0xF8; - if (twst != TW_MT_DATA_ACK) { - return 21; - } - - /***/ - - retry = 2; - do { - TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO) | (1 << TWSTA); - if (!waitInt()) { - return 22; - } - twst = TWSR & 0xF8; - if (twst != TW_START && twst != TW_REP_START) { - return 23; - } - - TWDR = device | 0x01; // send device address with the read bit (1) - TWCR = (1 << TWINT) | (1 << TWEN); - if (!waitInt()) { - return 24; - } - twst = TWSR & 0xF8; - } while (twst == TW_MR_SLA_NACK && retry-- > 0); - if (twst != TW_MR_SLA_ACK) { - return 25; - } - - for (uint8_t i = 0; i < num; i++) { - if (i == num - 1) { - TWCR = (1 << TWINT) | (1 << TWEN); - } else { - TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWEA); - } - if (!waitInt()) { - return 26; - } - twst = TWSR & 0xF8; - if (twst != TW_MR_DATA_ACK && twst != TW_MR_DATA_NACK) { - return twst; - } - data[i] = TWDR; - } - - return 0; -} -#endif - -#if I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_NBWIRE -// NBWire implementation based heavily on code by Gene Knight -// Originally posted on the Arduino forum at http://arduino.cc/forum/index.php/topic,70705.0.html -// Originally offered to the i2cdevlib project at http://arduino.cc/forum/index.php/topic,68210.30.html - -/* - call this version 1.0 - - Offhand, the only funky part that I can think of is in nbrequestFrom, where the buffer - length and index are set *before* the data is actually read. The problem is that these - are variables local to the TwoWire object, and by the time we actually have read the - data, and know what the length actually is, we have no simple access to the object's - variables. The actual bytes read *is* given to the callback function, though. - - The ISR code for a slave receiver is commented out. I don't have that setup, and can't - verify it at this time. Save it for 2.0! - - The handling of the read and write processes here is much like in the demo sketch code: - the process is broken down into sequential functions, where each registers the next as a - callback, essentially. - - For example, for the Read process, twi_read00 just returns if TWI is not yet in a - ready state. When there's another interrupt, and the interface *is* ready, then it - sets up the read, starts it, and registers twi_read01 as the function to call after - the *next* interrupt. twi_read01, then, just returns if the interface is still in a - "reading" state. When the reading is done, it copies the information to the buffer, - cleans up, and calls the user-requested callback function with the actual number of - bytes read. - - The writing is similar. - - Questions, comments and problems can go to Gene@Telobot.com. - - Thumbs Up! - Gene Knight - -*/ - -uint8_t TwoWire::rxBuffer[NBWIRE_BUFFER_LENGTH]; -uint8_t TwoWire::rxBufferIndex = 0; -uint8_t TwoWire::rxBufferLength = 0; - -uint8_t TwoWire::txAddress = 0; -uint8_t TwoWire::txBuffer[NBWIRE_BUFFER_LENGTH]; -uint8_t TwoWire::txBufferIndex = 0; -uint8_t TwoWire::txBufferLength = 0; - -//uint8_t TwoWire::transmitting = 0; -void (*TwoWire::user_onRequest)(void); -void (*TwoWire::user_onReceive)(int); - -static volatile uint8_t twi_transmitting; -static volatile uint8_t twi_state; -static uint8_t twi_slarw; -static volatile uint8_t twi_error; -static uint8_t twi_masterBuffer[TWI_BUFFER_LENGTH]; -static volatile uint8_t twi_masterBufferIndex; -static uint8_t twi_masterBufferLength; -static uint8_t twi_rxBuffer[TWI_BUFFER_LENGTH]; -static volatile uint8_t twi_rxBufferIndex; -//static volatile uint8_t twi_Interrupt_Continue_Command; -static volatile uint8_t twi_Return_Value; -static volatile uint8_t twi_Done; -void (*twi_cbendTransmissionDone)(int); -void (*twi_cbreadFromDone)(int); - -void twi_init() { - // initialize state - twi_state = TWI_READY; - - // activate internal pull-ups for twi - // as per note from atmega8 manual pg167 - sbi(PORTC, 4); - sbi(PORTC, 5); - - // initialize twi prescaler and bit rate - cbi(TWSR, TWPS0); // TWI Status Register - Prescaler bits - cbi(TWSR, TWPS1); - - /* twi bit rate formula from atmega128 manual pg 204 - SCL Frequency = CPU Clock Frequency / (16 + (2 * TWBR)) - note: TWBR should be 10 or higher for master mode - It is 72 for a 16mhz Wiring board with 100kHz TWI */ - - TWBR = ((CPU_FREQ / TWI_FREQ) - 16) / 2; // bitrate register - // enable twi module, acks, and twi interrupt - - TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA); - - /* TWEN - TWI Enable Bit - TWIE - TWI Interrupt Enable - TWEA - TWI Enable Acknowledge Bit - TWINT - TWI Interrupt Flag - TWSTA - TWI Start Condition - */ -} - -typedef struct { - uint8_t address; - uint8_t* data; - uint8_t length; - uint8_t wait; - uint8_t i; -} twi_Write_Vars; - -twi_Write_Vars* ptwv = 0; -static void (*fNextInterruptFunction)(void) = 0; - -void twi_Finish(byte bRetVal) { - if (ptwv) { - free(ptwv); - ptwv = 0; - } - twi_Done = 0xFF; - twi_Return_Value = bRetVal; - fNextInterruptFunction = 0; -} - -uint8_t twii_WaitForDone(uint16_t timeout) { - uint32_t endMillis = millis() + timeout; - while (!twi_Done && (timeout == 0 || millis() < endMillis)) { - continue; - } - return twi_Return_Value; -} - -void twii_SetState(uint8_t ucState) { - twi_state = ucState; -} - -void twii_SetError(uint8_t ucError) { - twi_error = ucError ; -} - -void twii_InitBuffer(uint8_t ucPos, uint8_t ucLength) { - twi_masterBufferIndex = 0; - twi_masterBufferLength = ucLength; -} - -void twii_CopyToBuf(uint8_t* pData, uint8_t ucLength) { - uint8_t i; - for (i = 0; i < ucLength; ++i) { - twi_masterBuffer[i] = pData[i]; - } -} - -void twii_CopyFromBuf(uint8_t* pData, uint8_t ucLength) { - uint8_t i; - for (i = 0; i < ucLength; ++i) { - pData[i] = twi_masterBuffer[i]; - } -} - -void twii_SetSlaRW(uint8_t ucSlaRW) { - twi_slarw = ucSlaRW; -} - -void twii_SetStart() { - TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA) | _BV(TWINT) | _BV(TWSTA); -} - -void twi_write01() { - if (TWI_MTX == twi_state) { - return; // blocking test - } - twi_transmitting = 0 ; - if (twi_error == 0xFF) { - twi_Finish(0); // success - } else if (twi_error == TW_MT_SLA_NACK) { - twi_Finish(2); // error: address send, nack received - } else if (twi_error == TW_MT_DATA_NACK) { - twi_Finish(3); // error: data send, nack received - } else { - twi_Finish(4); // other twi error - } - if (twi_cbendTransmissionDone) { - return twi_cbendTransmissionDone(twi_Return_Value); - } - return; -} - - -void twi_write00() { - if (TWI_READY != twi_state) { - return; // blocking test - } - if (TWI_BUFFER_LENGTH < ptwv -> length) { - twi_Finish(1); // end write with error 1 - return; - } - twi_Done = 0x00; // show as working - twii_SetState(TWI_MTX); // to transmitting - twii_SetError(0xFF); // to No Error - twii_InitBuffer(0, ptwv -> length); // pointer and length - twii_CopyToBuf(ptwv -> data, ptwv -> length); // get the data - twii_SetSlaRW((ptwv -> address << 1) | TW_WRITE); // write command - twii_SetStart(); // start the cycle - fNextInterruptFunction = twi_write01; // next routine - return twi_write01(); -} - -void twi_writeTo(uint8_t address, uint8_t* data, uint8_t length, uint8_t wait) { - uint8_t i; - ptwv = (twi_Write_Vars*)malloc(sizeof(twi_Write_Vars)); - ptwv -> address = address; - ptwv -> data = data; - ptwv -> length = length; - ptwv -> wait = wait; - fNextInterruptFunction = twi_write00; - return twi_write00(); -} - -void twi_read01() { - if (TWI_MRX == twi_state) { - return; // blocking test - } - if (twi_masterBufferIndex < ptwv -> length) { - ptwv -> length = twi_masterBufferIndex; - } - twii_CopyFromBuf(ptwv -> data, ptwv -> length); - twi_Finish(ptwv -> length); - if (twi_cbreadFromDone) { - return twi_cbreadFromDone(twi_Return_Value); - } - return; -} - -void twi_read00() { - if (TWI_READY != twi_state) { - return; // blocking test - } - if (TWI_BUFFER_LENGTH < ptwv -> length) { - twi_Finish(0); // error return - } - twi_Done = 0x00; // show as working - twii_SetState(TWI_MRX); // reading - twii_SetError(0xFF); // reset error - twii_InitBuffer(0, ptwv -> length - 1); // init to one less than length - twii_SetSlaRW((ptwv -> address << 1) | TW_READ); // read command - twii_SetStart(); // start cycle - fNextInterruptFunction = twi_read01; - return twi_read01(); -} - -void twi_readFrom(uint8_t address, uint8_t* data, uint8_t length) { - uint8_t i; - - ptwv = (twi_Write_Vars*)malloc(sizeof(twi_Write_Vars)); - ptwv -> address = address; - ptwv -> data = data; - ptwv -> length = length; - fNextInterruptFunction = twi_read00; - return twi_read00(); -} - -void twi_reply(uint8_t ack) { - // transmit master read ready signal, with or without ack - if (ack) { - TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWINT) | _BV(TWEA); - } else { - TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWINT); - } -} - -void twi_stop(void) { - // send stop condition - TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA) | _BV(TWINT) | _BV(TWSTO); - - // wait for stop condition to be exectued on bus - // TWINT is not set after a stop condition! - while (TWCR & _BV(TWSTO)) { - continue; - } - - // update twi state - twi_state = TWI_READY; -} - -void twi_releaseBus(void) { - // release bus - TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA) | _BV(TWINT); - - // update twi state - twi_state = TWI_READY; -} - -SIGNAL(TWI_vect) { - switch (TW_STATUS) { - // All Master - case TW_START: // sent start condition - case TW_REP_START: // sent repeated start condition - // copy device address and r/w bit to output register and ack - TWDR = twi_slarw; - twi_reply(1); - break; - - // Master Transmitter - case TW_MT_SLA_ACK: // slave receiver acked address - case TW_MT_DATA_ACK: // slave receiver acked data - // if there is data to send, send it, otherwise stop - if (twi_masterBufferIndex < twi_masterBufferLength) { - // copy data to output register and ack - TWDR = twi_masterBuffer[twi_masterBufferIndex++]; - twi_reply(1); - } else { - twi_stop(); - } - break; - - case TW_MT_SLA_NACK: // address sent, nack received - twi_error = TW_MT_SLA_NACK; - twi_stop(); - break; - - case TW_MT_DATA_NACK: // data sent, nack received - twi_error = TW_MT_DATA_NACK; - twi_stop(); - break; - - case TW_MT_ARB_LOST: // lost bus arbitration - twi_error = TW_MT_ARB_LOST; - twi_releaseBus(); - break; - - // Master Receiver - case TW_MR_DATA_ACK: // data received, ack sent - // put byte into buffer - twi_masterBuffer[twi_masterBufferIndex++] = TWDR; - - case TW_MR_SLA_ACK: // address sent, ack received - // ack if more bytes are expected, otherwise nack - if (twi_masterBufferIndex < twi_masterBufferLength) { - twi_reply(1); - } else { - twi_reply(0); - } - break; - - case TW_MR_DATA_NACK: // data received, nack sent - // put final byte into buffer - twi_masterBuffer[twi_masterBufferIndex++] = TWDR; - - case TW_MR_SLA_NACK: // address sent, nack received - twi_stop(); - break; - - // TW_MR_ARB_LOST handled by TW_MT_ARB_LOST case - - // Slave Receiver (NOT IMPLEMENTED YET) - /* - case TW_SR_SLA_ACK: // addressed, returned ack - case TW_SR_GCALL_ACK: // addressed generally, returned ack - case TW_SR_ARB_LOST_SLA_ACK: // lost arbitration, returned ack - case TW_SR_ARB_LOST_GCALL_ACK: // lost arbitration, returned ack - // enter slave receiver mode - twi_state = TWI_SRX; - - // indicate that rx buffer can be overwritten and ack - twi_rxBufferIndex = 0; - twi_reply(1); - break; - - case TW_SR_DATA_ACK: // data received, returned ack - case TW_SR_GCALL_DATA_ACK: // data received generally, returned ack - // if there is still room in the rx buffer - if (twi_rxBufferIndex < TWI_BUFFER_LENGTH) { - // put byte in buffer and ack - twi_rxBuffer[twi_rxBufferIndex++] = TWDR; - twi_reply(1); - } else { - // otherwise nack - twi_reply(0); - } - break; - - case TW_SR_STOP: // stop or repeated start condition received - // put a null char after data if there's room - if (twi_rxBufferIndex < TWI_BUFFER_LENGTH) { - twi_rxBuffer[twi_rxBufferIndex] = 0; - } - - // sends ack and stops interface for clock stretching - twi_stop(); - - // callback to user defined callback - twi_onSlaveReceive(twi_rxBuffer, twi_rxBufferIndex); - - // since we submit rx buffer to "wire" library, we can reset it - twi_rxBufferIndex = 0; - - // ack future responses and leave slave receiver state - twi_releaseBus(); - break; - - case TW_SR_DATA_NACK: // data received, returned nack - case TW_SR_GCALL_DATA_NACK: // data received generally, returned nack - // nack back at master - twi_reply(0); - break; - - // Slave Transmitter - case TW_ST_SLA_ACK: // addressed, returned ack - case TW_ST_ARB_LOST_SLA_ACK: // arbitration lost, returned ack - // enter slave transmitter mode - twi_state = TWI_STX; - - // ready the tx buffer index for iteration - twi_txBufferIndex = 0; - - // set tx buffer length to be zero, to verify if user changes it - twi_txBufferLength = 0; - - // request for txBuffer to be filled and length to be set - // note: user must call twi_transmit(bytes, length) to do this - twi_onSlaveTransmit(); - - // if they didn't change buffer & length, initialize it - if (0 == twi_txBufferLength) { - twi_txBufferLength = 1; - twi_txBuffer[0] = 0x00; - } - - // transmit first byte from buffer, fall through - - case TW_ST_DATA_ACK: // byte sent, ack returned - // copy data to output register - TWDR = twi_txBuffer[twi_txBufferIndex++]; - - // if there is more to send, ack, otherwise nack - if (twi_txBufferIndex < twi_txBufferLength) { - twi_reply(1); - } else { - twi_reply(0); - } - break; - - case TW_ST_DATA_NACK: // received nack, we are done - case TW_ST_LAST_DATA: // received ack, but we are done already! - // ack future responses - twi_reply(1); - // leave slave receiver state - twi_state = TWI_READY; - break; - */ - - // all - case TW_NO_INFO: // no state information - break; - - case TW_BUS_ERROR: // bus error, illegal stop/start - twi_error = TW_BUS_ERROR; - twi_stop(); - break; - } - - if (fNextInterruptFunction) { - return fNextInterruptFunction(); - } -} - -TwoWire::TwoWire() { } - -void TwoWire::begin(void) { - rxBufferIndex = 0; - rxBufferLength = 0; - - txBufferIndex = 0; - txBufferLength = 0; - - twi_init(); -} - -void TwoWire::beginTransmission(uint8_t address) { - //beginTransmission((uint8_t)address); - - // indicate that we are transmitting - twi_transmitting = 1; - - // set address of targeted slave - txAddress = address; - - // reset tx buffer iterator vars - txBufferIndex = 0; - txBufferLength = 0; -} - -uint8_t TwoWire::endTransmission(uint16_t timeout) { - // transmit buffer (blocking) - //int8_t ret = - twi_cbendTransmissionDone = NULL; - twi_writeTo(txAddress, txBuffer, txBufferLength, 1); - int8_t ret = twii_WaitForDone(timeout); - - // reset tx buffer iterator vars - txBufferIndex = 0; - txBufferLength = 0; - - // indicate that we are done transmitting - // twi_transmitting = 0; - return ret; -} - -void TwoWire::nbendTransmission(void (*function)(int)) { - twi_cbendTransmissionDone = function; - twi_writeTo(txAddress, txBuffer, txBufferLength, 1); - return; -} - -void TwoWire::send(uint8_t data) { - if (twi_transmitting) { - // in master transmitter mode - // don't bother if buffer is full - if (txBufferLength >= NBWIRE_BUFFER_LENGTH) { - return; - } - - // put byte in tx buffer - txBuffer[txBufferIndex] = data; - ++txBufferIndex; - - // update amount in buffer - txBufferLength = txBufferIndex; - } else { - // in slave send mode - // reply to master - //twi_transmit(&data, 1); - } -} - -uint8_t TwoWire::receive(void) { - // default to returning null char - // for people using with char strings - uint8_t value = 0; - - // get each successive byte on each call - if (rxBufferIndex < rxBufferLength) { - value = rxBuffer[rxBufferIndex]; - ++rxBufferIndex; - } - - return value; -} - -uint8_t TwoWire::requestFrom(uint8_t address, int quantity, uint16_t timeout) { - // clamp to buffer length - if (quantity > NBWIRE_BUFFER_LENGTH) { - quantity = NBWIRE_BUFFER_LENGTH; - } - - // perform blocking read into buffer - twi_cbreadFromDone = NULL; - twi_readFrom(address, rxBuffer, quantity); - uint8_t read = twii_WaitForDone(timeout); - - // set rx buffer iterator vars - rxBufferIndex = 0; - rxBufferLength = read; - - return read; -} - -void TwoWire::nbrequestFrom(uint8_t address, int quantity, void (*function)(int)) { - // clamp to buffer length - if (quantity > NBWIRE_BUFFER_LENGTH) { - quantity = NBWIRE_BUFFER_LENGTH; - } - - // perform blocking read into buffer - twi_cbreadFromDone = function; - twi_readFrom(address, rxBuffer, quantity); - //uint8_t read = twii_WaitForDone(); - - // set rx buffer iterator vars - //rxBufferIndex = 0; - //rxBufferLength = read; - - rxBufferIndex = 0; - rxBufferLength = quantity; // this is a hack - - return; //read; -} - -uint8_t TwoWire::available(void) { - return rxBufferLength - rxBufferIndex; -} - -#endif diff --git a/labyrinthe/4-arduino_pyserial/etape1/4-labyrinthe-imu/I2Cdev.h b/labyrinthe/4-arduino_pyserial/etape1/4-labyrinthe-imu/I2Cdev.h deleted file mode 100755 index 9511fbb..0000000 --- a/labyrinthe/4-arduino_pyserial/etape1/4-labyrinthe-imu/I2Cdev.h +++ /dev/null @@ -1,272 +0,0 @@ -// I2Cdev library collection - Main I2C device class header file -// Abstracts bit and byte I2C R/W functions into a convenient class -// 6/9/2012 by Jeff Rowberg -// -// Changelog: -// 2012-06-09 - fix major issue with reading > 32 bytes at a time with Arduino Wire -// - add compiler warnings when using outdated or IDE or limited I2Cdev implementation -// 2011-11-01 - fix write*Bits mask calculation (thanks sasquatch @ Arduino forums) -// 2011-10-03 - added automatic Arduino version detection for ease of use -// 2011-10-02 - added Gene Knight's NBWire TwoWire class implementation with small modifications -// 2011-08-31 - added support for Arduino 1.0 Wire library (methods are different from 0.x) -// 2011-08-03 - added optional timeout parameter to read* methods to easily change from default -// 2011-08-02 - added support for 16-bit registers -// - fixed incorrect Doxygen comments on some methods -// - added timeout value for read operations (thanks mem @ Arduino forums) -// 2011-07-30 - changed read/write function structures to return success or byte counts -// - made all methods static for multi-device memory savings -// 2011-07-28 - initial release - -/* ============================================ - I2Cdev device library code is placed under the MIT license - Copyright (c) 2012 Jeff Rowberg - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. - =============================================== -*/ - -#ifndef _I2CDEV_H_ -#define _I2CDEV_H_ - -// ----------------------------------------------------------------------------- -// I2C interface implementation setting -// ----------------------------------------------------------------------------- -#define I2CDEV_IMPLEMENTATION I2CDEV_ARDUINO_WIRE - -// comment this out if you are using a non-optimal IDE/implementation setting -// but want the compiler to shut up about it -#define I2CDEV_IMPLEMENTATION_WARNINGS - -// ----------------------------------------------------------------------------- -// I2C interface implementation options -// ----------------------------------------------------------------------------- -#define I2CDEV_ARDUINO_WIRE 1 // Wire object from Arduino -#define I2CDEV_BUILTIN_NBWIRE 2 // Tweaked Wire object from Gene Knight's NBWire project -// ^^^ NBWire implementation is still buggy w/some interrupts! -#define I2CDEV_BUILTIN_FASTWIRE 3 // FastWire object from Francesco Ferrara's project -// ^^^ FastWire implementation in I2Cdev is INCOMPLETE! - -// ----------------------------------------------------------------------------- -// Arduino-style "Serial.print" debug constant (uncomment to enable) -// ----------------------------------------------------------------------------- -//#define I2CDEV_SERIAL_DEBUG - -#ifdef ARDUINO - #if ARDUINO < 100 - #include "WProgram.h" - #else - #include "Arduino.h" - #endif - #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE - #include - #endif -#else - #include "ArduinoWrapper.h" -#endif - -// support Arduino M0 -#ifndef BUFFER_LENGTH - #define BUFFER_LENGTH 64 -#endif - -// 1000ms default read timeout (modify with "I2Cdev::readTimeout = [ms];") -#define I2CDEV_DEFAULT_READ_TIMEOUT 1000 - -class I2Cdev { - public: - I2Cdev(); - - static int8_t readBit(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint8_t* data, - uint16_t timeout = I2Cdev::readTimeout); - static int8_t readBitW(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint16_t* data, - uint16_t timeout = I2Cdev::readTimeout); - static int8_t readBits(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint8_t* data, - uint16_t timeout = I2Cdev::readTimeout); - static int8_t readBitsW(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint16_t* data, - uint16_t timeout = I2Cdev::readTimeout); - static int8_t readByte(uint8_t devAddr, uint8_t regAddr, uint8_t* data, uint16_t timeout = I2Cdev::readTimeout); - static int8_t readWord(uint8_t devAddr, uint8_t regAddr, uint16_t* data, uint16_t timeout = I2Cdev::readTimeout); - static int8_t readBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8_t* data, - uint16_t timeout = I2Cdev::readTimeout); - static int8_t readWords(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint16_t* data, - uint16_t timeout = I2Cdev::readTimeout); - - static bool writeBit(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint8_t data); - static bool writeBitW(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint16_t data); - static bool writeBits(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint8_t data); - static bool writeBitsW(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint16_t data); - static bool writeByte(uint8_t devAddr, uint8_t regAddr, uint8_t data); - static bool writeWord(uint8_t devAddr, uint8_t regAddr, uint16_t data); - static bool writeBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8_t* data); - static bool writeWords(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint16_t* data); - - static uint16_t readTimeout; -}; - -#if I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE -////////////////////// -// FastWire 0.2 -// This is a library to help faster programs to read I2C devices. -// Copyright(C) 2011 -// Francesco Ferrara -////////////////////// - -/* Master */ -#define TW_START 0x08 -#define TW_REP_START 0x10 - -/* Master Transmitter */ -#define TW_MT_SLA_ACK 0x18 -#define TW_MT_SLA_NACK 0x20 -#define TW_MT_DATA_ACK 0x28 -#define TW_MT_DATA_NACK 0x30 -#define TW_MT_ARB_LOST 0x38 - -/* Master Receiver */ -#define TW_MR_ARB_LOST 0x38 -#define TW_MR_SLA_ACK 0x40 -#define TW_MR_SLA_NACK 0x48 -#define TW_MR_DATA_ACK 0x50 -#define TW_MR_DATA_NACK 0x58 - -#define TW_OK 0 -#define TW_ERROR 1 - -class Fastwire { - private: - static boolean waitInt(); - - public: - static void setup(int khz, boolean pullup); - static byte write(byte device, byte address, byte value); - static byte readBuf(byte device, byte address, byte* data, byte num); -}; -#endif - -#if I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_NBWIRE -// NBWire implementation based heavily on code by Gene Knight -// Originally posted on the Arduino forum at http://arduino.cc/forum/index.php/topic,70705.0.html -// Originally offered to the i2cdevlib project at http://arduino.cc/forum/index.php/topic,68210.30.html - -#define NBWIRE_BUFFER_LENGTH 32 - -class TwoWire { - private: - static uint8_t rxBuffer[]; - static uint8_t rxBufferIndex; - static uint8_t rxBufferLength; - - static uint8_t txAddress; - static uint8_t txBuffer[]; - static uint8_t txBufferIndex; - static uint8_t txBufferLength; - - // static uint8_t transmitting; - static void (*user_onRequest)(void); - static void (*user_onReceive)(int); - static void onRequestService(void); - static void onReceiveService(uint8_t*, int); - - public: - TwoWire(); - void begin(); - void begin(uint8_t); - void begin(int); - void beginTransmission(uint8_t); - //void beginTransmission(int); - uint8_t endTransmission(uint16_t timeout = 0); - void nbendTransmission(void (*function)(int)) ; - uint8_t requestFrom(uint8_t, int, uint16_t timeout = 0); - //uint8_t requestFrom(int, int); - void nbrequestFrom(uint8_t, int, void (*function)(int)); - void send(uint8_t); - void send(uint8_t*, uint8_t); - //void send(int); - void send(char*); - uint8_t available(void); - uint8_t receive(void); - void onReceive(void (*)(int)); - void onRequest(void (*)(void)); -}; - -#define TWI_READY 0 -#define TWI_MRX 1 -#define TWI_MTX 2 -#define TWI_SRX 3 -#define TWI_STX 4 - -#define TW_WRITE 0 -#define TW_READ 1 - -#define TW_MT_SLA_NACK 0x20 -#define TW_MT_DATA_NACK 0x30 - -#define CPU_FREQ 16000000L -#define TWI_FREQ 100000L -#define TWI_BUFFER_LENGTH 32 - -/* TWI Status is in TWSR, in the top 5 bits: TWS7 - TWS3 */ - -#define TW_STATUS_MASK (_BV(TWS7)|_BV(TWS6)|_BV(TWS5)|_BV(TWS4)|_BV(TWS3)) -#define TW_STATUS (TWSR & TW_STATUS_MASK) -#define TW_START 0x08 -#define TW_REP_START 0x10 -#define TW_MT_SLA_ACK 0x18 -#define TW_MT_SLA_NACK 0x20 -#define TW_MT_DATA_ACK 0x28 -#define TW_MT_DATA_NACK 0x30 -#define TW_MT_ARB_LOST 0x38 -#define TW_MR_ARB_LOST 0x38 -#define TW_MR_SLA_ACK 0x40 -#define TW_MR_SLA_NACK 0x48 -#define TW_MR_DATA_ACK 0x50 -#define TW_MR_DATA_NACK 0x58 -#define TW_ST_SLA_ACK 0xA8 -#define TW_ST_ARB_LOST_SLA_ACK 0xB0 -#define TW_ST_DATA_ACK 0xB8 -#define TW_ST_DATA_NACK 0xC0 -#define TW_ST_LAST_DATA 0xC8 -#define TW_SR_SLA_ACK 0x60 -#define TW_SR_ARB_LOST_SLA_ACK 0x68 -#define TW_SR_GCALL_ACK 0x70 -#define TW_SR_ARB_LOST_GCALL_ACK 0x78 -#define TW_SR_DATA_ACK 0x80 -#define TW_SR_DATA_NACK 0x88 -#define TW_SR_GCALL_DATA_ACK 0x90 -#define TW_SR_GCALL_DATA_NACK 0x98 -#define TW_SR_STOP 0xA0 -#define TW_NO_INFO 0xF8 -#define TW_BUS_ERROR 0x00 - -//#define _MMIO_BYTE(mem_addr) (*(volatile uint8_t *)(mem_addr)) -//#define _SFR_BYTE(sfr) _MMIO_BYTE(_SFR_ADDR(sfr)) - -#ifndef sbi // set bit - #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) -#endif // sbi - -#ifndef cbi // clear bit - #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) -#endif // cbi - -extern TwoWire Wire; - -#endif // I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_NBWIRE - -#endif /* _I2CDEV_H_ */ \ No newline at end of file diff --git a/labyrinthe/4-arduino_pyserial/etape1/4-labyrinthe-imu/MPU6050.cpp b/labyrinthe/4-arduino_pyserial/etape1/4-labyrinthe-imu/MPU6050.cpp deleted file mode 100644 index 6a0fd44..0000000 --- a/labyrinthe/4-arduino_pyserial/etape1/4-labyrinthe-imu/MPU6050.cpp +++ /dev/null @@ -1,3237 +0,0 @@ -// I2Cdev library collection - MPU6050 I2C device class -// Based on InvenSense MPU-6050 register map document rev. 2.0, 5/19/2011 (RM-MPU-6000A-00) -// 8/24/2011 by Jeff Rowberg -// Updates should (hopefully) always be available at https://github.com/jrowberg/i2cdevlib -// -// Changelog: -// ... - ongoing debug release - -// NOTE: THIS IS ONLY A PARIAL RELEASE. THIS DEVICE CLASS IS CURRENTLY UNDERGOING ACTIVE -// DEVELOPMENT AND IS STILL MISSING SOME IMPORTANT FEATURES. PLEASE KEEP THIS IN MIND IF -// YOU DECIDE TO USE THIS PARTICULAR CODE FOR ANYTHING. - -/* ============================================ - I2Cdev device library code is placed under the MIT license - Copyright (c) 2012 Jeff Rowberg - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. - =============================================== -*/ - -#include "MPU6050.h" - -/** Default constructor, uses default I2C address. - @see MPU6050_DEFAULT_ADDRESS -*/ -MPU6050::MPU6050() { - devAddr = MPU6050_DEFAULT_ADDRESS; -} - -/** Specific address constructor. - @param address I2C address - @see MPU6050_DEFAULT_ADDRESS - @see MPU6050_ADDRESS_AD0_LOW - @see MPU6050_ADDRESS_AD0_HIGH -*/ -MPU6050::MPU6050(uint8_t address) { - devAddr = address; -} - -/** Power on and prepare for general usage. - This will activate the device and take it out of sleep mode (which must be done - after start-up). This function also sets both the accelerometer and the gyroscope - to their most sensitive settings, namely +/- 2g and +/- 250 degrees/sec, and sets - the clock source to use the X Gyro for reference, which is slightly better than - the default internal clock source. -*/ -void MPU6050::initialize() { - setClockSource(MPU6050_CLOCK_PLL_XGYRO); - setFullScaleGyroRange(MPU6050_GYRO_FS_250); - setFullScaleAccelRange(MPU6050_ACCEL_FS_2); - setSleepEnabled(false); // thanks to Jack Elston for pointing this one out! -} - -/** Verify the I2C connection. - Make sure the device is connected and responds as expected. - @return True if connection is valid, false otherwise -*/ -bool MPU6050::testConnection() { - return getDeviceID() == 0x34; -} - -// AUX_VDDIO register (InvenSense demo code calls this RA_*G_OFFS_TC) - -/** Get the auxiliary I2C supply voltage level. - When set to 1, the auxiliary I2C bus high logic level is VDD. When cleared to - 0, the auxiliary I2C bus high logic level is VLOGIC. This does not apply to - the MPU-6000, which does not have a VLOGIC pin. - @return I2C supply voltage level (0=VLOGIC, 1=VDD) -*/ -uint8_t MPU6050::getAuxVDDIOLevel() { - I2Cdev::readBit(devAddr, MPU6050_RA_YG_OFFS_TC, MPU6050_TC_PWR_MODE_BIT, buffer); - return buffer[0]; -} -/** Set the auxiliary I2C supply voltage level. - When set to 1, the auxiliary I2C bus high logic level is VDD. When cleared to - 0, the auxiliary I2C bus high logic level is VLOGIC. This does not apply to - the MPU-6000, which does not have a VLOGIC pin. - @param level I2C supply voltage level (0=VLOGIC, 1=VDD) -*/ -void MPU6050::setAuxVDDIOLevel(uint8_t level) { - I2Cdev::writeBit(devAddr, MPU6050_RA_YG_OFFS_TC, MPU6050_TC_PWR_MODE_BIT, level); -} - -// SMPLRT_DIV register - -/** Get gyroscope output rate divider. - The sensor register output, FIFO output, DMP sampling, Motion detection, Zero - Motion detection, and Free Fall detection are all based on the Sample Rate. - The Sample Rate is generated by dividing the gyroscope output rate by - SMPLRT_DIV: - - Sample Rate = Gyroscope Output Rate / (1 + SMPLRT_DIV) - - where Gyroscope Output Rate = 8kHz when the DLPF is disabled (DLPF_CFG = 0 or - 7), and 1kHz when the DLPF is enabled (see Register 26). - - Note: The accelerometer output rate is 1kHz. This means that for a Sample - Rate greater than 1kHz, the same accelerometer sample may be output to the - FIFO, DMP, and sensor registers more than once. - - For a diagram of the gyroscope and accelerometer signal paths, see Section 8 - of the MPU-6000/MPU-6050 Product Specification document. - - @return Current sample rate - @see MPU6050_RA_SMPLRT_DIV -*/ -uint8_t MPU6050::getRate() { - I2Cdev::readByte(devAddr, MPU6050_RA_SMPLRT_DIV, buffer); - return buffer[0]; -} -/** Set gyroscope sample rate divider. - @param rate New sample rate divider - @see getRate() - @see MPU6050_RA_SMPLRT_DIV -*/ -void MPU6050::setRate(uint8_t rate) { - I2Cdev::writeByte(devAddr, MPU6050_RA_SMPLRT_DIV, rate); -} - -// CONFIG register - -/** Get external FSYNC configuration. - Configures the external Frame Synchronization (FSYNC) pin sampling. An - external signal connected to the FSYNC pin can be sampled by configuring - EXT_SYNC_SET. Signal changes to the FSYNC pin are latched so that short - strobes may be captured. The latched FSYNC signal will be sampled at the - Sampling Rate, as defined in register 25. After sampling, the latch will - reset to the current FSYNC signal state. - - The sampled value will be reported in place of the least significant bit in - a sensor data register determined by the value of EXT_SYNC_SET according to - the following table. - -
-    EXT_SYNC_SET | FSYNC Bit Location
-    -------------+-------------------
-    0            | Input disabled
-    1            | TEMP_OUT_L[0]
-    2            | GYRO_XOUT_L[0]
-    3            | GYRO_YOUT_L[0]
-    4            | GYRO_ZOUT_L[0]
-    5            | ACCEL_XOUT_L[0]
-    6            | ACCEL_YOUT_L[0]
-    7            | ACCEL_ZOUT_L[0]
-    
- - @return FSYNC configuration value -*/ -uint8_t MPU6050::getExternalFrameSync() { - I2Cdev::readBits(devAddr, MPU6050_RA_CONFIG, MPU6050_CFG_EXT_SYNC_SET_BIT, MPU6050_CFG_EXT_SYNC_SET_LENGTH, buffer); - return buffer[0]; -} -/** Set external FSYNC configuration. - @see getExternalFrameSync() - @see MPU6050_RA_CONFIG - @param sync New FSYNC configuration value -*/ -void MPU6050::setExternalFrameSync(uint8_t sync) { - I2Cdev::writeBits(devAddr, MPU6050_RA_CONFIG, MPU6050_CFG_EXT_SYNC_SET_BIT, MPU6050_CFG_EXT_SYNC_SET_LENGTH, sync); -} -/** Get digital low-pass filter configuration. - The DLPF_CFG parameter sets the digital low pass filter configuration. It - also determines the internal sampling rate used by the device as shown in - the table below. - - Note: The accelerometer output rate is 1kHz. This means that for a Sample - Rate greater than 1kHz, the same accelerometer sample may be output to the - FIFO, DMP, and sensor registers more than once. - -
-            |   ACCELEROMETER    |           GYROSCOPE
-    DLPF_CFG | Bandwidth | Delay  | Bandwidth | Delay  | Sample Rate
-    ---------+-----------+--------+-----------+--------+-------------
-    0        | 260Hz     | 0ms    | 256Hz     | 0.98ms | 8kHz
-    1        | 184Hz     | 2.0ms  | 188Hz     | 1.9ms  | 1kHz
-    2        | 94Hz      | 3.0ms  | 98Hz      | 2.8ms  | 1kHz
-    3        | 44Hz      | 4.9ms  | 42Hz      | 4.8ms  | 1kHz
-    4        | 21Hz      | 8.5ms  | 20Hz      | 8.3ms  | 1kHz
-    5        | 10Hz      | 13.8ms | 10Hz      | 13.4ms | 1kHz
-    6        | 5Hz       | 19.0ms | 5Hz       | 18.6ms | 1kHz
-    7        |   -- Reserved --   |   -- Reserved --   | Reserved
-    
- - @return DLFP configuration - @see MPU6050_RA_CONFIG - @see MPU6050_CFG_DLPF_CFG_BIT - @see MPU6050_CFG_DLPF_CFG_LENGTH -*/ -uint8_t MPU6050::getDLPFMode() { - I2Cdev::readBits(devAddr, MPU6050_RA_CONFIG, MPU6050_CFG_DLPF_CFG_BIT, MPU6050_CFG_DLPF_CFG_LENGTH, buffer); - return buffer[0]; -} -/** Set digital low-pass filter configuration. - @param mode New DLFP configuration setting - @see getDLPFBandwidth() - @see MPU6050_DLPF_BW_256 - @see MPU6050_RA_CONFIG - @see MPU6050_CFG_DLPF_CFG_BIT - @see MPU6050_CFG_DLPF_CFG_LENGTH -*/ -void MPU6050::setDLPFMode(uint8_t mode) { - I2Cdev::writeBits(devAddr, MPU6050_RA_CONFIG, MPU6050_CFG_DLPF_CFG_BIT, MPU6050_CFG_DLPF_CFG_LENGTH, mode); -} - -// GYRO_CONFIG register - -/** Get full-scale gyroscope range. - The FS_SEL parameter allows setting the full-scale range of the gyro sensors, - as described in the table below. - -
-    0 = +/- 250 degrees/sec
-    1 = +/- 500 degrees/sec
-    2 = +/- 1000 degrees/sec
-    3 = +/- 2000 degrees/sec
-    
- - @return Current full-scale gyroscope range setting - @see MPU6050_GYRO_FS_250 - @see MPU6050_RA_GYRO_CONFIG - @see MPU6050_GCONFIG_FS_SEL_BIT - @see MPU6050_GCONFIG_FS_SEL_LENGTH -*/ -uint8_t MPU6050::getFullScaleGyroRange() { - I2Cdev::readBits(devAddr, MPU6050_RA_GYRO_CONFIG, MPU6050_GCONFIG_FS_SEL_BIT, MPU6050_GCONFIG_FS_SEL_LENGTH, buffer); - return buffer[0]; -} -/** Set full-scale gyroscope range. - @param range New full-scale gyroscope range value - @see getFullScaleRange() - @see MPU6050_GYRO_FS_250 - @see MPU6050_RA_GYRO_CONFIG - @see MPU6050_GCONFIG_FS_SEL_BIT - @see MPU6050_GCONFIG_FS_SEL_LENGTH -*/ -void MPU6050::setFullScaleGyroRange(uint8_t range) { - I2Cdev::writeBits(devAddr, MPU6050_RA_GYRO_CONFIG, MPU6050_GCONFIG_FS_SEL_BIT, MPU6050_GCONFIG_FS_SEL_LENGTH, range); -} - -// ACCEL_CONFIG register - -/** Get self-test enabled setting for accelerometer X axis. - @return Self-test enabled value - @see MPU6050_RA_ACCEL_CONFIG -*/ -bool MPU6050::getAccelXSelfTest() { - I2Cdev::readBit(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_XA_ST_BIT, buffer); - return buffer[0]; -} -/** Get self-test enabled setting for accelerometer X axis. - @param enabled Self-test enabled value - @see MPU6050_RA_ACCEL_CONFIG -*/ -void MPU6050::setAccelXSelfTest(bool enabled) { - I2Cdev::writeBit(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_XA_ST_BIT, enabled); -} -/** Get self-test enabled value for accelerometer Y axis. - @return Self-test enabled value - @see MPU6050_RA_ACCEL_CONFIG -*/ -bool MPU6050::getAccelYSelfTest() { - I2Cdev::readBit(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_YA_ST_BIT, buffer); - return buffer[0]; -} -/** Get self-test enabled value for accelerometer Y axis. - @param enabled Self-test enabled value - @see MPU6050_RA_ACCEL_CONFIG -*/ -void MPU6050::setAccelYSelfTest(bool enabled) { - I2Cdev::writeBit(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_YA_ST_BIT, enabled); -} -/** Get self-test enabled value for accelerometer Z axis. - @return Self-test enabled value - @see MPU6050_RA_ACCEL_CONFIG -*/ -bool MPU6050::getAccelZSelfTest() { - I2Cdev::readBit(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_ZA_ST_BIT, buffer); - return buffer[0]; -} -/** Set self-test enabled value for accelerometer Z axis. - @param enabled Self-test enabled value - @see MPU6050_RA_ACCEL_CONFIG -*/ -void MPU6050::setAccelZSelfTest(bool enabled) { - I2Cdev::writeBit(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_ZA_ST_BIT, enabled); -} -/** Get full-scale accelerometer range. - The FS_SEL parameter allows setting the full-scale range of the accelerometer - sensors, as described in the table below. - -
-    0 = +/- 2g
-    1 = +/- 4g
-    2 = +/- 8g
-    3 = +/- 16g
-    
- - @return Current full-scale accelerometer range setting - @see MPU6050_ACCEL_FS_2 - @see MPU6050_RA_ACCEL_CONFIG - @see MPU6050_ACONFIG_AFS_SEL_BIT - @see MPU6050_ACONFIG_AFS_SEL_LENGTH -*/ -uint8_t MPU6050::getFullScaleAccelRange() { - I2Cdev::readBits(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_AFS_SEL_BIT, MPU6050_ACONFIG_AFS_SEL_LENGTH, buffer); - return buffer[0]; -} -/** Set full-scale accelerometer range. - @param range New full-scale accelerometer range setting - @see getFullScaleAccelRange() -*/ -void MPU6050::setFullScaleAccelRange(uint8_t range) { - I2Cdev::writeBits(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_AFS_SEL_BIT, MPU6050_ACONFIG_AFS_SEL_LENGTH, range); -} -/** Get the high-pass filter configuration. - The DHPF is a filter module in the path leading to motion detectors (Free - Fall, Motion threshold, and Zero Motion). The high pass filter output is not - available to the data registers (see Figure in Section 8 of the MPU-6000/ - MPU-6050 Product Specification document). - - The high pass filter has three modes: - -
-      Reset: The filter output settles to zero within one sample. This
-             effectively disables the high pass filter. This mode may be toggled
-             to quickly settle the filter.
-
-      On:    The high pass filter will pass signals above the cut off frequency.
-
-      Hold:  When triggered, the filter holds the present sample. The filter
-             output will be the difference between the input sample and the held
-             sample.
-    
- -
-    ACCEL_HPF | Filter Mode | Cut-off Frequency
-    ----------+-------------+------------------
-    0         | Reset       | None
-    1         | On          | 5Hz
-    2         | On          | 2.5Hz
-    3         | On          | 1.25Hz
-    4         | On          | 0.63Hz
-    7         | Hold        | None
-    
- - @return Current high-pass filter configuration - @see MPU6050_DHPF_RESET - @see MPU6050_RA_ACCEL_CONFIG -*/ -uint8_t MPU6050::getDHPFMode() { - I2Cdev::readBits(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_ACCEL_HPF_BIT, MPU6050_ACONFIG_ACCEL_HPF_LENGTH, - buffer); - return buffer[0]; -} -/** Set the high-pass filter configuration. - @param bandwidth New high-pass filter configuration - @see setDHPFMode() - @see MPU6050_DHPF_RESET - @see MPU6050_RA_ACCEL_CONFIG -*/ -void MPU6050::setDHPFMode(uint8_t bandwidth) { - I2Cdev::writeBits(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_ACCEL_HPF_BIT, MPU6050_ACONFIG_ACCEL_HPF_LENGTH, - bandwidth); -} - -// FF_THR register - -/** Get free-fall event acceleration threshold. - This register configures the detection threshold for Free Fall event - detection. The unit of FF_THR is 1LSB = 2mg. Free Fall is detected when the - absolute value of the accelerometer measurements for the three axes are each - less than the detection threshold. This condition increments the Free Fall - duration counter (Register 30). The Free Fall interrupt is triggered when the - Free Fall duration counter reaches the time specified in FF_DUR. - - For more details on the Free Fall detection interrupt, see Section 8.2 of the - MPU-6000/MPU-6050 Product Specification document as well as Registers 56 and - 58 of this document. - - @return Current free-fall acceleration threshold value (LSB = 2mg) - @see MPU6050_RA_FF_THR -*/ -uint8_t MPU6050::getFreefallDetectionThreshold() { - I2Cdev::readByte(devAddr, MPU6050_RA_FF_THR, buffer); - return buffer[0]; -} -/** Get free-fall event acceleration threshold. - @param threshold New free-fall acceleration threshold value (LSB = 2mg) - @see getFreefallDetectionThreshold() - @see MPU6050_RA_FF_THR -*/ -void MPU6050::setFreefallDetectionThreshold(uint8_t threshold) { - I2Cdev::writeByte(devAddr, MPU6050_RA_FF_THR, threshold); -} - -// FF_DUR register - -/** Get free-fall event duration threshold. - This register configures the duration counter threshold for Free Fall event - detection. The duration counter ticks at 1kHz, therefore FF_DUR has a unit - of 1 LSB = 1 ms. - - The Free Fall duration counter increments while the absolute value of the - accelerometer measurements are each less than the detection threshold - (Register 29). The Free Fall interrupt is triggered when the Free Fall - duration counter reaches the time specified in this register. - - For more details on the Free Fall detection interrupt, see Section 8.2 of - the MPU-6000/MPU-6050 Product Specification document as well as Registers 56 - and 58 of this document. - - @return Current free-fall duration threshold value (LSB = 1ms) - @see MPU6050_RA_FF_DUR -*/ -uint8_t MPU6050::getFreefallDetectionDuration() { - I2Cdev::readByte(devAddr, MPU6050_RA_FF_DUR, buffer); - return buffer[0]; -} -/** Get free-fall event duration threshold. - @param duration New free-fall duration threshold value (LSB = 1ms) - @see getFreefallDetectionDuration() - @see MPU6050_RA_FF_DUR -*/ -void MPU6050::setFreefallDetectionDuration(uint8_t duration) { - I2Cdev::writeByte(devAddr, MPU6050_RA_FF_DUR, duration); -} - -// MOT_THR register - -/** Get motion detection event acceleration threshold. - This register configures the detection threshold for Motion interrupt - generation. The unit of MOT_THR is 1LSB = 2mg. Motion is detected when the - absolute value of any of the accelerometer measurements exceeds this Motion - detection threshold. This condition increments the Motion detection duration - counter (Register 32). The Motion detection interrupt is triggered when the - Motion Detection counter reaches the time count specified in MOT_DUR - (Register 32). - - The Motion interrupt will indicate the axis and polarity of detected motion - in MOT_DETECT_STATUS (Register 97). - - For more details on the Motion detection interrupt, see Section 8.3 of the - MPU-6000/MPU-6050 Product Specification document as well as Registers 56 and - 58 of this document. - - @return Current motion detection acceleration threshold value (LSB = 2mg) - @see MPU6050_RA_MOT_THR -*/ -uint8_t MPU6050::getMotionDetectionThreshold() { - I2Cdev::readByte(devAddr, MPU6050_RA_MOT_THR, buffer); - return buffer[0]; -} -/** Set free-fall event acceleration threshold. - @param threshold New motion detection acceleration threshold value (LSB = 2mg) - @see getMotionDetectionThreshold() - @see MPU6050_RA_MOT_THR -*/ -void MPU6050::setMotionDetectionThreshold(uint8_t threshold) { - I2Cdev::writeByte(devAddr, MPU6050_RA_MOT_THR, threshold); -} - -// MOT_DUR register - -/** Get motion detection event duration threshold. - This register configures the duration counter threshold for Motion interrupt - generation. The duration counter ticks at 1 kHz, therefore MOT_DUR has a unit - of 1LSB = 1ms. The Motion detection duration counter increments when the - absolute value of any of the accelerometer measurements exceeds the Motion - detection threshold (Register 31). The Motion detection interrupt is - triggered when the Motion detection counter reaches the time count specified - in this register. - - For more details on the Motion detection interrupt, see Section 8.3 of the - MPU-6000/MPU-6050 Product Specification document. - - @return Current motion detection duration threshold value (LSB = 1ms) - @see MPU6050_RA_MOT_DUR -*/ -uint8_t MPU6050::getMotionDetectionDuration() { - I2Cdev::readByte(devAddr, MPU6050_RA_MOT_DUR, buffer); - return buffer[0]; -} -/** Set motion detection event duration threshold. - @param duration New motion detection duration threshold value (LSB = 1ms) - @see getMotionDetectionDuration() - @see MPU6050_RA_MOT_DUR -*/ -void MPU6050::setMotionDetectionDuration(uint8_t duration) { - I2Cdev::writeByte(devAddr, MPU6050_RA_MOT_DUR, duration); -} - -// ZRMOT_THR register - -/** Get zero motion detection event acceleration threshold. - This register configures the detection threshold for Zero Motion interrupt - generation. The unit of ZRMOT_THR is 1LSB = 2mg. Zero Motion is detected when - the absolute value of the accelerometer measurements for the 3 axes are each - less than the detection threshold. This condition increments the Zero Motion - duration counter (Register 34). The Zero Motion interrupt is triggered when - the Zero Motion duration counter reaches the time count specified in - ZRMOT_DUR (Register 34). - - Unlike Free Fall or Motion detection, Zero Motion detection triggers an - interrupt both when Zero Motion is first detected and when Zero Motion is no - longer detected. - - When a zero motion event is detected, a Zero Motion Status will be indicated - in the MOT_DETECT_STATUS register (Register 97). When a motion-to-zero-motion - condition is detected, the status bit is set to 1. When a zero-motion-to- - motion condition is detected, the status bit is set to 0. - - For more details on the Zero Motion detection interrupt, see Section 8.4 of - the MPU-6000/MPU-6050 Product Specification document as well as Registers 56 - and 58 of this document. - - @return Current zero motion detection acceleration threshold value (LSB = 2mg) - @see MPU6050_RA_ZRMOT_THR -*/ -uint8_t MPU6050::getZeroMotionDetectionThreshold() { - I2Cdev::readByte(devAddr, MPU6050_RA_ZRMOT_THR, buffer); - return buffer[0]; -} -/** Set zero motion detection event acceleration threshold. - @param threshold New zero motion detection acceleration threshold value (LSB = 2mg) - @see getZeroMotionDetectionThreshold() - @see MPU6050_RA_ZRMOT_THR -*/ -void MPU6050::setZeroMotionDetectionThreshold(uint8_t threshold) { - I2Cdev::writeByte(devAddr, MPU6050_RA_ZRMOT_THR, threshold); -} - -// ZRMOT_DUR register - -/** Get zero motion detection event duration threshold. - This register configures the duration counter threshold for Zero Motion - interrupt generation. The duration counter ticks at 16 Hz, therefore - ZRMOT_DUR has a unit of 1 LSB = 64 ms. The Zero Motion duration counter - increments while the absolute value of the accelerometer measurements are - each less than the detection threshold (Register 33). The Zero Motion - interrupt is triggered when the Zero Motion duration counter reaches the time - count specified in this register. - - For more details on the Zero Motion detection interrupt, see Section 8.4 of - the MPU-6000/MPU-6050 Product Specification document, as well as Registers 56 - and 58 of this document. - - @return Current zero motion detection duration threshold value (LSB = 64ms) - @see MPU6050_RA_ZRMOT_DUR -*/ -uint8_t MPU6050::getZeroMotionDetectionDuration() { - I2Cdev::readByte(devAddr, MPU6050_RA_ZRMOT_DUR, buffer); - return buffer[0]; -} -/** Set zero motion detection event duration threshold. - @param duration New zero motion detection duration threshold value (LSB = 1ms) - @see getZeroMotionDetectionDuration() - @see MPU6050_RA_ZRMOT_DUR -*/ -void MPU6050::setZeroMotionDetectionDuration(uint8_t duration) { - I2Cdev::writeByte(devAddr, MPU6050_RA_ZRMOT_DUR, duration); -} - -// FIFO_EN register - -/** Get temperature FIFO enabled value. - When set to 1, this bit enables TEMP_OUT_H and TEMP_OUT_L (Registers 65 and - 66) to be written into the FIFO buffer. - @return Current temperature FIFO enabled value - @see MPU6050_RA_FIFO_EN -*/ -bool MPU6050::getTempFIFOEnabled() { - I2Cdev::readBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_TEMP_FIFO_EN_BIT, buffer); - return buffer[0]; -} -/** Set temperature FIFO enabled value. - @param enabled New temperature FIFO enabled value - @see getTempFIFOEnabled() - @see MPU6050_RA_FIFO_EN -*/ -void MPU6050::setTempFIFOEnabled(bool enabled) { - I2Cdev::writeBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_TEMP_FIFO_EN_BIT, enabled); -} -/** Get gyroscope X-axis FIFO enabled value. - When set to 1, this bit enables GYRO_XOUT_H and GYRO_XOUT_L (Registers 67 and - 68) to be written into the FIFO buffer. - @return Current gyroscope X-axis FIFO enabled value - @see MPU6050_RA_FIFO_EN -*/ -bool MPU6050::getXGyroFIFOEnabled() { - I2Cdev::readBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_XG_FIFO_EN_BIT, buffer); - return buffer[0]; -} -/** Set gyroscope X-axis FIFO enabled value. - @param enabled New gyroscope X-axis FIFO enabled value - @see getXGyroFIFOEnabled() - @see MPU6050_RA_FIFO_EN -*/ -void MPU6050::setXGyroFIFOEnabled(bool enabled) { - I2Cdev::writeBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_XG_FIFO_EN_BIT, enabled); -} -/** Get gyroscope Y-axis FIFO enabled value. - When set to 1, this bit enables GYRO_YOUT_H and GYRO_YOUT_L (Registers 69 and - 70) to be written into the FIFO buffer. - @return Current gyroscope Y-axis FIFO enabled value - @see MPU6050_RA_FIFO_EN -*/ -bool MPU6050::getYGyroFIFOEnabled() { - I2Cdev::readBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_YG_FIFO_EN_BIT, buffer); - return buffer[0]; -} -/** Set gyroscope Y-axis FIFO enabled value. - @param enabled New gyroscope Y-axis FIFO enabled value - @see getYGyroFIFOEnabled() - @see MPU6050_RA_FIFO_EN -*/ -void MPU6050::setYGyroFIFOEnabled(bool enabled) { - I2Cdev::writeBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_YG_FIFO_EN_BIT, enabled); -} -/** Get gyroscope Z-axis FIFO enabled value. - When set to 1, this bit enables GYRO_ZOUT_H and GYRO_ZOUT_L (Registers 71 and - 72) to be written into the FIFO buffer. - @return Current gyroscope Z-axis FIFO enabled value - @see MPU6050_RA_FIFO_EN -*/ -bool MPU6050::getZGyroFIFOEnabled() { - I2Cdev::readBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_ZG_FIFO_EN_BIT, buffer); - return buffer[0]; -} -/** Set gyroscope Z-axis FIFO enabled value. - @param enabled New gyroscope Z-axis FIFO enabled value - @see getZGyroFIFOEnabled() - @see MPU6050_RA_FIFO_EN -*/ -void MPU6050::setZGyroFIFOEnabled(bool enabled) { - I2Cdev::writeBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_ZG_FIFO_EN_BIT, enabled); -} -/** Get accelerometer FIFO enabled value. - When set to 1, this bit enables ACCEL_XOUT_H, ACCEL_XOUT_L, ACCEL_YOUT_H, - ACCEL_YOUT_L, ACCEL_ZOUT_H, and ACCEL_ZOUT_L (Registers 59 to 64) to be - written into the FIFO buffer. - @return Current accelerometer FIFO enabled value - @see MPU6050_RA_FIFO_EN -*/ -bool MPU6050::getAccelFIFOEnabled() { - I2Cdev::readBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_ACCEL_FIFO_EN_BIT, buffer); - return buffer[0]; -} -/** Set accelerometer FIFO enabled value. - @param enabled New accelerometer FIFO enabled value - @see getAccelFIFOEnabled() - @see MPU6050_RA_FIFO_EN -*/ -void MPU6050::setAccelFIFOEnabled(bool enabled) { - I2Cdev::writeBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_ACCEL_FIFO_EN_BIT, enabled); -} -/** Get Slave 2 FIFO enabled value. - When set to 1, this bit enables EXT_SENS_DATA registers (Registers 73 to 96) - associated with Slave 2 to be written into the FIFO buffer. - @return Current Slave 2 FIFO enabled value - @see MPU6050_RA_FIFO_EN -*/ -bool MPU6050::getSlave2FIFOEnabled() { - I2Cdev::readBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_SLV2_FIFO_EN_BIT, buffer); - return buffer[0]; -} -/** Set Slave 2 FIFO enabled value. - @param enabled New Slave 2 FIFO enabled value - @see getSlave2FIFOEnabled() - @see MPU6050_RA_FIFO_EN -*/ -void MPU6050::setSlave2FIFOEnabled(bool enabled) { - I2Cdev::writeBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_SLV2_FIFO_EN_BIT, enabled); -} -/** Get Slave 1 FIFO enabled value. - When set to 1, this bit enables EXT_SENS_DATA registers (Registers 73 to 96) - associated with Slave 1 to be written into the FIFO buffer. - @return Current Slave 1 FIFO enabled value - @see MPU6050_RA_FIFO_EN -*/ -bool MPU6050::getSlave1FIFOEnabled() { - I2Cdev::readBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_SLV1_FIFO_EN_BIT, buffer); - return buffer[0]; -} -/** Set Slave 1 FIFO enabled value. - @param enabled New Slave 1 FIFO enabled value - @see getSlave1FIFOEnabled() - @see MPU6050_RA_FIFO_EN -*/ -void MPU6050::setSlave1FIFOEnabled(bool enabled) { - I2Cdev::writeBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_SLV1_FIFO_EN_BIT, enabled); -} -/** Get Slave 0 FIFO enabled value. - When set to 1, this bit enables EXT_SENS_DATA registers (Registers 73 to 96) - associated with Slave 0 to be written into the FIFO buffer. - @return Current Slave 0 FIFO enabled value - @see MPU6050_RA_FIFO_EN -*/ -bool MPU6050::getSlave0FIFOEnabled() { - I2Cdev::readBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_SLV0_FIFO_EN_BIT, buffer); - return buffer[0]; -} -/** Set Slave 0 FIFO enabled value. - @param enabled New Slave 0 FIFO enabled value - @see getSlave0FIFOEnabled() - @see MPU6050_RA_FIFO_EN -*/ -void MPU6050::setSlave0FIFOEnabled(bool enabled) { - I2Cdev::writeBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_SLV0_FIFO_EN_BIT, enabled); -} - -// I2C_MST_CTRL register - -/** Get multi-master enabled value. - Multi-master capability allows multiple I2C masters to operate on the same - bus. In circuits where multi-master capability is required, set MULT_MST_EN - to 1. This will increase current drawn by approximately 30uA. - - In circuits where multi-master capability is required, the state of the I2C - bus must always be monitored by each separate I2C Master. Before an I2C - Master can assume arbitration of the bus, it must first confirm that no other - I2C Master has arbitration of the bus. When MULT_MST_EN is set to 1, the - MPU-60X0's bus arbitration detection logic is turned on, enabling it to - detect when the bus is available. - - @return Current multi-master enabled value - @see MPU6050_RA_I2C_MST_CTRL -*/ -bool MPU6050::getMultiMasterEnabled() { - I2Cdev::readBit(devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_MULT_MST_EN_BIT, buffer); - return buffer[0]; -} -/** Set multi-master enabled value. - @param enabled New multi-master enabled value - @see getMultiMasterEnabled() - @see MPU6050_RA_I2C_MST_CTRL -*/ -void MPU6050::setMultiMasterEnabled(bool enabled) { - I2Cdev::writeBit(devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_MULT_MST_EN_BIT, enabled); -} -/** Get wait-for-external-sensor-data enabled value. - When the WAIT_FOR_ES bit is set to 1, the Data Ready interrupt will be - delayed until External Sensor data from the Slave Devices are loaded into the - EXT_SENS_DATA registers. This is used to ensure that both the internal sensor - data (i.e. from gyro and accel) and external sensor data have been loaded to - their respective data registers (i.e. the data is synced) when the Data Ready - interrupt is triggered. - - @return Current wait-for-external-sensor-data enabled value - @see MPU6050_RA_I2C_MST_CTRL -*/ -bool MPU6050::getWaitForExternalSensorEnabled() { - I2Cdev::readBit(devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_WAIT_FOR_ES_BIT, buffer); - return buffer[0]; -} -/** Set wait-for-external-sensor-data enabled value. - @param enabled New wait-for-external-sensor-data enabled value - @see getWaitForExternalSensorEnabled() - @see MPU6050_RA_I2C_MST_CTRL -*/ -void MPU6050::setWaitForExternalSensorEnabled(bool enabled) { - I2Cdev::writeBit(devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_WAIT_FOR_ES_BIT, enabled); -} -/** Get Slave 3 FIFO enabled value. - When set to 1, this bit enables EXT_SENS_DATA registers (Registers 73 to 96) - associated with Slave 3 to be written into the FIFO buffer. - @return Current Slave 3 FIFO enabled value - @see MPU6050_RA_MST_CTRL -*/ -bool MPU6050::getSlave3FIFOEnabled() { - I2Cdev::readBit(devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_SLV_3_FIFO_EN_BIT, buffer); - return buffer[0]; -} -/** Set Slave 3 FIFO enabled value. - @param enabled New Slave 3 FIFO enabled value - @see getSlave3FIFOEnabled() - @see MPU6050_RA_MST_CTRL -*/ -void MPU6050::setSlave3FIFOEnabled(bool enabled) { - I2Cdev::writeBit(devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_SLV_3_FIFO_EN_BIT, enabled); -} -/** Get slave read/write transition enabled value. - The I2C_MST_P_NSR bit configures the I2C Master's transition from one slave - read to the next slave read. If the bit equals 0, there will be a restart - between reads. If the bit equals 1, there will be a stop followed by a start - of the following read. When a write transaction follows a read transaction, - the stop followed by a start of the successive write will be always used. - - @return Current slave read/write transition enabled value - @see MPU6050_RA_I2C_MST_CTRL -*/ -bool MPU6050::getSlaveReadWriteTransitionEnabled() { - I2Cdev::readBit(devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_I2C_MST_P_NSR_BIT, buffer); - return buffer[0]; -} -/** Set slave read/write transition enabled value. - @param enabled New slave read/write transition enabled value - @see getSlaveReadWriteTransitionEnabled() - @see MPU6050_RA_I2C_MST_CTRL -*/ -void MPU6050::setSlaveReadWriteTransitionEnabled(bool enabled) { - I2Cdev::writeBit(devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_I2C_MST_P_NSR_BIT, enabled); -} -/** Get I2C master clock speed. - I2C_MST_CLK is a 4 bit unsigned value which configures a divider on the - MPU-60X0 internal 8MHz clock. It sets the I2C master clock speed according to - the following table: - -
-    I2C_MST_CLK | I2C Master Clock Speed | 8MHz Clock Divider
-    ------------+------------------------+-------------------
-    0           | 348kHz                 | 23
-    1           | 333kHz                 | 24
-    2           | 320kHz                 | 25
-    3           | 308kHz                 | 26
-    4           | 296kHz                 | 27
-    5           | 286kHz                 | 28
-    6           | 276kHz                 | 29
-    7           | 267kHz                 | 30
-    8           | 258kHz                 | 31
-    9           | 500kHz                 | 16
-    10          | 471kHz                 | 17
-    11          | 444kHz                 | 18
-    12          | 421kHz                 | 19
-    13          | 400kHz                 | 20
-    14          | 381kHz                 | 21
-    15          | 364kHz                 | 22
-    
- - @return Current I2C master clock speed - @see MPU6050_RA_I2C_MST_CTRL -*/ -uint8_t MPU6050::getMasterClockSpeed() { - I2Cdev::readBits(devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_I2C_MST_CLK_BIT, MPU6050_I2C_MST_CLK_LENGTH, buffer); - return buffer[0]; -} -/** Set I2C master clock speed. - @reparam speed Current I2C master clock speed - @see MPU6050_RA_I2C_MST_CTRL -*/ -void MPU6050::setMasterClockSpeed(uint8_t speed) { - I2Cdev::writeBits(devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_I2C_MST_CLK_BIT, MPU6050_I2C_MST_CLK_LENGTH, speed); -} - -// I2C_SLV* registers (Slave 0-3) - -/** Get the I2C address of the specified slave (0-3). - Note that Bit 7 (MSB) controls read/write mode. If Bit 7 is set, it's a read - operation, and if it is cleared, then it's a write operation. The remaining - bits (6-0) are the 7-bit device address of the slave device. - - In read mode, the result of the read is placed in the lowest available - EXT_SENS_DATA register. For further information regarding the allocation of - read results, please refer to the EXT_SENS_DATA register description - (Registers 73 - 96). - - The MPU-6050 supports a total of five slaves, but Slave 4 has unique - characteristics, and so it has its own functions (getSlave4* and setSlave4*). - - I2C data transactions are performed at the Sample Rate, as defined in - Register 25. The user is responsible for ensuring that I2C data transactions - to and from each enabled Slave can be completed within a single period of the - Sample Rate. - - The I2C slave access rate can be reduced relative to the Sample Rate. This - reduced access rate is determined by I2C_MST_DLY (Register 52). Whether a - slave's access rate is reduced relative to the Sample Rate is determined by - I2C_MST_DELAY_CTRL (Register 103). - - The processing order for the slaves is fixed. The sequence followed for - processing the slaves is Slave 0, Slave 1, Slave 2, Slave 3 and Slave 4. If a - particular Slave is disabled it will be skipped. - - Each slave can either be accessed at the sample rate or at a reduced sample - rate. In a case where some slaves are accessed at the Sample Rate and some - slaves are accessed at the reduced rate, the sequence of accessing the slaves - (Slave 0 to Slave 4) is still followed. However, the reduced rate slaves will - be skipped if their access rate dictates that they should not be accessed - during that particular cycle. For further information regarding the reduced - access rate, please refer to Register 52. Whether a slave is accessed at the - Sample Rate or at the reduced rate is determined by the Delay Enable bits in - Register 103. - - @param num Slave number (0-3) - @return Current address for specified slave - @see MPU6050_RA_I2C_SLV0_ADDR -*/ -uint8_t MPU6050::getSlaveAddress(uint8_t num) { - if (num > 3) { - return 0; - } - I2Cdev::readByte(devAddr, MPU6050_RA_I2C_SLV0_ADDR + num * 3, buffer); - return buffer[0]; -} -/** Set the I2C address of the specified slave (0-3). - @param num Slave number (0-3) - @param address New address for specified slave - @see getSlaveAddress() - @see MPU6050_RA_I2C_SLV0_ADDR -*/ -void MPU6050::setSlaveAddress(uint8_t num, uint8_t address) { - if (num > 3) { - return; - } - I2Cdev::writeByte(devAddr, MPU6050_RA_I2C_SLV0_ADDR + num * 3, address); -} -/** Get the active internal register for the specified slave (0-3). - Read/write operations for this slave will be done to whatever internal - register address is stored in this MPU register. - - The MPU-6050 supports a total of five slaves, but Slave 4 has unique - characteristics, and so it has its own functions. - - @param num Slave number (0-3) - @return Current active register for specified slave - @see MPU6050_RA_I2C_SLV0_REG -*/ -uint8_t MPU6050::getSlaveRegister(uint8_t num) { - if (num > 3) { - return 0; - } - I2Cdev::readByte(devAddr, MPU6050_RA_I2C_SLV0_REG + num * 3, buffer); - return buffer[0]; -} -/** Set the active internal register for the specified slave (0-3). - @param num Slave number (0-3) - @param reg New active register for specified slave - @see getSlaveRegister() - @see MPU6050_RA_I2C_SLV0_REG -*/ -void MPU6050::setSlaveRegister(uint8_t num, uint8_t reg) { - if (num > 3) { - return; - } - I2Cdev::writeByte(devAddr, MPU6050_RA_I2C_SLV0_REG + num * 3, reg); -} -/** Get the enabled value for the specified slave (0-3). - When set to 1, this bit enables Slave 0 for data transfer operations. When - cleared to 0, this bit disables Slave 0 from data transfer operations. - @param num Slave number (0-3) - @return Current enabled value for specified slave - @see MPU6050_RA_I2C_SLV0_CTRL -*/ -bool MPU6050::getSlaveEnabled(uint8_t num) { - if (num > 3) { - return 0; - } - I2Cdev::readBit(devAddr, MPU6050_RA_I2C_SLV0_CTRL + num * 3, MPU6050_I2C_SLV_EN_BIT, buffer); - return buffer[0]; -} -/** Set the enabled value for the specified slave (0-3). - @param num Slave number (0-3) - @param enabled New enabled value for specified slave - @see getSlaveEnabled() - @see MPU6050_RA_I2C_SLV0_CTRL -*/ -void MPU6050::setSlaveEnabled(uint8_t num, bool enabled) { - if (num > 3) { - return; - } - I2Cdev::writeBit(devAddr, MPU6050_RA_I2C_SLV0_CTRL + num * 3, MPU6050_I2C_SLV_EN_BIT, enabled); -} -/** Get word pair byte-swapping enabled for the specified slave (0-3). - When set to 1, this bit enables byte swapping. When byte swapping is enabled, - the high and low bytes of a word pair are swapped. Please refer to - I2C_SLV0_GRP for the pairing convention of the word pairs. When cleared to 0, - bytes transferred to and from Slave 0 will be written to EXT_SENS_DATA - registers in the order they were transferred. - - @param num Slave number (0-3) - @return Current word pair byte-swapping enabled value for specified slave - @see MPU6050_RA_I2C_SLV0_CTRL -*/ -bool MPU6050::getSlaveWordByteSwap(uint8_t num) { - if (num > 3) { - return 0; - } - I2Cdev::readBit(devAddr, MPU6050_RA_I2C_SLV0_CTRL + num * 3, MPU6050_I2C_SLV_BYTE_SW_BIT, buffer); - return buffer[0]; -} -/** Set word pair byte-swapping enabled for the specified slave (0-3). - @param num Slave number (0-3) - @param enabled New word pair byte-swapping enabled value for specified slave - @see getSlaveWordByteSwap() - @see MPU6050_RA_I2C_SLV0_CTRL -*/ -void MPU6050::setSlaveWordByteSwap(uint8_t num, bool enabled) { - if (num > 3) { - return; - } - I2Cdev::writeBit(devAddr, MPU6050_RA_I2C_SLV0_CTRL + num * 3, MPU6050_I2C_SLV_BYTE_SW_BIT, enabled); -} -/** Get write mode for the specified slave (0-3). - When set to 1, the transaction will read or write data only. When cleared to - 0, the transaction will write a register address prior to reading or writing - data. This should equal 0 when specifying the register address within the - Slave device to/from which the ensuing data transaction will take place. - - @param num Slave number (0-3) - @return Current write mode for specified slave (0 = register address + data, 1 = data only) - @see MPU6050_RA_I2C_SLV0_CTRL -*/ -bool MPU6050::getSlaveWriteMode(uint8_t num) { - if (num > 3) { - return 0; - } - I2Cdev::readBit(devAddr, MPU6050_RA_I2C_SLV0_CTRL + num * 3, MPU6050_I2C_SLV_REG_DIS_BIT, buffer); - return buffer[0]; -} -/** Set write mode for the specified slave (0-3). - @param num Slave number (0-3) - @param mode New write mode for specified slave (0 = register address + data, 1 = data only) - @see getSlaveWriteMode() - @see MPU6050_RA_I2C_SLV0_CTRL -*/ -void MPU6050::setSlaveWriteMode(uint8_t num, bool mode) { - if (num > 3) { - return; - } - I2Cdev::writeBit(devAddr, MPU6050_RA_I2C_SLV0_CTRL + num * 3, MPU6050_I2C_SLV_REG_DIS_BIT, mode); -} -/** Get word pair grouping order offset for the specified slave (0-3). - This sets specifies the grouping order of word pairs received from registers. - When cleared to 0, bytes from register addresses 0 and 1, 2 and 3, etc (even, - then odd register addresses) are paired to form a word. When set to 1, bytes - from register addresses are paired 1 and 2, 3 and 4, etc. (odd, then even - register addresses) are paired to form a word. - - @param num Slave number (0-3) - @return Current word pair grouping order offset for specified slave - @see MPU6050_RA_I2C_SLV0_CTRL -*/ -bool MPU6050::getSlaveWordGroupOffset(uint8_t num) { - if (num > 3) { - return 0; - } - I2Cdev::readBit(devAddr, MPU6050_RA_I2C_SLV0_CTRL + num * 3, MPU6050_I2C_SLV_GRP_BIT, buffer); - return buffer[0]; -} -/** Set word pair grouping order offset for the specified slave (0-3). - @param num Slave number (0-3) - @param enabled New word pair grouping order offset for specified slave - @see getSlaveWordGroupOffset() - @see MPU6050_RA_I2C_SLV0_CTRL -*/ -void MPU6050::setSlaveWordGroupOffset(uint8_t num, bool enabled) { - if (num > 3) { - return; - } - I2Cdev::writeBit(devAddr, MPU6050_RA_I2C_SLV0_CTRL + num * 3, MPU6050_I2C_SLV_GRP_BIT, enabled); -} -/** Get number of bytes to read for the specified slave (0-3). - Specifies the number of bytes transferred to and from Slave 0. Clearing this - bit to 0 is equivalent to disabling the register by writing 0 to I2C_SLV0_EN. - @param num Slave number (0-3) - @return Number of bytes to read for specified slave - @see MPU6050_RA_I2C_SLV0_CTRL -*/ -uint8_t MPU6050::getSlaveDataLength(uint8_t num) { - if (num > 3) { - return 0; - } - I2Cdev::readBits(devAddr, MPU6050_RA_I2C_SLV0_CTRL + num * 3, MPU6050_I2C_SLV_LEN_BIT, MPU6050_I2C_SLV_LEN_LENGTH, - buffer); - return buffer[0]; -} -/** Set number of bytes to read for the specified slave (0-3). - @param num Slave number (0-3) - @param length Number of bytes to read for specified slave - @see getSlaveDataLength() - @see MPU6050_RA_I2C_SLV0_CTRL -*/ -void MPU6050::setSlaveDataLength(uint8_t num, uint8_t length) { - if (num > 3) { - return; - } - I2Cdev::writeBits(devAddr, MPU6050_RA_I2C_SLV0_CTRL + num * 3, MPU6050_I2C_SLV_LEN_BIT, MPU6050_I2C_SLV_LEN_LENGTH, - length); -} - -// I2C_SLV* registers (Slave 4) - -/** Get the I2C address of Slave 4. - Note that Bit 7 (MSB) controls read/write mode. If Bit 7 is set, it's a read - operation, and if it is cleared, then it's a write operation. The remaining - bits (6-0) are the 7-bit device address of the slave device. - - @return Current address for Slave 4 - @see getSlaveAddress() - @see MPU6050_RA_I2C_SLV4_ADDR -*/ -uint8_t MPU6050::getSlave4Address() { - I2Cdev::readByte(devAddr, MPU6050_RA_I2C_SLV4_ADDR, buffer); - return buffer[0]; -} -/** Set the I2C address of Slave 4. - @param address New address for Slave 4 - @see getSlave4Address() - @see MPU6050_RA_I2C_SLV4_ADDR -*/ -void MPU6050::setSlave4Address(uint8_t address) { - I2Cdev::writeByte(devAddr, MPU6050_RA_I2C_SLV4_ADDR, address); -} -/** Get the active internal register for the Slave 4. - Read/write operations for this slave will be done to whatever internal - register address is stored in this MPU register. - - @return Current active register for Slave 4 - @see MPU6050_RA_I2C_SLV4_REG -*/ -uint8_t MPU6050::getSlave4Register() { - I2Cdev::readByte(devAddr, MPU6050_RA_I2C_SLV4_REG, buffer); - return buffer[0]; -} -/** Set the active internal register for Slave 4. - @param reg New active register for Slave 4 - @see getSlave4Register() - @see MPU6050_RA_I2C_SLV4_REG -*/ -void MPU6050::setSlave4Register(uint8_t reg) { - I2Cdev::writeByte(devAddr, MPU6050_RA_I2C_SLV4_REG, reg); -} -/** Set new byte to write to Slave 4. - This register stores the data to be written into the Slave 4. If I2C_SLV4_RW - is set 1 (set to read), this register has no effect. - @param data New byte to write to Slave 4 - @see MPU6050_RA_I2C_SLV4_DO -*/ -void MPU6050::setSlave4OutputByte(uint8_t data) { - I2Cdev::writeByte(devAddr, MPU6050_RA_I2C_SLV4_DO, data); -} -/** Get the enabled value for the Slave 4. - When set to 1, this bit enables Slave 4 for data transfer operations. When - cleared to 0, this bit disables Slave 4 from data transfer operations. - @return Current enabled value for Slave 4 - @see MPU6050_RA_I2C_SLV4_CTRL -*/ -bool MPU6050::getSlave4Enabled() { - I2Cdev::readBit(devAddr, MPU6050_RA_I2C_SLV4_CTRL, MPU6050_I2C_SLV4_EN_BIT, buffer); - return buffer[0]; -} -/** Set the enabled value for Slave 4. - @param enabled New enabled value for Slave 4 - @see getSlave4Enabled() - @see MPU6050_RA_I2C_SLV4_CTRL -*/ -void MPU6050::setSlave4Enabled(bool enabled) { - I2Cdev::writeBit(devAddr, MPU6050_RA_I2C_SLV4_CTRL, MPU6050_I2C_SLV4_EN_BIT, enabled); -} -/** Get the enabled value for Slave 4 transaction interrupts. - When set to 1, this bit enables the generation of an interrupt signal upon - completion of a Slave 4 transaction. When cleared to 0, this bit disables the - generation of an interrupt signal upon completion of a Slave 4 transaction. - The interrupt status can be observed in Register 54. - - @return Current enabled value for Slave 4 transaction interrupts. - @see MPU6050_RA_I2C_SLV4_CTRL -*/ -bool MPU6050::getSlave4InterruptEnabled() { - I2Cdev::readBit(devAddr, MPU6050_RA_I2C_SLV4_CTRL, MPU6050_I2C_SLV4_INT_EN_BIT, buffer); - return buffer[0]; -} -/** Set the enabled value for Slave 4 transaction interrupts. - @param enabled New enabled value for Slave 4 transaction interrupts. - @see getSlave4InterruptEnabled() - @see MPU6050_RA_I2C_SLV4_CTRL -*/ -void MPU6050::setSlave4InterruptEnabled(bool enabled) { - I2Cdev::writeBit(devAddr, MPU6050_RA_I2C_SLV4_CTRL, MPU6050_I2C_SLV4_INT_EN_BIT, enabled); -} -/** Get write mode for Slave 4. - When set to 1, the transaction will read or write data only. When cleared to - 0, the transaction will write a register address prior to reading or writing - data. This should equal 0 when specifying the register address within the - Slave device to/from which the ensuing data transaction will take place. - - @return Current write mode for Slave 4 (0 = register address + data, 1 = data only) - @see MPU6050_RA_I2C_SLV4_CTRL -*/ -bool MPU6050::getSlave4WriteMode() { - I2Cdev::readBit(devAddr, MPU6050_RA_I2C_SLV4_CTRL, MPU6050_I2C_SLV4_REG_DIS_BIT, buffer); - return buffer[0]; -} -/** Set write mode for the Slave 4. - @param mode New write mode for Slave 4 (0 = register address + data, 1 = data only) - @see getSlave4WriteMode() - @see MPU6050_RA_I2C_SLV4_CTRL -*/ -void MPU6050::setSlave4WriteMode(bool mode) { - I2Cdev::writeBit(devAddr, MPU6050_RA_I2C_SLV4_CTRL, MPU6050_I2C_SLV4_REG_DIS_BIT, mode); -} -/** Get Slave 4 master delay value. - This configures the reduced access rate of I2C slaves relative to the Sample - Rate. When a slave's access rate is decreased relative to the Sample Rate, - the slave is accessed every: - - 1 / (1 + I2C_MST_DLY) samples - - This base Sample Rate in turn is determined by SMPLRT_DIV (register 25) and - DLPF_CFG (register 26). Whether a slave's access rate is reduced relative to - the Sample Rate is determined by I2C_MST_DELAY_CTRL (register 103). For - further information regarding the Sample Rate, please refer to register 25. - - @return Current Slave 4 master delay value - @see MPU6050_RA_I2C_SLV4_CTRL -*/ -uint8_t MPU6050::getSlave4MasterDelay() { - I2Cdev::readBits(devAddr, MPU6050_RA_I2C_SLV4_CTRL, MPU6050_I2C_SLV4_MST_DLY_BIT, MPU6050_I2C_SLV4_MST_DLY_LENGTH, - buffer); - return buffer[0]; -} -/** Set Slave 4 master delay value. - @param delay New Slave 4 master delay value - @see getSlave4MasterDelay() - @see MPU6050_RA_I2C_SLV4_CTRL -*/ -void MPU6050::setSlave4MasterDelay(uint8_t delay) { - I2Cdev::writeBits(devAddr, MPU6050_RA_I2C_SLV4_CTRL, MPU6050_I2C_SLV4_MST_DLY_BIT, MPU6050_I2C_SLV4_MST_DLY_LENGTH, - delay); -} -/** Get last available byte read from Slave 4. - This register stores the data read from Slave 4. This field is populated - after a read transaction. - @return Last available byte read from to Slave 4 - @see MPU6050_RA_I2C_SLV4_DI -*/ -uint8_t MPU6050::getSlate4InputByte() { - I2Cdev::readByte(devAddr, MPU6050_RA_I2C_SLV4_DI, buffer); - return buffer[0]; -} - -// I2C_MST_STATUS register - -/** Get FSYNC interrupt status. - This bit reflects the status of the FSYNC interrupt from an external device - into the MPU-60X0. This is used as a way to pass an external interrupt - through the MPU-60X0 to the host application processor. When set to 1, this - bit will cause an interrupt if FSYNC_INT_EN is asserted in INT_PIN_CFG - (Register 55). - @return FSYNC interrupt status - @see MPU6050_RA_I2C_MST_STATUS -*/ -bool MPU6050::getPassthroughStatus() { - I2Cdev::readBit(devAddr, MPU6050_RA_I2C_MST_STATUS, MPU6050_MST_PASS_THROUGH_BIT, buffer); - return buffer[0]; -} -/** Get Slave 4 transaction done status. - Automatically sets to 1 when a Slave 4 transaction has completed. This - triggers an interrupt if the I2C_MST_INT_EN bit in the INT_ENABLE register - (Register 56) is asserted and if the SLV_4_DONE_INT bit is asserted in the - I2C_SLV4_CTRL register (Register 52). - @return Slave 4 transaction done status - @see MPU6050_RA_I2C_MST_STATUS -*/ -bool MPU6050::getSlave4IsDone() { - I2Cdev::readBit(devAddr, MPU6050_RA_I2C_MST_STATUS, MPU6050_MST_I2C_SLV4_DONE_BIT, buffer); - return buffer[0]; -} -/** Get master arbitration lost status. - This bit automatically sets to 1 when the I2C Master has lost arbitration of - the auxiliary I2C bus (an error condition). This triggers an interrupt if the - I2C_MST_INT_EN bit in the INT_ENABLE register (Register 56) is asserted. - @return Master arbitration lost status - @see MPU6050_RA_I2C_MST_STATUS -*/ -bool MPU6050::getLostArbitration() { - I2Cdev::readBit(devAddr, MPU6050_RA_I2C_MST_STATUS, MPU6050_MST_I2C_LOST_ARB_BIT, buffer); - return buffer[0]; -} -/** Get Slave 4 NACK status. - This bit automatically sets to 1 when the I2C Master receives a NACK in a - transaction with Slave 4. This triggers an interrupt if the I2C_MST_INT_EN - bit in the INT_ENABLE register (Register 56) is asserted. - @return Slave 4 NACK interrupt status - @see MPU6050_RA_I2C_MST_STATUS -*/ -bool MPU6050::getSlave4Nack() { - I2Cdev::readBit(devAddr, MPU6050_RA_I2C_MST_STATUS, MPU6050_MST_I2C_SLV4_NACK_BIT, buffer); - return buffer[0]; -} -/** Get Slave 3 NACK status. - This bit automatically sets to 1 when the I2C Master receives a NACK in a - transaction with Slave 3. This triggers an interrupt if the I2C_MST_INT_EN - bit in the INT_ENABLE register (Register 56) is asserted. - @return Slave 3 NACK interrupt status - @see MPU6050_RA_I2C_MST_STATUS -*/ -bool MPU6050::getSlave3Nack() { - I2Cdev::readBit(devAddr, MPU6050_RA_I2C_MST_STATUS, MPU6050_MST_I2C_SLV3_NACK_BIT, buffer); - return buffer[0]; -} -/** Get Slave 2 NACK status. - This bit automatically sets to 1 when the I2C Master receives a NACK in a - transaction with Slave 2. This triggers an interrupt if the I2C_MST_INT_EN - bit in the INT_ENABLE register (Register 56) is asserted. - @return Slave 2 NACK interrupt status - @see MPU6050_RA_I2C_MST_STATUS -*/ -bool MPU6050::getSlave2Nack() { - I2Cdev::readBit(devAddr, MPU6050_RA_I2C_MST_STATUS, MPU6050_MST_I2C_SLV2_NACK_BIT, buffer); - return buffer[0]; -} -/** Get Slave 1 NACK status. - This bit automatically sets to 1 when the I2C Master receives a NACK in a - transaction with Slave 1. This triggers an interrupt if the I2C_MST_INT_EN - bit in the INT_ENABLE register (Register 56) is asserted. - @return Slave 1 NACK interrupt status - @see MPU6050_RA_I2C_MST_STATUS -*/ -bool MPU6050::getSlave1Nack() { - I2Cdev::readBit(devAddr, MPU6050_RA_I2C_MST_STATUS, MPU6050_MST_I2C_SLV1_NACK_BIT, buffer); - return buffer[0]; -} -/** Get Slave 0 NACK status. - This bit automatically sets to 1 when the I2C Master receives a NACK in a - transaction with Slave 0. This triggers an interrupt if the I2C_MST_INT_EN - bit in the INT_ENABLE register (Register 56) is asserted. - @return Slave 0 NACK interrupt status - @see MPU6050_RA_I2C_MST_STATUS -*/ -bool MPU6050::getSlave0Nack() { - I2Cdev::readBit(devAddr, MPU6050_RA_I2C_MST_STATUS, MPU6050_MST_I2C_SLV0_NACK_BIT, buffer); - return buffer[0]; -} - -// INT_PIN_CFG register - -/** Get interrupt logic level mode. - Will be set 0 for active-high, 1 for active-low. - @return Current interrupt mode (0=active-high, 1=active-low) - @see MPU6050_RA_INT_PIN_CFG - @see MPU6050_INTCFG_INT_LEVEL_BIT -*/ -bool MPU6050::getInterruptMode() { - I2Cdev::readBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_INT_LEVEL_BIT, buffer); - return buffer[0]; -} -/** Set interrupt logic level mode. - @param mode New interrupt mode (0=active-high, 1=active-low) - @see getInterruptMode() - @see MPU6050_RA_INT_PIN_CFG - @see MPU6050_INTCFG_INT_LEVEL_BIT -*/ -void MPU6050::setInterruptMode(bool mode) { - I2Cdev::writeBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_INT_LEVEL_BIT, mode); -} -/** Get interrupt drive mode. - Will be set 0 for push-pull, 1 for open-drain. - @return Current interrupt drive mode (0=push-pull, 1=open-drain) - @see MPU6050_RA_INT_PIN_CFG - @see MPU6050_INTCFG_INT_OPEN_BIT -*/ -bool MPU6050::getInterruptDrive() { - I2Cdev::readBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_INT_OPEN_BIT, buffer); - return buffer[0]; -} -/** Set interrupt drive mode. - @param drive New interrupt drive mode (0=push-pull, 1=open-drain) - @see getInterruptDrive() - @see MPU6050_RA_INT_PIN_CFG - @see MPU6050_INTCFG_INT_OPEN_BIT -*/ -void MPU6050::setInterruptDrive(bool drive) { - I2Cdev::writeBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_INT_OPEN_BIT, drive); -} -/** Get interrupt latch mode. - Will be set 0 for 50us-pulse, 1 for latch-until-int-cleared. - @return Current latch mode (0=50us-pulse, 1=latch-until-int-cleared) - @see MPU6050_RA_INT_PIN_CFG - @see MPU6050_INTCFG_LATCH_INT_EN_BIT -*/ -bool MPU6050::getInterruptLatch() { - I2Cdev::readBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_LATCH_INT_EN_BIT, buffer); - return buffer[0]; -} -/** Set interrupt latch mode. - @param latch New latch mode (0=50us-pulse, 1=latch-until-int-cleared) - @see getInterruptLatch() - @see MPU6050_RA_INT_PIN_CFG - @see MPU6050_INTCFG_LATCH_INT_EN_BIT -*/ -void MPU6050::setInterruptLatch(bool latch) { - I2Cdev::writeBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_LATCH_INT_EN_BIT, latch); -} -/** Get interrupt latch clear mode. - Will be set 0 for status-read-only, 1 for any-register-read. - @return Current latch clear mode (0=status-read-only, 1=any-register-read) - @see MPU6050_RA_INT_PIN_CFG - @see MPU6050_INTCFG_INT_RD_CLEAR_BIT -*/ -bool MPU6050::getInterruptLatchClear() { - I2Cdev::readBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_INT_RD_CLEAR_BIT, buffer); - return buffer[0]; -} -/** Set interrupt latch clear mode. - @param clear New latch clear mode (0=status-read-only, 1=any-register-read) - @see getInterruptLatchClear() - @see MPU6050_RA_INT_PIN_CFG - @see MPU6050_INTCFG_INT_RD_CLEAR_BIT -*/ -void MPU6050::setInterruptLatchClear(bool clear) { - I2Cdev::writeBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_INT_RD_CLEAR_BIT, clear); -} -/** Get FSYNC interrupt logic level mode. - @return Current FSYNC interrupt mode (0=active-high, 1=active-low) - @see getFSyncInterruptMode() - @see MPU6050_RA_INT_PIN_CFG - @see MPU6050_INTCFG_FSYNC_INT_LEVEL_BIT -*/ -bool MPU6050::getFSyncInterruptLevel() { - I2Cdev::readBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_FSYNC_INT_LEVEL_BIT, buffer); - return buffer[0]; -} -/** Set FSYNC interrupt logic level mode. - @param mode New FSYNC interrupt mode (0=active-high, 1=active-low) - @see getFSyncInterruptMode() - @see MPU6050_RA_INT_PIN_CFG - @see MPU6050_INTCFG_FSYNC_INT_LEVEL_BIT -*/ -void MPU6050::setFSyncInterruptLevel(bool level) { - I2Cdev::writeBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_FSYNC_INT_LEVEL_BIT, level); -} -/** Get FSYNC pin interrupt enabled setting. - Will be set 0 for disabled, 1 for enabled. - @return Current interrupt enabled setting - @see MPU6050_RA_INT_PIN_CFG - @see MPU6050_INTCFG_FSYNC_INT_EN_BIT -*/ -bool MPU6050::getFSyncInterruptEnabled() { - I2Cdev::readBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_FSYNC_INT_EN_BIT, buffer); - return buffer[0]; -} -/** Set FSYNC pin interrupt enabled setting. - @param enabled New FSYNC pin interrupt enabled setting - @see getFSyncInterruptEnabled() - @see MPU6050_RA_INT_PIN_CFG - @see MPU6050_INTCFG_FSYNC_INT_EN_BIT -*/ -void MPU6050::setFSyncInterruptEnabled(bool enabled) { - I2Cdev::writeBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_FSYNC_INT_EN_BIT, enabled); -} -/** Get I2C bypass enabled status. - When this bit is equal to 1 and I2C_MST_EN (Register 106 bit[5]) is equal to - 0, the host application processor will be able to directly access the - auxiliary I2C bus of the MPU-60X0. When this bit is equal to 0, the host - application processor will not be able to directly access the auxiliary I2C - bus of the MPU-60X0 regardless of the state of I2C_MST_EN (Register 106 - bit[5]). - @return Current I2C bypass enabled status - @see MPU6050_RA_INT_PIN_CFG - @see MPU6050_INTCFG_I2C_BYPASS_EN_BIT -*/ -bool MPU6050::getI2CBypassEnabled() { - I2Cdev::readBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_I2C_BYPASS_EN_BIT, buffer); - return buffer[0]; -} -/** Set I2C bypass enabled status. - When this bit is equal to 1 and I2C_MST_EN (Register 106 bit[5]) is equal to - 0, the host application processor will be able to directly access the - auxiliary I2C bus of the MPU-60X0. When this bit is equal to 0, the host - application processor will not be able to directly access the auxiliary I2C - bus of the MPU-60X0 regardless of the state of I2C_MST_EN (Register 106 - bit[5]). - @param enabled New I2C bypass enabled status - @see MPU6050_RA_INT_PIN_CFG - @see MPU6050_INTCFG_I2C_BYPASS_EN_BIT -*/ -void MPU6050::setI2CBypassEnabled(bool enabled) { - I2Cdev::writeBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_I2C_BYPASS_EN_BIT, enabled); -} -/** Get reference clock output enabled status. - When this bit is equal to 1, a reference clock output is provided at the - CLKOUT pin. When this bit is equal to 0, the clock output is disabled. For - further information regarding CLKOUT, please refer to the MPU-60X0 Product - Specification document. - @return Current reference clock output enabled status - @see MPU6050_RA_INT_PIN_CFG - @see MPU6050_INTCFG_CLKOUT_EN_BIT -*/ -bool MPU6050::getClockOutputEnabled() { - I2Cdev::readBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_CLKOUT_EN_BIT, buffer); - return buffer[0]; -} -/** Set reference clock output enabled status. - When this bit is equal to 1, a reference clock output is provided at the - CLKOUT pin. When this bit is equal to 0, the clock output is disabled. For - further information regarding CLKOUT, please refer to the MPU-60X0 Product - Specification document. - @param enabled New reference clock output enabled status - @see MPU6050_RA_INT_PIN_CFG - @see MPU6050_INTCFG_CLKOUT_EN_BIT -*/ -void MPU6050::setClockOutputEnabled(bool enabled) { - I2Cdev::writeBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_CLKOUT_EN_BIT, enabled); -} - -// INT_ENABLE register - -/** Get full interrupt enabled status. - Full register byte for all interrupts, for quick reading. Each bit will be - set 0 for disabled, 1 for enabled. - @return Current interrupt enabled status - @see MPU6050_RA_INT_ENABLE - @see MPU6050_INTERRUPT_FF_BIT - **/ -uint8_t MPU6050::getIntEnabled() { - I2Cdev::readByte(devAddr, MPU6050_RA_INT_ENABLE, buffer); - return buffer[0]; -} -/** Set full interrupt enabled status. - Full register byte for all interrupts, for quick reading. Each bit should be - set 0 for disabled, 1 for enabled. - @param enabled New interrupt enabled status - @see getIntFreefallEnabled() - @see MPU6050_RA_INT_ENABLE - @see MPU6050_INTERRUPT_FF_BIT - **/ -void MPU6050::setIntEnabled(uint8_t enabled) { - I2Cdev::writeByte(devAddr, MPU6050_RA_INT_ENABLE, enabled); -} -/** Get Free Fall interrupt enabled status. - Will be set 0 for disabled, 1 for enabled. - @return Current interrupt enabled status - @see MPU6050_RA_INT_ENABLE - @see MPU6050_INTERRUPT_FF_BIT - **/ -bool MPU6050::getIntFreefallEnabled() { - I2Cdev::readBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_FF_BIT, buffer); - return buffer[0]; -} -/** Set Free Fall interrupt enabled status. - @param enabled New interrupt enabled status - @see getIntFreefallEnabled() - @see MPU6050_RA_INT_ENABLE - @see MPU6050_INTERRUPT_FF_BIT - **/ -void MPU6050::setIntFreefallEnabled(bool enabled) { - I2Cdev::writeBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_FF_BIT, enabled); -} -/** Get Motion Detection interrupt enabled status. - Will be set 0 for disabled, 1 for enabled. - @return Current interrupt enabled status - @see MPU6050_RA_INT_ENABLE - @see MPU6050_INTERRUPT_MOT_BIT - **/ -bool MPU6050::getIntMotionEnabled() { - I2Cdev::readBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_MOT_BIT, buffer); - return buffer[0]; -} -/** Set Motion Detection interrupt enabled status. - @param enabled New interrupt enabled status - @see getIntMotionEnabled() - @see MPU6050_RA_INT_ENABLE - @see MPU6050_INTERRUPT_MOT_BIT - **/ -void MPU6050::setIntMotionEnabled(bool enabled) { - I2Cdev::writeBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_MOT_BIT, enabled); -} -/** Get Zero Motion Detection interrupt enabled status. - Will be set 0 for disabled, 1 for enabled. - @return Current interrupt enabled status - @see MPU6050_RA_INT_ENABLE - @see MPU6050_INTERRUPT_ZMOT_BIT - **/ -bool MPU6050::getIntZeroMotionEnabled() { - I2Cdev::readBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_ZMOT_BIT, buffer); - return buffer[0]; -} -/** Set Zero Motion Detection interrupt enabled status. - @param enabled New interrupt enabled status - @see getIntZeroMotionEnabled() - @see MPU6050_RA_INT_ENABLE - @see MPU6050_INTERRUPT_ZMOT_BIT - **/ -void MPU6050::setIntZeroMotionEnabled(bool enabled) { - I2Cdev::writeBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_ZMOT_BIT, enabled); -} -/** Get FIFO Buffer Overflow interrupt enabled status. - Will be set 0 for disabled, 1 for enabled. - @return Current interrupt enabled status - @see MPU6050_RA_INT_ENABLE - @see MPU6050_INTERRUPT_FIFO_OFLOW_BIT - **/ -bool MPU6050::getIntFIFOBufferOverflowEnabled() { - I2Cdev::readBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_FIFO_OFLOW_BIT, buffer); - return buffer[0]; -} -/** Set FIFO Buffer Overflow interrupt enabled status. - @param enabled New interrupt enabled status - @see getIntFIFOBufferOverflowEnabled() - @see MPU6050_RA_INT_ENABLE - @see MPU6050_INTERRUPT_FIFO_OFLOW_BIT - **/ -void MPU6050::setIntFIFOBufferOverflowEnabled(bool enabled) { - I2Cdev::writeBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_FIFO_OFLOW_BIT, enabled); -} -/** Get I2C Master interrupt enabled status. - This enables any of the I2C Master interrupt sources to generate an - interrupt. Will be set 0 for disabled, 1 for enabled. - @return Current interrupt enabled status - @see MPU6050_RA_INT_ENABLE - @see MPU6050_INTERRUPT_I2C_MST_INT_BIT - **/ -bool MPU6050::getIntI2CMasterEnabled() { - I2Cdev::readBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_I2C_MST_INT_BIT, buffer); - return buffer[0]; -} -/** Set I2C Master interrupt enabled status. - @param enabled New interrupt enabled status - @see getIntI2CMasterEnabled() - @see MPU6050_RA_INT_ENABLE - @see MPU6050_INTERRUPT_I2C_MST_INT_BIT - **/ -void MPU6050::setIntI2CMasterEnabled(bool enabled) { - I2Cdev::writeBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_I2C_MST_INT_BIT, enabled); -} -/** Get Data Ready interrupt enabled setting. - This event occurs each time a write operation to all of the sensor registers - has been completed. Will be set 0 for disabled, 1 for enabled. - @return Current interrupt enabled status - @see MPU6050_RA_INT_ENABLE - @see MPU6050_INTERRUPT_DATA_RDY_BIT -*/ -bool MPU6050::getIntDataReadyEnabled() { - I2Cdev::readBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_DATA_RDY_BIT, buffer); - return buffer[0]; -} -/** Set Data Ready interrupt enabled status. - @param enabled New interrupt enabled status - @see getIntDataReadyEnabled() - @see MPU6050_RA_INT_CFG - @see MPU6050_INTERRUPT_DATA_RDY_BIT -*/ -void MPU6050::setIntDataReadyEnabled(bool enabled) { - I2Cdev::writeBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_DATA_RDY_BIT, enabled); -} - -// INT_STATUS register - -/** Get full set of interrupt status bits. - These bits clear to 0 after the register has been read. Very useful - for getting multiple INT statuses, since each single bit read clears - all of them because it has to read the whole byte. - @return Current interrupt status - @see MPU6050_RA_INT_STATUS -*/ -uint8_t MPU6050::getIntStatus() { - I2Cdev::readByte(devAddr, MPU6050_RA_INT_STATUS, buffer); - return buffer[0]; -} -/** Get Free Fall interrupt status. - This bit automatically sets to 1 when a Free Fall interrupt has been - generated. The bit clears to 0 after the register has been read. - @return Current interrupt status - @see MPU6050_RA_INT_STATUS - @see MPU6050_INTERRUPT_FF_BIT -*/ -bool MPU6050::getIntFreefallStatus() { - I2Cdev::readBit(devAddr, MPU6050_RA_INT_STATUS, MPU6050_INTERRUPT_FF_BIT, buffer); - return buffer[0]; -} -/** Get Motion Detection interrupt status. - This bit automatically sets to 1 when a Motion Detection interrupt has been - generated. The bit clears to 0 after the register has been read. - @return Current interrupt status - @see MPU6050_RA_INT_STATUS - @see MPU6050_INTERRUPT_MOT_BIT -*/ -bool MPU6050::getIntMotionStatus() { - I2Cdev::readBit(devAddr, MPU6050_RA_INT_STATUS, MPU6050_INTERRUPT_MOT_BIT, buffer); - return buffer[0]; -} -/** Get Zero Motion Detection interrupt status. - This bit automatically sets to 1 when a Zero Motion Detection interrupt has - been generated. The bit clears to 0 after the register has been read. - @return Current interrupt status - @see MPU6050_RA_INT_STATUS - @see MPU6050_INTERRUPT_ZMOT_BIT -*/ -bool MPU6050::getIntZeroMotionStatus() { - I2Cdev::readBit(devAddr, MPU6050_RA_INT_STATUS, MPU6050_INTERRUPT_ZMOT_BIT, buffer); - return buffer[0]; -} -/** Get FIFO Buffer Overflow interrupt status. - This bit automatically sets to 1 when a Free Fall interrupt has been - generated. The bit clears to 0 after the register has been read. - @return Current interrupt status - @see MPU6050_RA_INT_STATUS - @see MPU6050_INTERRUPT_FIFO_OFLOW_BIT -*/ -bool MPU6050::getIntFIFOBufferOverflowStatus() { - I2Cdev::readBit(devAddr, MPU6050_RA_INT_STATUS, MPU6050_INTERRUPT_FIFO_OFLOW_BIT, buffer); - return buffer[0]; -} -/** Get I2C Master interrupt status. - This bit automatically sets to 1 when an I2C Master interrupt has been - generated. For a list of I2C Master interrupts, please refer to Register 54. - The bit clears to 0 after the register has been read. - @return Current interrupt status - @see MPU6050_RA_INT_STATUS - @see MPU6050_INTERRUPT_I2C_MST_INT_BIT -*/ -bool MPU6050::getIntI2CMasterStatus() { - I2Cdev::readBit(devAddr, MPU6050_RA_INT_STATUS, MPU6050_INTERRUPT_I2C_MST_INT_BIT, buffer); - return buffer[0]; -} -/** Get Data Ready interrupt status. - This bit automatically sets to 1 when a Data Ready interrupt has been - generated. The bit clears to 0 after the register has been read. - @return Current interrupt status - @see MPU6050_RA_INT_STATUS - @see MPU6050_INTERRUPT_DATA_RDY_BIT -*/ -bool MPU6050::getIntDataReadyStatus() { - I2Cdev::readBit(devAddr, MPU6050_RA_INT_STATUS, MPU6050_INTERRUPT_DATA_RDY_BIT, buffer); - return buffer[0]; -} - -// ACCEL_*OUT_* registers - -/** Get raw 9-axis motion sensor readings (accel/gyro/compass). - FUNCTION NOT FULLY IMPLEMENTED YET. - @param ax 16-bit signed integer container for accelerometer X-axis value - @param ay 16-bit signed integer container for accelerometer Y-axis value - @param az 16-bit signed integer container for accelerometer Z-axis value - @param gx 16-bit signed integer container for gyroscope X-axis value - @param gy 16-bit signed integer container for gyroscope Y-axis value - @param gz 16-bit signed integer container for gyroscope Z-axis value - @param mx 16-bit signed integer container for magnetometer X-axis value - @param my 16-bit signed integer container for magnetometer Y-axis value - @param mz 16-bit signed integer container for magnetometer Z-axis value - @see getMotion6() - @see getAcceleration() - @see getRotation() - @see MPU6050_RA_ACCEL_XOUT_H -*/ -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) { - - //get accel and gyro - getMotion6(ax, ay, az, gx, gy, gz); - - //read mag - I2Cdev::writeByte(devAddr, MPU6050_RA_INT_PIN_CFG, 0x02); //set i2c bypass enable pin to true to access magnetometer - delay(10); - I2Cdev::writeByte(MPU9150_RA_MAG_ADDRESS, 0x0A, 0x01); //enable the magnetometer - delay(10); - I2Cdev::readBytes(MPU9150_RA_MAG_ADDRESS, MPU9150_RA_MAG_XOUT_L, 6, buffer); - *mx = (((int16_t)buffer[1]) << 8) | buffer[0]; - *my = (((int16_t)buffer[3]) << 8) | buffer[2]; - *mz = (((int16_t)buffer[5]) << 8) | buffer[4]; -} -/** Get raw 6-axis motion sensor readings (accel/gyro). - Retrieves all currently available motion sensor values. - @param ax 16-bit signed integer container for accelerometer X-axis value - @param ay 16-bit signed integer container for accelerometer Y-axis value - @param az 16-bit signed integer container for accelerometer Z-axis value - @param gx 16-bit signed integer container for gyroscope X-axis value - @param gy 16-bit signed integer container for gyroscope Y-axis value - @param gz 16-bit signed integer container for gyroscope Z-axis value - @see getAcceleration() - @see getRotation() - @see MPU6050_RA_ACCEL_XOUT_H -*/ -void MPU6050::getMotion6(int16_t* ax, int16_t* ay, int16_t* az, int16_t* gx, int16_t* gy, int16_t* gz) { - I2Cdev::readBytes(devAddr, MPU6050_RA_ACCEL_XOUT_H, 14, buffer); - *ax = (((int16_t)buffer[0]) << 8) | buffer[1]; - *ay = (((int16_t)buffer[2]) << 8) | buffer[3]; - *az = (((int16_t)buffer[4]) << 8) | buffer[5]; - *gx = (((int16_t)buffer[8]) << 8) | buffer[9]; - *gy = (((int16_t)buffer[10]) << 8) | buffer[11]; - *gz = (((int16_t)buffer[12]) << 8) | buffer[13]; -} -/** Get 3-axis accelerometer readings. - These registers store the most recent accelerometer measurements. - Accelerometer measurements are written to these registers at the Sample Rate - as defined in Register 25. - - The accelerometer measurement registers, along with the temperature - measurement registers, gyroscope measurement registers, and external sensor - data registers, are composed of two sets of registers: an internal register - set and a user-facing read register set. - - The data within the accelerometer sensors' internal register set is always - updated at the Sample Rate. Meanwhile, the user-facing read register set - duplicates the internal register set's data values whenever the serial - interface is idle. This guarantees that a burst read of sensor registers will - read measurements from the same sampling instant. Note that if burst reads - are not used, the user is responsible for ensuring a set of single byte reads - correspond to a single sampling instant by checking the Data Ready interrupt. - - Each 16-bit accelerometer measurement has a full scale defined in ACCEL_FS - (Register 28). For each full scale setting, the accelerometers' sensitivity - per LSB in ACCEL_xOUT is shown in the table below: - -
-    AFS_SEL | Full Scale Range | LSB Sensitivity
-    --------+------------------+----------------
-    0       | +/- 2g           | 8192 LSB/mg
-    1       | +/- 4g           | 4096 LSB/mg
-    2       | +/- 8g           | 2048 LSB/mg
-    3       | +/- 16g          | 1024 LSB/mg
-    
- - @param x 16-bit signed integer container for X-axis acceleration - @param y 16-bit signed integer container for Y-axis acceleration - @param z 16-bit signed integer container for Z-axis acceleration - @see MPU6050_RA_GYRO_XOUT_H -*/ -void MPU6050::getAcceleration(int16_t* x, int16_t* y, int16_t* z) { - I2Cdev::readBytes(devAddr, MPU6050_RA_ACCEL_XOUT_H, 6, buffer); - *x = (((int16_t)buffer[0]) << 8) | buffer[1]; - *y = (((int16_t)buffer[2]) << 8) | buffer[3]; - *z = (((int16_t)buffer[4]) << 8) | buffer[5]; -} -/** Get X-axis accelerometer reading. - @return X-axis acceleration measurement in 16-bit 2's complement format - @see getMotion6() - @see MPU6050_RA_ACCEL_XOUT_H -*/ -int16_t MPU6050::getAccelerationX() { - I2Cdev::readBytes(devAddr, MPU6050_RA_ACCEL_XOUT_H, 2, buffer); - return (((int16_t)buffer[0]) << 8) | buffer[1]; -} -/** Get Y-axis accelerometer reading. - @return Y-axis acceleration measurement in 16-bit 2's complement format - @see getMotion6() - @see MPU6050_RA_ACCEL_YOUT_H -*/ -int16_t MPU6050::getAccelerationY() { - I2Cdev::readBytes(devAddr, MPU6050_RA_ACCEL_YOUT_H, 2, buffer); - return (((int16_t)buffer[0]) << 8) | buffer[1]; -} -/** Get Z-axis accelerometer reading. - @return Z-axis acceleration measurement in 16-bit 2's complement format - @see getMotion6() - @see MPU6050_RA_ACCEL_ZOUT_H -*/ -int16_t MPU6050::getAccelerationZ() { - I2Cdev::readBytes(devAddr, MPU6050_RA_ACCEL_ZOUT_H, 2, buffer); - return (((int16_t)buffer[0]) << 8) | buffer[1]; -} - -// TEMP_OUT_* registers - -/** Get current internal temperature. - @return Temperature reading in 16-bit 2's complement format - @see MPU6050_RA_TEMP_OUT_H -*/ -int16_t MPU6050::getTemperature() { - I2Cdev::readBytes(devAddr, MPU6050_RA_TEMP_OUT_H, 2, buffer); - return (((int16_t)buffer[0]) << 8) | buffer[1]; -} - -// GYRO_*OUT_* registers - -/** Get 3-axis gyroscope readings. - These gyroscope measurement registers, along with the accelerometer - measurement registers, temperature measurement registers, and external sensor - data registers, are composed of two sets of registers: an internal register - set and a user-facing read register set. - The data within the gyroscope sensors' internal register set is always - updated at the Sample Rate. Meanwhile, the user-facing read register set - duplicates the internal register set's data values whenever the serial - interface is idle. This guarantees that a burst read of sensor registers will - read measurements from the same sampling instant. Note that if burst reads - are not used, the user is responsible for ensuring a set of single byte reads - correspond to a single sampling instant by checking the Data Ready interrupt. - - Each 16-bit gyroscope measurement has a full scale defined in FS_SEL - (Register 27). For each full scale setting, the gyroscopes' sensitivity per - LSB in GYRO_xOUT is shown in the table below: - -
-    FS_SEL | Full Scale Range   | LSB Sensitivity
-    -------+--------------------+----------------
-    0      | +/- 250 degrees/s  | 131 LSB/deg/s
-    1      | +/- 500 degrees/s  | 65.5 LSB/deg/s
-    2      | +/- 1000 degrees/s | 32.8 LSB/deg/s
-    3      | +/- 2000 degrees/s | 16.4 LSB/deg/s
-    
- - @param x 16-bit signed integer container for X-axis rotation - @param y 16-bit signed integer container for Y-axis rotation - @param z 16-bit signed integer container for Z-axis rotation - @see getMotion6() - @see MPU6050_RA_GYRO_XOUT_H -*/ -void MPU6050::getRotation(int16_t* x, int16_t* y, int16_t* z) { - I2Cdev::readBytes(devAddr, MPU6050_RA_GYRO_XOUT_H, 6, buffer); - *x = (((int16_t)buffer[0]) << 8) | buffer[1]; - *y = (((int16_t)buffer[2]) << 8) | buffer[3]; - *z = (((int16_t)buffer[4]) << 8) | buffer[5]; -} -/** Get X-axis gyroscope reading. - @return X-axis rotation measurement in 16-bit 2's complement format - @see getMotion6() - @see MPU6050_RA_GYRO_XOUT_H -*/ -int16_t MPU6050::getRotationX() { - I2Cdev::readBytes(devAddr, MPU6050_RA_GYRO_XOUT_H, 2, buffer); - return (((int16_t)buffer[0]) << 8) | buffer[1]; -} -/** Get Y-axis gyroscope reading. - @return Y-axis rotation measurement in 16-bit 2's complement format - @see getMotion6() - @see MPU6050_RA_GYRO_YOUT_H -*/ -int16_t MPU6050::getRotationY() { - I2Cdev::readBytes(devAddr, MPU6050_RA_GYRO_YOUT_H, 2, buffer); - return (((int16_t)buffer[0]) << 8) | buffer[1]; -} -/** Get Z-axis gyroscope reading. - @return Z-axis rotation measurement in 16-bit 2's complement format - @see getMotion6() - @see MPU6050_RA_GYRO_ZOUT_H -*/ -int16_t MPU6050::getRotationZ() { - I2Cdev::readBytes(devAddr, MPU6050_RA_GYRO_ZOUT_H, 2, buffer); - return (((int16_t)buffer[0]) << 8) | buffer[1]; -} - -// EXT_SENS_DATA_* registers - -/** Read single byte from external sensor data register. - These registers store data read from external sensors by the Slave 0, 1, 2, - and 3 on the auxiliary I2C interface. Data read by Slave 4 is stored in - I2C_SLV4_DI (Register 53). - - External sensor data is written to these registers at the Sample Rate as - defined in Register 25. This access rate can be reduced by using the Slave - Delay Enable registers (Register 103). - - External sensor data registers, along with the gyroscope measurement - registers, accelerometer measurement registers, and temperature measurement - registers, are composed of two sets of registers: an internal register set - and a user-facing read register set. - - The data within the external sensors' internal register set is always updated - at the Sample Rate (or the reduced access rate) whenever the serial interface - is idle. This guarantees that a burst read of sensor registers will read - measurements from the same sampling instant. Note that if burst reads are not - used, the user is responsible for ensuring a set of single byte reads - correspond to a single sampling instant by checking the Data Ready interrupt. - - Data is placed in these external sensor data registers according to - I2C_SLV0_CTRL, I2C_SLV1_CTRL, I2C_SLV2_CTRL, and I2C_SLV3_CTRL (Registers 39, - 42, 45, and 48). When more than zero bytes are read (I2C_SLVx_LEN > 0) from - an enabled slave (I2C_SLVx_EN = 1), the slave is read at the Sample Rate (as - defined in Register 25) or delayed rate (if specified in Register 52 and - 103). During each Sample cycle, slave reads are performed in order of Slave - number. If all slaves are enabled with more than zero bytes to be read, the - order will be Slave 0, followed by Slave 1, Slave 2, and Slave 3. - - Each enabled slave will have EXT_SENS_DATA registers associated with it by - number of bytes read (I2C_SLVx_LEN) in order of slave number, starting from - EXT_SENS_DATA_00. Note that this means enabling or disabling a slave may - change the higher numbered slaves' associated registers. Furthermore, if - fewer total bytes are being read from the external sensors as a result of - such a change, then the data remaining in the registers which no longer have - an associated slave device (i.e. high numbered registers) will remain in - these previously allocated registers unless reset. - - If the sum of the read lengths of all SLVx transactions exceed the number of - available EXT_SENS_DATA registers, the excess bytes will be dropped. There - are 24 EXT_SENS_DATA registers and hence the total read lengths between all - the slaves cannot be greater than 24 or some bytes will be lost. - - Note: Slave 4's behavior is distinct from that of Slaves 0-3. For further - information regarding the characteristics of Slave 4, please refer to - Registers 49 to 53. - - EXAMPLE: - Suppose that Slave 0 is enabled with 4 bytes to be read (I2C_SLV0_EN = 1 and - I2C_SLV0_LEN = 4) while Slave 1 is enabled with 2 bytes to be read so that - I2C_SLV1_EN = 1 and I2C_SLV1_LEN = 2. In such a situation, EXT_SENS_DATA _00 - through _03 will be associated with Slave 0, while EXT_SENS_DATA _04 and 05 - will be associated with Slave 1. If Slave 2 is enabled as well, registers - starting from EXT_SENS_DATA_06 will be allocated to Slave 2. - - If Slave 2 is disabled while Slave 3 is enabled in this same situation, then - registers starting from EXT_SENS_DATA_06 will be allocated to Slave 3 - instead. - - REGISTER ALLOCATION FOR DYNAMIC DISABLE VS. NORMAL DISABLE: - If a slave is disabled at any time, the space initially allocated to the - slave in the EXT_SENS_DATA register, will remain associated with that slave. - This is to avoid dynamic adjustment of the register allocation. - - The allocation of the EXT_SENS_DATA registers is recomputed only when (1) all - slaves are disabled, or (2) the I2C_MST_RST bit is set (Register 106). - - This above is also true if one of the slaves gets NACKed and stops - functioning. - - @param position Starting position (0-23) - @return Byte read from register -*/ -uint8_t MPU6050::getExternalSensorByte(int position) { - I2Cdev::readByte(devAddr, MPU6050_RA_EXT_SENS_DATA_00 + position, buffer); - return buffer[0]; -} -/** Read word (2 bytes) from external sensor data registers. - @param position Starting position (0-21) - @return Word read from register - @see getExternalSensorByte() -*/ -uint16_t MPU6050::getExternalSensorWord(int position) { - I2Cdev::readBytes(devAddr, MPU6050_RA_EXT_SENS_DATA_00 + position, 2, buffer); - return (((uint16_t)buffer[0]) << 8) | buffer[1]; -} -/** Read double word (4 bytes) from external sensor data registers. - @param position Starting position (0-20) - @return Double word read from registers - @see getExternalSensorByte() -*/ -uint32_t MPU6050::getExternalSensorDWord(int position) { - I2Cdev::readBytes(devAddr, MPU6050_RA_EXT_SENS_DATA_00 + position, 4, buffer); - return (((uint32_t)buffer[0]) << 24) | (((uint32_t)buffer[1]) << 16) | (((uint16_t)buffer[2]) << 8) | buffer[3]; -} - -// MOT_DETECT_STATUS register - -/** Get X-axis negative motion detection interrupt status. - @return Motion detection status - @see MPU6050_RA_MOT_DETECT_STATUS - @see MPU6050_MOTION_MOT_XNEG_BIT -*/ -bool MPU6050::getXNegMotionDetected() { - I2Cdev::readBit(devAddr, MPU6050_RA_MOT_DETECT_STATUS, MPU6050_MOTION_MOT_XNEG_BIT, buffer); - return buffer[0]; -} -/** Get X-axis positive motion detection interrupt status. - @return Motion detection status - @see MPU6050_RA_MOT_DETECT_STATUS - @see MPU6050_MOTION_MOT_XPOS_BIT -*/ -bool MPU6050::getXPosMotionDetected() { - I2Cdev::readBit(devAddr, MPU6050_RA_MOT_DETECT_STATUS, MPU6050_MOTION_MOT_XPOS_BIT, buffer); - return buffer[0]; -} -/** Get Y-axis negative motion detection interrupt status. - @return Motion detection status - @see MPU6050_RA_MOT_DETECT_STATUS - @see MPU6050_MOTION_MOT_YNEG_BIT -*/ -bool MPU6050::getYNegMotionDetected() { - I2Cdev::readBit(devAddr, MPU6050_RA_MOT_DETECT_STATUS, MPU6050_MOTION_MOT_YNEG_BIT, buffer); - return buffer[0]; -} -/** Get Y-axis positive motion detection interrupt status. - @return Motion detection status - @see MPU6050_RA_MOT_DETECT_STATUS - @see MPU6050_MOTION_MOT_YPOS_BIT -*/ -bool MPU6050::getYPosMotionDetected() { - I2Cdev::readBit(devAddr, MPU6050_RA_MOT_DETECT_STATUS, MPU6050_MOTION_MOT_YPOS_BIT, buffer); - return buffer[0]; -} -/** Get Z-axis negative motion detection interrupt status. - @return Motion detection status - @see MPU6050_RA_MOT_DETECT_STATUS - @see MPU6050_MOTION_MOT_ZNEG_BIT -*/ -bool MPU6050::getZNegMotionDetected() { - I2Cdev::readBit(devAddr, MPU6050_RA_MOT_DETECT_STATUS, MPU6050_MOTION_MOT_ZNEG_BIT, buffer); - return buffer[0]; -} -/** Get Z-axis positive motion detection interrupt status. - @return Motion detection status - @see MPU6050_RA_MOT_DETECT_STATUS - @see MPU6050_MOTION_MOT_ZPOS_BIT -*/ -bool MPU6050::getZPosMotionDetected() { - I2Cdev::readBit(devAddr, MPU6050_RA_MOT_DETECT_STATUS, MPU6050_MOTION_MOT_ZPOS_BIT, buffer); - return buffer[0]; -} -/** Get zero motion detection interrupt status. - @return Motion detection status - @see MPU6050_RA_MOT_DETECT_STATUS - @see MPU6050_MOTION_MOT_ZRMOT_BIT -*/ -bool MPU6050::getZeroMotionDetected() { - I2Cdev::readBit(devAddr, MPU6050_RA_MOT_DETECT_STATUS, MPU6050_MOTION_MOT_ZRMOT_BIT, buffer); - return buffer[0]; -} - -// I2C_SLV*_DO register - -/** Write byte to Data Output container for specified slave. - This register holds the output data written into Slave when Slave is set to - write mode. For further information regarding Slave control, please - refer to Registers 37 to 39 and immediately following. - @param num Slave number (0-3) - @param data Byte to write - @see MPU6050_RA_I2C_SLV0_DO -*/ -void MPU6050::setSlaveOutputByte(uint8_t num, uint8_t data) { - if (num > 3) { - return; - } - I2Cdev::writeByte(devAddr, MPU6050_RA_I2C_SLV0_DO + num, data); -} - -// I2C_MST_DELAY_CTRL register - -/** Get external data shadow delay enabled status. - This register is used to specify the timing of external sensor data - shadowing. When DELAY_ES_SHADOW is set to 1, shadowing of external - sensor data is delayed until all data has been received. - @return Current external data shadow delay enabled status. - @see MPU6050_RA_I2C_MST_DELAY_CTRL - @see MPU6050_DELAYCTRL_DELAY_ES_SHADOW_BIT -*/ -bool MPU6050::getExternalShadowDelayEnabled() { - I2Cdev::readBit(devAddr, MPU6050_RA_I2C_MST_DELAY_CTRL, MPU6050_DELAYCTRL_DELAY_ES_SHADOW_BIT, buffer); - return buffer[0]; -} -/** Set external data shadow delay enabled status. - @param enabled New external data shadow delay enabled status. - @see getExternalShadowDelayEnabled() - @see MPU6050_RA_I2C_MST_DELAY_CTRL - @see MPU6050_DELAYCTRL_DELAY_ES_SHADOW_BIT -*/ -void MPU6050::setExternalShadowDelayEnabled(bool enabled) { - I2Cdev::writeBit(devAddr, MPU6050_RA_I2C_MST_DELAY_CTRL, MPU6050_DELAYCTRL_DELAY_ES_SHADOW_BIT, enabled); -} -/** Get slave delay enabled status. - When a particular slave delay is enabled, the rate of access for the that - slave device is reduced. When a slave's access rate is decreased relative to - the Sample Rate, the slave is accessed every: - - 1 / (1 + I2C_MST_DLY) Samples - - This base Sample Rate in turn is determined by SMPLRT_DIV (register * 25) - and DLPF_CFG (register 26). - - For further information regarding I2C_MST_DLY, please refer to register 52. - For further information regarding the Sample Rate, please refer to register 25. - - @param num Slave number (0-4) - @return Current slave delay enabled status. - @see MPU6050_RA_I2C_MST_DELAY_CTRL - @see MPU6050_DELAYCTRL_I2C_SLV0_DLY_EN_BIT -*/ -bool MPU6050::getSlaveDelayEnabled(uint8_t num) { - // MPU6050_DELAYCTRL_I2C_SLV4_DLY_EN_BIT is 4, SLV3 is 3, etc. - if (num > 4) { - return 0; - } - I2Cdev::readBit(devAddr, MPU6050_RA_I2C_MST_DELAY_CTRL, num, buffer); - return buffer[0]; -} -/** Set slave delay enabled status. - @param num Slave number (0-4) - @param enabled New slave delay enabled status. - @see MPU6050_RA_I2C_MST_DELAY_CTRL - @see MPU6050_DELAYCTRL_I2C_SLV0_DLY_EN_BIT -*/ -void MPU6050::setSlaveDelayEnabled(uint8_t num, bool enabled) { - I2Cdev::writeBit(devAddr, MPU6050_RA_I2C_MST_DELAY_CTRL, num, enabled); -} - -// SIGNAL_PATH_RESET register - -/** Reset gyroscope signal path. - The reset will revert the signal path analog to digital converters and - filters to their power up configurations. - @see MPU6050_RA_SIGNAL_PATH_RESET - @see MPU6050_PATHRESET_GYRO_RESET_BIT -*/ -void MPU6050::resetGyroscopePath() { - I2Cdev::writeBit(devAddr, MPU6050_RA_SIGNAL_PATH_RESET, MPU6050_PATHRESET_GYRO_RESET_BIT, true); -} -/** Reset accelerometer signal path. - The reset will revert the signal path analog to digital converters and - filters to their power up configurations. - @see MPU6050_RA_SIGNAL_PATH_RESET - @see MPU6050_PATHRESET_ACCEL_RESET_BIT -*/ -void MPU6050::resetAccelerometerPath() { - I2Cdev::writeBit(devAddr, MPU6050_RA_SIGNAL_PATH_RESET, MPU6050_PATHRESET_ACCEL_RESET_BIT, true); -} -/** Reset temperature sensor signal path. - The reset will revert the signal path analog to digital converters and - filters to their power up configurations. - @see MPU6050_RA_SIGNAL_PATH_RESET - @see MPU6050_PATHRESET_TEMP_RESET_BIT -*/ -void MPU6050::resetTemperaturePath() { - I2Cdev::writeBit(devAddr, MPU6050_RA_SIGNAL_PATH_RESET, MPU6050_PATHRESET_TEMP_RESET_BIT, true); -} - -// MOT_DETECT_CTRL register - -/** Get accelerometer power-on delay. - The accelerometer data path provides samples to the sensor registers, Motion - detection, Zero Motion detection, and Free Fall detection modules. The - signal path contains filters which must be flushed on wake-up with new - samples before the detection modules begin operations. The default wake-up - delay, of 4ms can be lengthened by up to 3ms. This additional delay is - specified in ACCEL_ON_DELAY in units of 1 LSB = 1 ms. The user may select - any value above zero unless instructed otherwise by InvenSense. Please refer - to Section 8 of the MPU-6000/MPU-6050 Product Specification document for - further information regarding the detection modules. - @return Current accelerometer power-on delay - @see MPU6050_RA_MOT_DETECT_CTRL - @see MPU6050_DETECT_ACCEL_ON_DELAY_BIT -*/ -uint8_t MPU6050::getAccelerometerPowerOnDelay() { - I2Cdev::readBits(devAddr, MPU6050_RA_MOT_DETECT_CTRL, MPU6050_DETECT_ACCEL_ON_DELAY_BIT, - MPU6050_DETECT_ACCEL_ON_DELAY_LENGTH, buffer); - return buffer[0]; -} -/** Set accelerometer power-on delay. - @param delay New accelerometer power-on delay (0-3) - @see getAccelerometerPowerOnDelay() - @see MPU6050_RA_MOT_DETECT_CTRL - @see MPU6050_DETECT_ACCEL_ON_DELAY_BIT -*/ -void MPU6050::setAccelerometerPowerOnDelay(uint8_t delay) { - I2Cdev::writeBits(devAddr, MPU6050_RA_MOT_DETECT_CTRL, MPU6050_DETECT_ACCEL_ON_DELAY_BIT, - MPU6050_DETECT_ACCEL_ON_DELAY_LENGTH, delay); -} -/** Get Free Fall detection counter decrement configuration. - Detection is registered by the Free Fall detection module after accelerometer - measurements meet their respective threshold conditions over a specified - number of samples. When the threshold conditions are met, the corresponding - detection counter increments by 1. The user may control the rate at which the - detection counter decrements when the threshold condition is not met by - configuring FF_COUNT. The decrement rate can be set according to the - following table: - -
-    FF_COUNT | Counter Decrement
-    ---------+------------------
-    0        | Reset
-    1        | 1
-    2        | 2
-    3        | 4
-    
- - When FF_COUNT is configured to 0 (reset), any non-qualifying sample will - reset the counter to 0. For further information on Free Fall detection, - please refer to Registers 29 to 32. - - @return Current decrement configuration - @see MPU6050_RA_MOT_DETECT_CTRL - @see MPU6050_DETECT_FF_COUNT_BIT -*/ -uint8_t MPU6050::getFreefallDetectionCounterDecrement() { - I2Cdev::readBits(devAddr, MPU6050_RA_MOT_DETECT_CTRL, MPU6050_DETECT_FF_COUNT_BIT, MPU6050_DETECT_FF_COUNT_LENGTH, - buffer); - return buffer[0]; -} -/** Set Free Fall detection counter decrement configuration. - @param decrement New decrement configuration value - @see getFreefallDetectionCounterDecrement() - @see MPU6050_RA_MOT_DETECT_CTRL - @see MPU6050_DETECT_FF_COUNT_BIT -*/ -void MPU6050::setFreefallDetectionCounterDecrement(uint8_t decrement) { - I2Cdev::writeBits(devAddr, MPU6050_RA_MOT_DETECT_CTRL, MPU6050_DETECT_FF_COUNT_BIT, MPU6050_DETECT_FF_COUNT_LENGTH, - decrement); -} -/** Get Motion detection counter decrement configuration. - Detection is registered by the Motion detection module after accelerometer - measurements meet their respective threshold conditions over a specified - number of samples. When the threshold conditions are met, the corresponding - detection counter increments by 1. The user may control the rate at which the - detection counter decrements when the threshold condition is not met by - configuring MOT_COUNT. The decrement rate can be set according to the - following table: - -
-    MOT_COUNT | Counter Decrement
-    ----------+------------------
-    0         | Reset
-    1         | 1
-    2         | 2
-    3         | 4
-    
- - When MOT_COUNT is configured to 0 (reset), any non-qualifying sample will - reset the counter to 0. For further information on Motion detection, - please refer to Registers 29 to 32. - -*/ -uint8_t MPU6050::getMotionDetectionCounterDecrement() { - I2Cdev::readBits(devAddr, MPU6050_RA_MOT_DETECT_CTRL, MPU6050_DETECT_MOT_COUNT_BIT, MPU6050_DETECT_MOT_COUNT_LENGTH, - buffer); - return buffer[0]; -} -/** Set Motion detection counter decrement configuration. - @param decrement New decrement configuration value - @see getMotionDetectionCounterDecrement() - @see MPU6050_RA_MOT_DETECT_CTRL - @see MPU6050_DETECT_MOT_COUNT_BIT -*/ -void MPU6050::setMotionDetectionCounterDecrement(uint8_t decrement) { - I2Cdev::writeBits(devAddr, MPU6050_RA_MOT_DETECT_CTRL, MPU6050_DETECT_MOT_COUNT_BIT, MPU6050_DETECT_MOT_COUNT_LENGTH, - decrement); -} - -// USER_CTRL register - -/** Get FIFO enabled status. - When this bit is set to 0, the FIFO buffer is disabled. The FIFO buffer - cannot be written to or read from while disabled. The FIFO buffer's state - does not change unless the MPU-60X0 is power cycled. - @return Current FIFO enabled status - @see MPU6050_RA_USER_CTRL - @see MPU6050_USERCTRL_FIFO_EN_BIT -*/ -bool MPU6050::getFIFOEnabled() { - I2Cdev::readBit(devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_FIFO_EN_BIT, buffer); - return buffer[0]; -} -/** Set FIFO enabled status. - @param enabled New FIFO enabled status - @see getFIFOEnabled() - @see MPU6050_RA_USER_CTRL - @see MPU6050_USERCTRL_FIFO_EN_BIT -*/ -void MPU6050::setFIFOEnabled(bool enabled) { - I2Cdev::writeBit(devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_FIFO_EN_BIT, enabled); -} -/** Get I2C Master Mode enabled status. - When this mode is enabled, the MPU-60X0 acts as the I2C Master to the - external sensor slave devices on the auxiliary I2C bus. When this bit is - cleared to 0, the auxiliary I2C bus lines (AUX_DA and AUX_CL) are logically - driven by the primary I2C bus (SDA and SCL). This is a precondition to - enabling Bypass Mode. For further information regarding Bypass Mode, please - refer to Register 55. - @return Current I2C Master Mode enabled status - @see MPU6050_RA_USER_CTRL - @see MPU6050_USERCTRL_I2C_MST_EN_BIT -*/ -bool MPU6050::getI2CMasterModeEnabled() { - I2Cdev::readBit(devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_I2C_MST_EN_BIT, buffer); - return buffer[0]; -} -/** Set I2C Master Mode enabled status. - @param enabled New I2C Master Mode enabled status - @see getI2CMasterModeEnabled() - @see MPU6050_RA_USER_CTRL - @see MPU6050_USERCTRL_I2C_MST_EN_BIT -*/ -void MPU6050::setI2CMasterModeEnabled(bool enabled) { - I2Cdev::writeBit(devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_I2C_MST_EN_BIT, enabled); -} -/** Switch from I2C to SPI mode (MPU-6000 only) - If this is set, the primary SPI interface will be enabled in place of the - disabled primary I2C interface. -*/ -void MPU6050::switchSPIEnabled(bool enabled) { - I2Cdev::writeBit(devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_I2C_IF_DIS_BIT, enabled); -} -/** Reset the FIFO. - This bit resets the FIFO buffer when set to 1 while FIFO_EN equals 0. This - bit automatically clears to 0 after the reset has been triggered. - @see MPU6050_RA_USER_CTRL - @see MPU6050_USERCTRL_FIFO_RESET_BIT -*/ -void MPU6050::resetFIFO() { - I2Cdev::writeBit(devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_FIFO_RESET_BIT, true); -} -/** Reset the I2C Master. - This bit resets the I2C Master when set to 1 while I2C_MST_EN equals 0. - This bit automatically clears to 0 after the reset has been triggered. - @see MPU6050_RA_USER_CTRL - @see MPU6050_USERCTRL_I2C_MST_RESET_BIT -*/ -void MPU6050::resetI2CMaster() { - I2Cdev::writeBit(devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_I2C_MST_RESET_BIT, true); -} -/** Reset all sensor registers and signal paths. - When set to 1, this bit resets the signal paths for all sensors (gyroscopes, - accelerometers, and temperature sensor). This operation will also clear the - sensor registers. This bit automatically clears to 0 after the reset has been - triggered. - - When resetting only the signal path (and not the sensor registers), please - use Register 104, SIGNAL_PATH_RESET. - - @see MPU6050_RA_USER_CTRL - @see MPU6050_USERCTRL_SIG_COND_RESET_BIT -*/ -void MPU6050::resetSensors() { - I2Cdev::writeBit(devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_SIG_COND_RESET_BIT, true); -} - -// PWR_MGMT_1 register - -/** Trigger a full device reset. - A small delay of ~50ms may be desirable after triggering a reset. - @see MPU6050_RA_PWR_MGMT_1 - @see MPU6050_PWR1_DEVICE_RESET_BIT -*/ -void MPU6050::reset() { - I2Cdev::writeBit(devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_DEVICE_RESET_BIT, true); -} -/** Get sleep mode status. - Setting the SLEEP bit in the register puts the device into very low power - sleep mode. In this mode, only the serial interface and internal registers - remain active, allowing for a very low standby current. Clearing this bit - puts the device back into normal mode. To save power, the individual standby - selections for each of the gyros should be used if any gyro axis is not used - by the application. - @return Current sleep mode enabled status - @see MPU6050_RA_PWR_MGMT_1 - @see MPU6050_PWR1_SLEEP_BIT -*/ -bool MPU6050::getSleepEnabled() { - I2Cdev::readBit(devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_SLEEP_BIT, buffer); - return buffer[0]; -} -/** Set sleep mode status. - @param enabled New sleep mode enabled status - @see getSleepEnabled() - @see MPU6050_RA_PWR_MGMT_1 - @see MPU6050_PWR1_SLEEP_BIT -*/ -void MPU6050::setSleepEnabled(bool enabled) { - I2Cdev::writeBit(devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_SLEEP_BIT, enabled); -} -/** Get wake cycle enabled status. - When this bit is set to 1 and SLEEP is disabled, the MPU-60X0 will cycle - between sleep mode and waking up to take a single sample of data from active - sensors at a rate determined by LP_WAKE_CTRL (register 108). - @return Current sleep mode enabled status - @see MPU6050_RA_PWR_MGMT_1 - @see MPU6050_PWR1_CYCLE_BIT -*/ -bool MPU6050::getWakeCycleEnabled() { - I2Cdev::readBit(devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_CYCLE_BIT, buffer); - return buffer[0]; -} -/** Set wake cycle enabled status. - @param enabled New sleep mode enabled status - @see getWakeCycleEnabled() - @see MPU6050_RA_PWR_MGMT_1 - @see MPU6050_PWR1_CYCLE_BIT -*/ -void MPU6050::setWakeCycleEnabled(bool enabled) { - I2Cdev::writeBit(devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_CYCLE_BIT, enabled); -} -/** Get temperature sensor enabled status. - Control the usage of the internal temperature sensor. - - Note: this register stores the *disabled* value, but for consistency with the - rest of the code, the function is named and used with standard true/false - values to indicate whether the sensor is enabled or disabled, respectively. - - @return Current temperature sensor enabled status - @see MPU6050_RA_PWR_MGMT_1 - @see MPU6050_PWR1_TEMP_DIS_BIT -*/ -bool MPU6050::getTempSensorEnabled() { - I2Cdev::readBit(devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_TEMP_DIS_BIT, buffer); - return buffer[0] == 0; // 1 is actually disabled here -} -/** Set temperature sensor enabled status. - Note: this register stores the *disabled* value, but for consistency with the - rest of the code, the function is named and used with standard true/false - values to indicate whether the sensor is enabled or disabled, respectively. - - @param enabled New temperature sensor enabled status - @see getTempSensorEnabled() - @see MPU6050_RA_PWR_MGMT_1 - @see MPU6050_PWR1_TEMP_DIS_BIT -*/ -void MPU6050::setTempSensorEnabled(bool enabled) { - // 1 is actually disabled here - I2Cdev::writeBit(devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_TEMP_DIS_BIT, !enabled); -} -/** Get clock source setting. - @return Current clock source setting - @see MPU6050_RA_PWR_MGMT_1 - @see MPU6050_PWR1_CLKSEL_BIT - @see MPU6050_PWR1_CLKSEL_LENGTH -*/ -uint8_t MPU6050::getClockSource() { - I2Cdev::readBits(devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_CLKSEL_BIT, MPU6050_PWR1_CLKSEL_LENGTH, buffer); - return buffer[0]; -} -/** Set clock source setting. - An internal 8MHz oscillator, gyroscope based clock, or external sources can - be selected as the MPU-60X0 clock source. When the internal 8 MHz oscillator - or an external source is chosen as the clock source, the MPU-60X0 can operate - in low power modes with the gyroscopes disabled. - - Upon power up, the MPU-60X0 clock source defaults to the internal oscillator. - However, it is highly recommended that the device be configured to use one of - the gyroscopes (or an external clock source) as the clock reference for - improved stability. The clock source can be selected according to the following table: - -
-    CLK_SEL | Clock Source
-    --------+--------------------------------------
-    0       | Internal oscillator
-    1       | PLL with X Gyro reference
-    2       | PLL with Y Gyro reference
-    3       | PLL with Z Gyro reference
-    4       | PLL with external 32.768kHz reference
-    5       | PLL with external 19.2MHz reference
-    6       | Reserved
-    7       | Stops the clock and keeps the timing generator in reset
-    
- - @param source New clock source setting - @see getClockSource() - @see MPU6050_RA_PWR_MGMT_1 - @see MPU6050_PWR1_CLKSEL_BIT - @see MPU6050_PWR1_CLKSEL_LENGTH -*/ -void MPU6050::setClockSource(uint8_t source) { - I2Cdev::writeBits(devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_CLKSEL_BIT, MPU6050_PWR1_CLKSEL_LENGTH, source); -} - -// PWR_MGMT_2 register - -/** Get wake frequency in Accel-Only Low Power Mode. - The MPU-60X0 can be put into Accerlerometer Only Low Power Mode by setting - PWRSEL to 1 in the Power Management 1 register (Register 107). In this mode, - the device will power off all devices except for the primary I2C interface, - waking only the accelerometer at fixed intervals to take a single - measurement. The frequency of wake-ups can be configured with LP_WAKE_CTRL - as shown below: - -
-    LP_WAKE_CTRL | Wake-up Frequency
-    -------------+------------------
-    0            | 1.25 Hz
-    1            | 2.5 Hz
-    2            | 5 Hz
-    3            | 10 Hz
-    
-
-    For further information regarding the MPU-60X0's power modes, please refer to
-    Register 107.
-
-    @return Current wake frequency
-    @see MPU6050_RA_PWR_MGMT_2
-*/
-uint8_t MPU6050::getWakeFrequency() {
-    I2Cdev::readBits(devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_LP_WAKE_CTRL_BIT, MPU6050_PWR2_LP_WAKE_CTRL_LENGTH,
-                     buffer);
-    return buffer[0];
-}
-/** Set wake frequency in Accel-Only Low Power Mode.
-    @param frequency New wake frequency
-    @see MPU6050_RA_PWR_MGMT_2
-*/
-void MPU6050::setWakeFrequency(uint8_t frequency) {
-    I2Cdev::writeBits(devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_LP_WAKE_CTRL_BIT, MPU6050_PWR2_LP_WAKE_CTRL_LENGTH,
-                      frequency);
-}
-
-/** Get X-axis accelerometer standby enabled status.
-    If enabled, the X-axis will not gather or report data (or use power).
-    @return Current X-axis standby enabled status
-    @see MPU6050_RA_PWR_MGMT_2
-    @see MPU6050_PWR2_STBY_XA_BIT
-*/
-bool MPU6050::getStandbyXAccelEnabled() {
-    I2Cdev::readBit(devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_XA_BIT, buffer);
-    return buffer[0];
-}
-/** Set X-axis accelerometer standby enabled status.
-    @param New X-axis standby enabled status
-    @see getStandbyXAccelEnabled()
-    @see MPU6050_RA_PWR_MGMT_2
-    @see MPU6050_PWR2_STBY_XA_BIT
-*/
-void MPU6050::setStandbyXAccelEnabled(bool enabled) {
-    I2Cdev::writeBit(devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_XA_BIT, enabled);
-}
-/** Get Y-axis accelerometer standby enabled status.
-    If enabled, the Y-axis will not gather or report data (or use power).
-    @return Current Y-axis standby enabled status
-    @see MPU6050_RA_PWR_MGMT_2
-    @see MPU6050_PWR2_STBY_YA_BIT
-*/
-bool MPU6050::getStandbyYAccelEnabled() {
-    I2Cdev::readBit(devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_YA_BIT, buffer);
-    return buffer[0];
-}
-/** Set Y-axis accelerometer standby enabled status.
-    @param New Y-axis standby enabled status
-    @see getStandbyYAccelEnabled()
-    @see MPU6050_RA_PWR_MGMT_2
-    @see MPU6050_PWR2_STBY_YA_BIT
-*/
-void MPU6050::setStandbyYAccelEnabled(bool enabled) {
-    I2Cdev::writeBit(devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_YA_BIT, enabled);
-}
-/** Get Z-axis accelerometer standby enabled status.
-    If enabled, the Z-axis will not gather or report data (or use power).
-    @return Current Z-axis standby enabled status
-    @see MPU6050_RA_PWR_MGMT_2
-    @see MPU6050_PWR2_STBY_ZA_BIT
-*/
-bool MPU6050::getStandbyZAccelEnabled() {
-    I2Cdev::readBit(devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_ZA_BIT, buffer);
-    return buffer[0];
-}
-/** Set Z-axis accelerometer standby enabled status.
-    @param New Z-axis standby enabled status
-    @see getStandbyZAccelEnabled()
-    @see MPU6050_RA_PWR_MGMT_2
-    @see MPU6050_PWR2_STBY_ZA_BIT
-*/
-void MPU6050::setStandbyZAccelEnabled(bool enabled) {
-    I2Cdev::writeBit(devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_ZA_BIT, enabled);
-}
-/** Get X-axis gyroscope standby enabled status.
-    If enabled, the X-axis will not gather or report data (or use power).
-    @return Current X-axis standby enabled status
-    @see MPU6050_RA_PWR_MGMT_2
-    @see MPU6050_PWR2_STBY_XG_BIT
-*/
-bool MPU6050::getStandbyXGyroEnabled() {
-    I2Cdev::readBit(devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_XG_BIT, buffer);
-    return buffer[0];
-}
-/** Set X-axis gyroscope standby enabled status.
-    @param New X-axis standby enabled status
-    @see getStandbyXGyroEnabled()
-    @see MPU6050_RA_PWR_MGMT_2
-    @see MPU6050_PWR2_STBY_XG_BIT
-*/
-void MPU6050::setStandbyXGyroEnabled(bool enabled) {
-    I2Cdev::writeBit(devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_XG_BIT, enabled);
-}
-/** Get Y-axis gyroscope standby enabled status.
-    If enabled, the Y-axis will not gather or report data (or use power).
-    @return Current Y-axis standby enabled status
-    @see MPU6050_RA_PWR_MGMT_2
-    @see MPU6050_PWR2_STBY_YG_BIT
-*/
-bool MPU6050::getStandbyYGyroEnabled() {
-    I2Cdev::readBit(devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_YG_BIT, buffer);
-    return buffer[0];
-}
-/** Set Y-axis gyroscope standby enabled status.
-    @param New Y-axis standby enabled status
-    @see getStandbyYGyroEnabled()
-    @see MPU6050_RA_PWR_MGMT_2
-    @see MPU6050_PWR2_STBY_YG_BIT
-*/
-void MPU6050::setStandbyYGyroEnabled(bool enabled) {
-    I2Cdev::writeBit(devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_YG_BIT, enabled);
-}
-/** Get Z-axis gyroscope standby enabled status.
-    If enabled, the Z-axis will not gather or report data (or use power).
-    @return Current Z-axis standby enabled status
-    @see MPU6050_RA_PWR_MGMT_2
-    @see MPU6050_PWR2_STBY_ZG_BIT
-*/
-bool MPU6050::getStandbyZGyroEnabled() {
-    I2Cdev::readBit(devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_ZG_BIT, buffer);
-    return buffer[0];
-}
-/** Set Z-axis gyroscope standby enabled status.
-    @param New Z-axis standby enabled status
-    @see getStandbyZGyroEnabled()
-    @see MPU6050_RA_PWR_MGMT_2
-    @see MPU6050_PWR2_STBY_ZG_BIT
-*/
-void MPU6050::setStandbyZGyroEnabled(bool enabled) {
-    I2Cdev::writeBit(devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_ZG_BIT, enabled);
-}
-
-// FIFO_COUNT* registers
-
-/** Get current FIFO buffer size.
-    This value indicates the number of bytes stored in the FIFO buffer. This
-    number is in turn the number of bytes that can be read from the FIFO buffer
-    and it is directly proportional to the number of samples available given the
-    set of sensor data bound to be stored in the FIFO (register 35 and 36).
-    @return Current FIFO buffer size
-*/
-uint16_t MPU6050::getFIFOCount() {
-    I2Cdev::readBytes(devAddr, MPU6050_RA_FIFO_COUNTH, 2, buffer);
-    return (((uint16_t)buffer[0]) << 8) | buffer[1];
-}
-
-// FIFO_R_W register
-
-/** Get byte from FIFO buffer.
-    This register is used to read and write data from the FIFO buffer. Data is
-    written to the FIFO in order of register number (from lowest to highest). If
-    all the FIFO enable flags (see below) are enabled and all External Sensor
-    Data registers (Registers 73 to 96) are associated with a Slave device, the
-    contents of registers 59 through 96 will be written in order at the Sample
-    Rate.
-
-    The contents of the sensor data registers (Registers 59 to 96) are written
-    into the FIFO buffer when their corresponding FIFO enable flags are set to 1
-    in FIFO_EN (Register 35). An additional flag for the sensor data registers
-    associated with I2C Slave 3 can be found in I2C_MST_CTRL (Register 36).
-
-    If the FIFO buffer has overflowed, the status bit FIFO_OFLOW_INT is
-    automatically set to 1. This bit is located in INT_STATUS (Register 58).
-    When the FIFO buffer has overflowed, the oldest data will be lost and new
-    data will be written to the FIFO.
-
-    If the FIFO buffer is empty, reading this register will return the last byte
-    that was previously read from the FIFO until new data is available. The user
-    should check FIFO_COUNT to ensure that the FIFO buffer is not read when
-    empty.
-
-    @return Byte from FIFO buffer
-*/
-uint8_t MPU6050::getFIFOByte() {
-    I2Cdev::readByte(devAddr, MPU6050_RA_FIFO_R_W, buffer);
-    return buffer[0];
-}
-void MPU6050::getFIFOBytes(uint8_t* data, uint8_t length) {
-    I2Cdev::readBytes(devAddr, MPU6050_RA_FIFO_R_W, length, data);
-}
-/** Write byte to FIFO buffer.
-    @see getFIFOByte()
-    @see MPU6050_RA_FIFO_R_W
-*/
-void MPU6050::setFIFOByte(uint8_t data) {
-    I2Cdev::writeByte(devAddr, MPU6050_RA_FIFO_R_W, data);
-}
-
-// WHO_AM_I register
-
-/** Get Device ID.
-    This register is used to verify the identity of the device (0b110100, 0x34).
-    @return Device ID (6 bits only! should be 0x34)
-    @see MPU6050_RA_WHO_AM_I
-    @see MPU6050_WHO_AM_I_BIT
-    @see MPU6050_WHO_AM_I_LENGTH
-*/
-uint8_t MPU6050::getDeviceID() {
-    I2Cdev::readBits(devAddr, MPU6050_RA_WHO_AM_I, MPU6050_WHO_AM_I_BIT, MPU6050_WHO_AM_I_LENGTH, buffer);
-    return buffer[0];
-}
-/** Set Device ID.
-    Write a new ID into the WHO_AM_I register (no idea why this should ever be
-    necessary though).
-    @param id New device ID to set.
-    @see getDeviceID()
-    @see MPU6050_RA_WHO_AM_I
-    @see MPU6050_WHO_AM_I_BIT
-    @see MPU6050_WHO_AM_I_LENGTH
-*/
-void MPU6050::setDeviceID(uint8_t id) {
-    I2Cdev::writeBits(devAddr, MPU6050_RA_WHO_AM_I, MPU6050_WHO_AM_I_BIT, MPU6050_WHO_AM_I_LENGTH, id);
-}
-
-// ======== UNDOCUMENTED/DMP REGISTERS/METHODS ========
-
-// XG_OFFS_TC register
-
-uint8_t MPU6050::getOTPBankValid() {
-    I2Cdev::readBit(devAddr, MPU6050_RA_XG_OFFS_TC, MPU6050_TC_OTP_BNK_VLD_BIT, buffer);
-    return buffer[0];
-}
-void MPU6050::setOTPBankValid(bool enabled) {
-    I2Cdev::writeBit(devAddr, MPU6050_RA_XG_OFFS_TC, MPU6050_TC_OTP_BNK_VLD_BIT, enabled);
-}
-int8_t MPU6050::getXGyroOffset() {
-    I2Cdev::readBits(devAddr, MPU6050_RA_XG_OFFS_TC, MPU6050_TC_OFFSET_BIT, MPU6050_TC_OFFSET_LENGTH, buffer);
-    return buffer[0];
-}
-void MPU6050::setXGyroOffset(int8_t offset) {
-    I2Cdev::writeBits(devAddr, MPU6050_RA_XG_OFFS_TC, MPU6050_TC_OFFSET_BIT, MPU6050_TC_OFFSET_LENGTH, offset);
-}
-
-// YG_OFFS_TC register
-
-int8_t MPU6050::getYGyroOffset() {
-    I2Cdev::readBits(devAddr, MPU6050_RA_YG_OFFS_TC, MPU6050_TC_OFFSET_BIT, MPU6050_TC_OFFSET_LENGTH, buffer);
-    return buffer[0];
-}
-void MPU6050::setYGyroOffset(int8_t offset) {
-    I2Cdev::writeBits(devAddr, MPU6050_RA_YG_OFFS_TC, MPU6050_TC_OFFSET_BIT, MPU6050_TC_OFFSET_LENGTH, offset);
-}
-
-// ZG_OFFS_TC register
-
-int8_t MPU6050::getZGyroOffset() {
-    I2Cdev::readBits(devAddr, MPU6050_RA_ZG_OFFS_TC, MPU6050_TC_OFFSET_BIT, MPU6050_TC_OFFSET_LENGTH, buffer);
-    return buffer[0];
-}
-void MPU6050::setZGyroOffset(int8_t offset) {
-    I2Cdev::writeBits(devAddr, MPU6050_RA_ZG_OFFS_TC, MPU6050_TC_OFFSET_BIT, MPU6050_TC_OFFSET_LENGTH, offset);
-}
-
-// X_FINE_GAIN register
-
-int8_t MPU6050::getXFineGain() {
-    I2Cdev::readByte(devAddr, MPU6050_RA_X_FINE_GAIN, buffer);
-    return buffer[0];
-}
-void MPU6050::setXFineGain(int8_t gain) {
-    I2Cdev::writeByte(devAddr, MPU6050_RA_X_FINE_GAIN, gain);
-}
-
-// Y_FINE_GAIN register
-
-int8_t MPU6050::getYFineGain() {
-    I2Cdev::readByte(devAddr, MPU6050_RA_Y_FINE_GAIN, buffer);
-    return buffer[0];
-}
-void MPU6050::setYFineGain(int8_t gain) {
-    I2Cdev::writeByte(devAddr, MPU6050_RA_Y_FINE_GAIN, gain);
-}
-
-// Z_FINE_GAIN register
-
-int8_t MPU6050::getZFineGain() {
-    I2Cdev::readByte(devAddr, MPU6050_RA_Z_FINE_GAIN, buffer);
-    return buffer[0];
-}
-void MPU6050::setZFineGain(int8_t gain) {
-    I2Cdev::writeByte(devAddr, MPU6050_RA_Z_FINE_GAIN, gain);
-}
-
-// XA_OFFS_* registers
-
-int16_t MPU6050::getXAccelOffset() {
-    I2Cdev::readBytes(devAddr, MPU6050_RA_XA_OFFS_H, 2, buffer);
-    return (((int16_t)buffer[0]) << 8) | buffer[1];
-}
-void MPU6050::setXAccelOffset(int16_t offset) {
-    I2Cdev::writeWord(devAddr, MPU6050_RA_XA_OFFS_H, offset);
-}
-
-// YA_OFFS_* register
-
-int16_t MPU6050::getYAccelOffset() {
-    I2Cdev::readBytes(devAddr, MPU6050_RA_YA_OFFS_H, 2, buffer);
-    return (((int16_t)buffer[0]) << 8) | buffer[1];
-}
-void MPU6050::setYAccelOffset(int16_t offset) {
-    I2Cdev::writeWord(devAddr, MPU6050_RA_YA_OFFS_H, offset);
-}
-
-// ZA_OFFS_* register
-
-int16_t MPU6050::getZAccelOffset() {
-    I2Cdev::readBytes(devAddr, MPU6050_RA_ZA_OFFS_H, 2, buffer);
-    return (((int16_t)buffer[0]) << 8) | buffer[1];
-}
-void MPU6050::setZAccelOffset(int16_t offset) {
-    I2Cdev::writeWord(devAddr, MPU6050_RA_ZA_OFFS_H, offset);
-}
-
-// XG_OFFS_USR* registers
-
-int16_t MPU6050::getXGyroOffsetUser() {
-    I2Cdev::readBytes(devAddr, MPU6050_RA_XG_OFFS_USRH, 2, buffer);
-    return (((int16_t)buffer[0]) << 8) | buffer[1];
-}
-void MPU6050::setXGyroOffsetUser(int16_t offset) {
-    I2Cdev::writeWord(devAddr, MPU6050_RA_XG_OFFS_USRH, offset);
-}
-
-// YG_OFFS_USR* register
-
-int16_t MPU6050::getYGyroOffsetUser() {
-    I2Cdev::readBytes(devAddr, MPU6050_RA_YG_OFFS_USRH, 2, buffer);
-    return (((int16_t)buffer[0]) << 8) | buffer[1];
-}
-void MPU6050::setYGyroOffsetUser(int16_t offset) {
-    I2Cdev::writeWord(devAddr, MPU6050_RA_YG_OFFS_USRH, offset);
-}
-
-// ZG_OFFS_USR* register
-
-int16_t MPU6050::getZGyroOffsetUser() {
-    I2Cdev::readBytes(devAddr, MPU6050_RA_ZG_OFFS_USRH, 2, buffer);
-    return (((int16_t)buffer[0]) << 8) | buffer[1];
-}
-void MPU6050::setZGyroOffsetUser(int16_t offset) {
-    I2Cdev::writeWord(devAddr, MPU6050_RA_ZG_OFFS_USRH, offset);
-}
-
-// INT_ENABLE register (DMP functions)
-
-bool MPU6050::getIntPLLReadyEnabled() {
-    I2Cdev::readBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_PLL_RDY_INT_BIT, buffer);
-    return buffer[0];
-}
-void MPU6050::setIntPLLReadyEnabled(bool enabled) {
-    I2Cdev::writeBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_PLL_RDY_INT_BIT, enabled);
-}
-bool MPU6050::getIntDMPEnabled() {
-    I2Cdev::readBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_DMP_INT_BIT, buffer);
-    return buffer[0];
-}
-void MPU6050::setIntDMPEnabled(bool enabled) {
-    I2Cdev::writeBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_DMP_INT_BIT, enabled);
-}
-
-// DMP_INT_STATUS
-
-bool MPU6050::getDMPInt5Status() {
-    I2Cdev::readBit(devAddr, MPU6050_RA_DMP_INT_STATUS, MPU6050_DMPINT_5_BIT, buffer);
-    return buffer[0];
-}
-bool MPU6050::getDMPInt4Status() {
-    I2Cdev::readBit(devAddr, MPU6050_RA_DMP_INT_STATUS, MPU6050_DMPINT_4_BIT, buffer);
-    return buffer[0];
-}
-bool MPU6050::getDMPInt3Status() {
-    I2Cdev::readBit(devAddr, MPU6050_RA_DMP_INT_STATUS, MPU6050_DMPINT_3_BIT, buffer);
-    return buffer[0];
-}
-bool MPU6050::getDMPInt2Status() {
-    I2Cdev::readBit(devAddr, MPU6050_RA_DMP_INT_STATUS, MPU6050_DMPINT_2_BIT, buffer);
-    return buffer[0];
-}
-bool MPU6050::getDMPInt1Status() {
-    I2Cdev::readBit(devAddr, MPU6050_RA_DMP_INT_STATUS, MPU6050_DMPINT_1_BIT, buffer);
-    return buffer[0];
-}
-bool MPU6050::getDMPInt0Status() {
-    I2Cdev::readBit(devAddr, MPU6050_RA_DMP_INT_STATUS, MPU6050_DMPINT_0_BIT, buffer);
-    return buffer[0];
-}
-
-// INT_STATUS register (DMP functions)
-
-bool MPU6050::getIntPLLReadyStatus() {
-    I2Cdev::readBit(devAddr, MPU6050_RA_INT_STATUS, MPU6050_INTERRUPT_PLL_RDY_INT_BIT, buffer);
-    return buffer[0];
-}
-bool MPU6050::getIntDMPStatus() {
-    I2Cdev::readBit(devAddr, MPU6050_RA_INT_STATUS, MPU6050_INTERRUPT_DMP_INT_BIT, buffer);
-    return buffer[0];
-}
-
-// USER_CTRL register (DMP functions)
-
-bool MPU6050::getDMPEnabled() {
-    I2Cdev::readBit(devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_DMP_EN_BIT, buffer);
-    return buffer[0];
-}
-void MPU6050::setDMPEnabled(bool enabled) {
-    I2Cdev::writeBit(devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_DMP_EN_BIT, enabled);
-}
-void MPU6050::resetDMP() {
-    I2Cdev::writeBit(devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_DMP_RESET_BIT, true);
-}
-
-// BANK_SEL register
-
-void MPU6050::setMemoryBank(uint8_t bank, bool prefetchEnabled, bool userBank) {
-    bank &= 0x1F;
-    if (userBank) {
-        bank |= 0x20;
-    }
-    if (prefetchEnabled) {
-        bank |= 0x40;
-    }
-    I2Cdev::writeByte(devAddr, MPU6050_RA_BANK_SEL, bank);
-}
-
-// MEM_START_ADDR register
-
-void MPU6050::setMemoryStartAddress(uint8_t address) {
-    I2Cdev::writeByte(devAddr, MPU6050_RA_MEM_START_ADDR, address);
-}
-
-// MEM_R_W register
-
-uint8_t MPU6050::readMemoryByte() {
-    I2Cdev::readByte(devAddr, MPU6050_RA_MEM_R_W, buffer);
-    return buffer[0];
-}
-void MPU6050::writeMemoryByte(uint8_t data) {
-    I2Cdev::writeByte(devAddr, MPU6050_RA_MEM_R_W, data);
-}
-void MPU6050::readMemoryBlock(uint8_t* data, uint16_t dataSize, uint8_t bank, uint8_t address) {
-    setMemoryBank(bank);
-    setMemoryStartAddress(address);
-    uint8_t chunkSize;
-    for (uint16_t i = 0; i < dataSize;) {
-        // determine correct chunk size according to bank position and data size
-        chunkSize = MPU6050_DMP_MEMORY_CHUNK_SIZE;
-
-        // make sure we don't go past the data size
-        if (i + chunkSize > dataSize) {
-            chunkSize = dataSize - i;
-        }
-
-        // make sure this chunk doesn't go past the bank boundary (256 bytes)
-        if (chunkSize > 256 - address) {
-            chunkSize = 256 - address;
-        }
-
-        // read the chunk of data as specified
-        I2Cdev::readBytes(devAddr, MPU6050_RA_MEM_R_W, chunkSize, data + i);
-
-        // increase byte index by [chunkSize]
-        i += chunkSize;
-
-        // uint8_t automatically wraps to 0 at 256
-        address += chunkSize;
-
-        // if we aren't done, update bank (if necessary) and address
-        if (i < dataSize) {
-            if (address == 0) {
-                bank++;
-            }
-            setMemoryBank(bank);
-            setMemoryStartAddress(address);
-        }
-    }
-}
-bool MPU6050::writeMemoryBlock(const uint8_t* data, uint16_t dataSize, uint8_t bank, uint8_t address, bool verify,
-                               bool useProgMem) {
-    setMemoryBank(bank);
-    setMemoryStartAddress(address);
-    uint8_t chunkSize;
-    uint8_t* verifyBuffer;
-    uint8_t* progBuffer;
-    uint16_t i;
-    uint8_t j;
-    if (verify) {
-        verifyBuffer = (uint8_t*)malloc(MPU6050_DMP_MEMORY_CHUNK_SIZE);
-    }
-    if (useProgMem) {
-        progBuffer = (uint8_t*)malloc(MPU6050_DMP_MEMORY_CHUNK_SIZE);
-    }
-    for (i = 0; i < dataSize;) {
-        // determine correct chunk size according to bank position and data size
-        chunkSize = MPU6050_DMP_MEMORY_CHUNK_SIZE;
-
-        // make sure we don't go past the data size
-        if (i + chunkSize > dataSize) {
-            chunkSize = dataSize - i;
-        }
-
-        // make sure this chunk doesn't go past the bank boundary (256 bytes)
-        if (chunkSize > 256 - address) {
-            chunkSize = 256 - address;
-        }
-
-        if (useProgMem) {
-            // write the chunk of data as specified
-            for (j = 0; j < chunkSize; j++) {
-                progBuffer[j] = pgm_read_byte(data + i + j);
-            }
-        } else {
-            // write the chunk of data as specified
-            progBuffer = (uint8_t*)data + i;
-        }
-
-        I2Cdev::writeBytes(devAddr, MPU6050_RA_MEM_R_W, chunkSize, progBuffer);
-
-        // verify data if needed
-        if (verify && verifyBuffer) {
-            setMemoryBank(bank);
-            setMemoryStartAddress(address);
-            I2Cdev::readBytes(devAddr, MPU6050_RA_MEM_R_W, chunkSize, verifyBuffer);
-            if (memcmp(progBuffer, verifyBuffer, chunkSize) != 0) {
-                /*  Serial.print("Block write verification error, bank ");
-                    Serial.print(bank, DEC);
-                    Serial.print(", address ");
-                    Serial.print(address, DEC);
-                    Serial.print("!\nExpected:");
-                    for (j = 0; j < chunkSize; j++) {
-                    Serial.print(" 0x");
-                    if (progBuffer[j] < 16) Serial.print("0");
-                    Serial.print(progBuffer[j], HEX);
-                    }
-                    Serial.print("\nReceived:");
-                    for (uint8_t j = 0; j < chunkSize; j++) {
-                    Serial.print(" 0x");
-                    if (verifyBuffer[i + j] < 16) Serial.print("0");
-                    Serial.print(verifyBuffer[i + j], HEX);
-                    }
-                    Serial.print("\n");*/
-                free(verifyBuffer);
-                if (useProgMem) {
-                    free(progBuffer);
-                }
-                return false; // uh oh.
-            }
-        }
-
-        // increase byte index by [chunkSize]
-        i += chunkSize;
-
-        // uint8_t automatically wraps to 0 at 256
-        address += chunkSize;
-
-        // if we aren't done, update bank (if necessary) and address
-        if (i < dataSize) {
-            if (address == 0) {
-                bank++;
-            }
-            setMemoryBank(bank);
-            setMemoryStartAddress(address);
-        }
-    }
-    if (verify) {
-        free(verifyBuffer);
-    }
-    if (useProgMem) {
-        free(progBuffer);
-    }
-    return true;
-}
-bool MPU6050::writeProgMemoryBlock(const uint8_t* data, uint16_t dataSize, uint8_t bank, uint8_t address, bool verify) {
-    return writeMemoryBlock(data, dataSize, bank, address, verify, true);
-}
-bool MPU6050::writeDMPConfigurationSet(const uint8_t* data, uint16_t dataSize, bool useProgMem) {
-    uint8_t* progBuffer, success, special;
-    uint16_t i, j;
-    if (useProgMem) {
-        progBuffer = (uint8_t*)malloc(8);  // assume 8-byte blocks, realloc later if necessary
-    }
-
-    // config set data is a long string of blocks with the following structure:
-    // [bank] [offset] [length] [byte[0], byte[1], ..., byte[length]]
-    uint8_t bank, offset, length;
-    for (i = 0; i < dataSize;) {
-        if (useProgMem) {
-            bank = pgm_read_byte(data + i++);
-            offset = pgm_read_byte(data + i++);
-            length = pgm_read_byte(data + i++);
-        } else {
-            bank = data[i++];
-            offset = data[i++];
-            length = data[i++];
-        }
-
-        // write data or perform special action
-        if (length > 0) {
-            // regular block of data to write
-            /*  Serial.print("Writing config block to bank ");
-                Serial.print(bank);
-                Serial.print(", offset ");
-                Serial.print(offset);
-                Serial.print(", length=");
-                Serial.println(length);*/
-            if (useProgMem) {
-                if (sizeof(progBuffer) < length) {
-                    progBuffer = (uint8_t*)realloc(progBuffer, length);
-                }
-                for (j = 0; j < length; j++) {
-                    progBuffer[j] = pgm_read_byte(data + i + j);
-                }
-            } else {
-                progBuffer = (uint8_t*)data + i;
-            }
-            success = writeMemoryBlock(progBuffer, length, bank, offset, true);
-            i += length;
-        } else {
-            // special instruction
-            // NOTE: this kind of behavior (what and when to do certain things)
-            // is totally undocumented. This code is in here based on observed
-            // behavior only, and exactly why (or even whether) it has to be here
-            // is anybody's guess for now.
-            if (useProgMem) {
-                special = pgm_read_byte(data + i++);
-            } else {
-                special = data[i++];
-            }
-            /*  Serial.print("Special command code ");
-                Serial.print(special, HEX);
-                Serial.println(" found...");*/
-            if (special == 0x01) {
-                // enable DMP-related interrupts
-
-                //setIntZeroMotionEnabled(true);
-                //setIntFIFOBufferOverflowEnabled(true);
-                //setIntDMPEnabled(true);
-                I2Cdev::writeByte(devAddr, MPU6050_RA_INT_ENABLE, 0x32);  // single operation
-
-                success = true;
-            } else {
-                // unknown special command
-                success = false;
-            }
-        }
-
-        if (!success) {
-            if (useProgMem) {
-                free(progBuffer);
-            }
-            return false; // uh oh
-        }
-    }
-    if (useProgMem) {
-        free(progBuffer);
-    }
-    return true;
-}
-bool MPU6050::writeProgDMPConfigurationSet(const uint8_t* data, uint16_t dataSize) {
-    return writeDMPConfigurationSet(data, dataSize, true);
-}
-
-// DMP_CFG_1 register
-
-uint8_t MPU6050::getDMPConfig1() {
-    I2Cdev::readByte(devAddr, MPU6050_RA_DMP_CFG_1, buffer);
-    return buffer[0];
-}
-void MPU6050::setDMPConfig1(uint8_t config) {
-    I2Cdev::writeByte(devAddr, MPU6050_RA_DMP_CFG_1, config);
-}
-
-// DMP_CFG_2 register
-
-uint8_t MPU6050::getDMPConfig2() {
-    I2Cdev::readByte(devAddr, MPU6050_RA_DMP_CFG_2, buffer);
-    return buffer[0];
-}
-void MPU6050::setDMPConfig2(uint8_t config) {
-    I2Cdev::writeByte(devAddr, MPU6050_RA_DMP_CFG_2, config);
-}
\ No newline at end of file
diff --git a/labyrinthe/4-arduino_pyserial/etape1/4-labyrinthe-imu/MPU6050.h b/labyrinthe/4-arduino_pyserial/etape1/4-labyrinthe-imu/MPU6050.h
deleted file mode 100644
index d6f7848..0000000
--- a/labyrinthe/4-arduino_pyserial/etape1/4-labyrinthe-imu/MPU6050.h
+++ /dev/null
@@ -1,997 +0,0 @@
-// I2Cdev library collection - MPU6050 I2C device class
-// Based on InvenSense MPU-6050 register map document rev. 2.0, 5/19/2011 (RM-MPU-6000A-00)
-// 10/3/2011 by Jeff Rowberg 
-// Updates should (hopefully) always be available at https://github.com/jrowberg/i2cdevlib
-//
-// Changelog:
-//     ... - ongoing debug release
-
-// NOTE: THIS IS ONLY A PARIAL RELEASE. THIS DEVICE CLASS IS CURRENTLY UNDERGOING ACTIVE
-// DEVELOPMENT AND IS STILL MISSING SOME IMPORTANT FEATURES. PLEASE KEEP THIS IN MIND IF
-// YOU DECIDE TO USE THIS PARTICULAR CODE FOR ANYTHING.
-
-/*  ============================================
-    I2Cdev device library code is placed under the MIT license
-    Copyright (c) 2012 Jeff Rowberg
-
-    Permission is hereby granted, free of charge, to any person obtaining a copy
-    of this software and associated documentation files (the "Software"), to deal
-    in the Software without restriction, including without limitation the rights
-    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-    copies of the Software, and to permit persons to whom the Software is
-    furnished to do so, subject to the following conditions:
-
-    The above copyright notice and this permission notice shall be included in
-    all copies or substantial portions of the Software.
-
-    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-    THE SOFTWARE.
-    ===============================================
-*/
-
-#ifndef _MPU6050_H_
-#define _MPU6050_H_
-
-#include "I2Cdev.h"
-#include 
-
-//Magnetometer Registers
-#define MPU9150_RA_MAG_ADDRESS		0x0C
-#define MPU9150_RA_MAG_XOUT_L		0x03
-#define MPU9150_RA_MAG_XOUT_H		0x04
-#define MPU9150_RA_MAG_YOUT_L		0x05
-#define MPU9150_RA_MAG_YOUT_H		0x06
-#define MPU9150_RA_MAG_ZOUT_L		0x07
-#define MPU9150_RA_MAG_ZOUT_H		0x08
-
-#define MPU6050_ADDRESS_AD0_LOW     0x68 // address pin low (GND), default for InvenSense evaluation board
-#define MPU6050_ADDRESS_AD0_HIGH    0x69 // address pin high (VCC)
-#define MPU6050_DEFAULT_ADDRESS     MPU6050_ADDRESS_AD0_LOW
-
-#define MPU6050_RA_XG_OFFS_TC       0x00 //[7] PWR_MODE, [6:1] XG_OFFS_TC, [0] OTP_BNK_VLD
-#define MPU6050_RA_YG_OFFS_TC       0x01 //[7] PWR_MODE, [6:1] YG_OFFS_TC, [0] OTP_BNK_VLD
-#define MPU6050_RA_ZG_OFFS_TC       0x02 //[7] PWR_MODE, [6:1] ZG_OFFS_TC, [0] OTP_BNK_VLD
-#define MPU6050_RA_X_FINE_GAIN      0x03 //[7:0] X_FINE_GAIN
-#define MPU6050_RA_Y_FINE_GAIN      0x04 //[7:0] Y_FINE_GAIN
-#define MPU6050_RA_Z_FINE_GAIN      0x05 //[7:0] Z_FINE_GAIN
-#define MPU6050_RA_XA_OFFS_H        0x06 //[15:0] XA_OFFS
-#define MPU6050_RA_XA_OFFS_L_TC     0x07
-#define MPU6050_RA_YA_OFFS_H        0x08 //[15:0] YA_OFFS
-#define MPU6050_RA_YA_OFFS_L_TC     0x09
-#define MPU6050_RA_ZA_OFFS_H        0x0A //[15:0] ZA_OFFS
-#define MPU6050_RA_ZA_OFFS_L_TC     0x0B
-#define MPU6050_RA_XG_OFFS_USRH     0x13 //[15:0] XG_OFFS_USR
-#define MPU6050_RA_XG_OFFS_USRL     0x14
-#define MPU6050_RA_YG_OFFS_USRH     0x15 //[15:0] YG_OFFS_USR
-#define MPU6050_RA_YG_OFFS_USRL     0x16
-#define MPU6050_RA_ZG_OFFS_USRH     0x17 //[15:0] ZG_OFFS_USR
-#define MPU6050_RA_ZG_OFFS_USRL     0x18
-#define MPU6050_RA_SMPLRT_DIV       0x19
-#define MPU6050_RA_CONFIG           0x1A
-#define MPU6050_RA_GYRO_CONFIG      0x1B
-#define MPU6050_RA_ACCEL_CONFIG     0x1C
-#define MPU6050_RA_FF_THR           0x1D
-#define MPU6050_RA_FF_DUR           0x1E
-#define MPU6050_RA_MOT_THR          0x1F
-#define MPU6050_RA_MOT_DUR          0x20
-#define MPU6050_RA_ZRMOT_THR        0x21
-#define MPU6050_RA_ZRMOT_DUR        0x22
-#define MPU6050_RA_FIFO_EN          0x23
-#define MPU6050_RA_I2C_MST_CTRL     0x24
-#define MPU6050_RA_I2C_SLV0_ADDR    0x25
-#define MPU6050_RA_I2C_SLV0_REG     0x26
-#define MPU6050_RA_I2C_SLV0_CTRL    0x27
-#define MPU6050_RA_I2C_SLV1_ADDR    0x28
-#define MPU6050_RA_I2C_SLV1_REG     0x29
-#define MPU6050_RA_I2C_SLV1_CTRL    0x2A
-#define MPU6050_RA_I2C_SLV2_ADDR    0x2B
-#define MPU6050_RA_I2C_SLV2_REG     0x2C
-#define MPU6050_RA_I2C_SLV2_CTRL    0x2D
-#define MPU6050_RA_I2C_SLV3_ADDR    0x2E
-#define MPU6050_RA_I2C_SLV3_REG     0x2F
-#define MPU6050_RA_I2C_SLV3_CTRL    0x30
-#define MPU6050_RA_I2C_SLV4_ADDR    0x31
-#define MPU6050_RA_I2C_SLV4_REG     0x32
-#define MPU6050_RA_I2C_SLV4_DO      0x33
-#define MPU6050_RA_I2C_SLV4_CTRL    0x34
-#define MPU6050_RA_I2C_SLV4_DI      0x35
-#define MPU6050_RA_I2C_MST_STATUS   0x36
-#define MPU6050_RA_INT_PIN_CFG      0x37
-#define MPU6050_RA_INT_ENABLE       0x38
-#define MPU6050_RA_DMP_INT_STATUS   0x39
-#define MPU6050_RA_INT_STATUS       0x3A
-#define MPU6050_RA_ACCEL_XOUT_H     0x3B
-#define MPU6050_RA_ACCEL_XOUT_L     0x3C
-#define MPU6050_RA_ACCEL_YOUT_H     0x3D
-#define MPU6050_RA_ACCEL_YOUT_L     0x3E
-#define MPU6050_RA_ACCEL_ZOUT_H     0x3F
-#define MPU6050_RA_ACCEL_ZOUT_L     0x40
-#define MPU6050_RA_TEMP_OUT_H       0x41
-#define MPU6050_RA_TEMP_OUT_L       0x42
-#define MPU6050_RA_GYRO_XOUT_H      0x43
-#define MPU6050_RA_GYRO_XOUT_L      0x44
-#define MPU6050_RA_GYRO_YOUT_H      0x45
-#define MPU6050_RA_GYRO_YOUT_L      0x46
-#define MPU6050_RA_GYRO_ZOUT_H      0x47
-#define MPU6050_RA_GYRO_ZOUT_L      0x48
-#define MPU6050_RA_EXT_SENS_DATA_00 0x49
-#define MPU6050_RA_EXT_SENS_DATA_01 0x4A
-#define MPU6050_RA_EXT_SENS_DATA_02 0x4B
-#define MPU6050_RA_EXT_SENS_DATA_03 0x4C
-#define MPU6050_RA_EXT_SENS_DATA_04 0x4D
-#define MPU6050_RA_EXT_SENS_DATA_05 0x4E
-#define MPU6050_RA_EXT_SENS_DATA_06 0x4F
-#define MPU6050_RA_EXT_SENS_DATA_07 0x50
-#define MPU6050_RA_EXT_SENS_DATA_08 0x51
-#define MPU6050_RA_EXT_SENS_DATA_09 0x52
-#define MPU6050_RA_EXT_SENS_DATA_10 0x53
-#define MPU6050_RA_EXT_SENS_DATA_11 0x54
-#define MPU6050_RA_EXT_SENS_DATA_12 0x55
-#define MPU6050_RA_EXT_SENS_DATA_13 0x56
-#define MPU6050_RA_EXT_SENS_DATA_14 0x57
-#define MPU6050_RA_EXT_SENS_DATA_15 0x58
-#define MPU6050_RA_EXT_SENS_DATA_16 0x59
-#define MPU6050_RA_EXT_SENS_DATA_17 0x5A
-#define MPU6050_RA_EXT_SENS_DATA_18 0x5B
-#define MPU6050_RA_EXT_SENS_DATA_19 0x5C
-#define MPU6050_RA_EXT_SENS_DATA_20 0x5D
-#define MPU6050_RA_EXT_SENS_DATA_21 0x5E
-#define MPU6050_RA_EXT_SENS_DATA_22 0x5F
-#define MPU6050_RA_EXT_SENS_DATA_23 0x60
-#define MPU6050_RA_MOT_DETECT_STATUS    0x61
-#define MPU6050_RA_I2C_SLV0_DO      0x63
-#define MPU6050_RA_I2C_SLV1_DO      0x64
-#define MPU6050_RA_I2C_SLV2_DO      0x65
-#define MPU6050_RA_I2C_SLV3_DO      0x66
-#define MPU6050_RA_I2C_MST_DELAY_CTRL   0x67
-#define MPU6050_RA_SIGNAL_PATH_RESET    0x68
-#define MPU6050_RA_MOT_DETECT_CTRL      0x69
-#define MPU6050_RA_USER_CTRL        0x6A
-#define MPU6050_RA_PWR_MGMT_1       0x6B
-#define MPU6050_RA_PWR_MGMT_2       0x6C
-#define MPU6050_RA_BANK_SEL         0x6D
-#define MPU6050_RA_MEM_START_ADDR   0x6E
-#define MPU6050_RA_MEM_R_W          0x6F
-#define MPU6050_RA_DMP_CFG_1        0x70
-#define MPU6050_RA_DMP_CFG_2        0x71
-#define MPU6050_RA_FIFO_COUNTH      0x72
-#define MPU6050_RA_FIFO_COUNTL      0x73
-#define MPU6050_RA_FIFO_R_W         0x74
-#define MPU6050_RA_WHO_AM_I         0x75
-
-#define MPU6050_TC_PWR_MODE_BIT     7
-#define MPU6050_TC_OFFSET_BIT       6
-#define MPU6050_TC_OFFSET_LENGTH    6
-#define MPU6050_TC_OTP_BNK_VLD_BIT  0
-
-#define MPU6050_VDDIO_LEVEL_VLOGIC  0
-#define MPU6050_VDDIO_LEVEL_VDD     1
-
-#define MPU6050_CFG_EXT_SYNC_SET_BIT    5
-#define MPU6050_CFG_EXT_SYNC_SET_LENGTH 3
-#define MPU6050_CFG_DLPF_CFG_BIT    2
-#define MPU6050_CFG_DLPF_CFG_LENGTH 3
-
-#define MPU6050_EXT_SYNC_DISABLED       0x0
-#define MPU6050_EXT_SYNC_TEMP_OUT_L     0x1
-#define MPU6050_EXT_SYNC_GYRO_XOUT_L    0x2
-#define MPU6050_EXT_SYNC_GYRO_YOUT_L    0x3
-#define MPU6050_EXT_SYNC_GYRO_ZOUT_L    0x4
-#define MPU6050_EXT_SYNC_ACCEL_XOUT_L   0x5
-#define MPU6050_EXT_SYNC_ACCEL_YOUT_L   0x6
-#define MPU6050_EXT_SYNC_ACCEL_ZOUT_L   0x7
-
-#define MPU6050_DLPF_BW_256         0x00
-#define MPU6050_DLPF_BW_188         0x01
-#define MPU6050_DLPF_BW_98          0x02
-#define MPU6050_DLPF_BW_42          0x03
-#define MPU6050_DLPF_BW_20          0x04
-#define MPU6050_DLPF_BW_10          0x05
-#define MPU6050_DLPF_BW_5           0x06
-
-#define MPU6050_GCONFIG_FS_SEL_BIT      4
-#define MPU6050_GCONFIG_FS_SEL_LENGTH   2
-
-#define MPU6050_GYRO_FS_250         0x00
-#define MPU6050_GYRO_FS_500         0x01
-#define MPU6050_GYRO_FS_1000        0x02
-#define MPU6050_GYRO_FS_2000        0x03
-
-#define MPU6050_ACONFIG_XA_ST_BIT           7
-#define MPU6050_ACONFIG_YA_ST_BIT           6
-#define MPU6050_ACONFIG_ZA_ST_BIT           5
-#define MPU6050_ACONFIG_AFS_SEL_BIT         4
-#define MPU6050_ACONFIG_AFS_SEL_LENGTH      2
-#define MPU6050_ACONFIG_ACCEL_HPF_BIT       2
-#define MPU6050_ACONFIG_ACCEL_HPF_LENGTH    3
-
-#define MPU6050_ACCEL_FS_2          0x00
-#define MPU6050_ACCEL_FS_4          0x01
-#define MPU6050_ACCEL_FS_8          0x02
-#define MPU6050_ACCEL_FS_16         0x03
-
-#define MPU6050_DHPF_RESET          0x00
-#define MPU6050_DHPF_5              0x01
-#define MPU6050_DHPF_2P5            0x02
-#define MPU6050_DHPF_1P25           0x03
-#define MPU6050_DHPF_0P63           0x04
-#define MPU6050_DHPF_HOLD           0x07
-
-#define MPU6050_TEMP_FIFO_EN_BIT    7
-#define MPU6050_XG_FIFO_EN_BIT      6
-#define MPU6050_YG_FIFO_EN_BIT      5
-#define MPU6050_ZG_FIFO_EN_BIT      4
-#define MPU6050_ACCEL_FIFO_EN_BIT   3
-#define MPU6050_SLV2_FIFO_EN_BIT    2
-#define MPU6050_SLV1_FIFO_EN_BIT    1
-#define MPU6050_SLV0_FIFO_EN_BIT    0
-
-#define MPU6050_MULT_MST_EN_BIT     7
-#define MPU6050_WAIT_FOR_ES_BIT     6
-#define MPU6050_SLV_3_FIFO_EN_BIT   5
-#define MPU6050_I2C_MST_P_NSR_BIT   4
-#define MPU6050_I2C_MST_CLK_BIT     3
-#define MPU6050_I2C_MST_CLK_LENGTH  4
-
-#define MPU6050_CLOCK_DIV_348       0x0
-#define MPU6050_CLOCK_DIV_333       0x1
-#define MPU6050_CLOCK_DIV_320       0x2
-#define MPU6050_CLOCK_DIV_308       0x3
-#define MPU6050_CLOCK_DIV_296       0x4
-#define MPU6050_CLOCK_DIV_286       0x5
-#define MPU6050_CLOCK_DIV_276       0x6
-#define MPU6050_CLOCK_DIV_267       0x7
-#define MPU6050_CLOCK_DIV_258       0x8
-#define MPU6050_CLOCK_DIV_500       0x9
-#define MPU6050_CLOCK_DIV_471       0xA
-#define MPU6050_CLOCK_DIV_444       0xB
-#define MPU6050_CLOCK_DIV_421       0xC
-#define MPU6050_CLOCK_DIV_400       0xD
-#define MPU6050_CLOCK_DIV_381       0xE
-#define MPU6050_CLOCK_DIV_364       0xF
-
-#define MPU6050_I2C_SLV_RW_BIT      7
-#define MPU6050_I2C_SLV_ADDR_BIT    6
-#define MPU6050_I2C_SLV_ADDR_LENGTH 7
-#define MPU6050_I2C_SLV_EN_BIT      7
-#define MPU6050_I2C_SLV_BYTE_SW_BIT 6
-#define MPU6050_I2C_SLV_REG_DIS_BIT 5
-#define MPU6050_I2C_SLV_GRP_BIT     4
-#define MPU6050_I2C_SLV_LEN_BIT     3
-#define MPU6050_I2C_SLV_LEN_LENGTH  4
-
-#define MPU6050_I2C_SLV4_RW_BIT         7
-#define MPU6050_I2C_SLV4_ADDR_BIT       6
-#define MPU6050_I2C_SLV4_ADDR_LENGTH    7
-#define MPU6050_I2C_SLV4_EN_BIT         7
-#define MPU6050_I2C_SLV4_INT_EN_BIT     6
-#define MPU6050_I2C_SLV4_REG_DIS_BIT    5
-#define MPU6050_I2C_SLV4_MST_DLY_BIT    4
-#define MPU6050_I2C_SLV4_MST_DLY_LENGTH 5
-
-#define MPU6050_MST_PASS_THROUGH_BIT    7
-#define MPU6050_MST_I2C_SLV4_DONE_BIT   6
-#define MPU6050_MST_I2C_LOST_ARB_BIT    5
-#define MPU6050_MST_I2C_SLV4_NACK_BIT   4
-#define MPU6050_MST_I2C_SLV3_NACK_BIT   3
-#define MPU6050_MST_I2C_SLV2_NACK_BIT   2
-#define MPU6050_MST_I2C_SLV1_NACK_BIT   1
-#define MPU6050_MST_I2C_SLV0_NACK_BIT   0
-
-#define MPU6050_INTCFG_INT_LEVEL_BIT        7
-#define MPU6050_INTCFG_INT_OPEN_BIT         6
-#define MPU6050_INTCFG_LATCH_INT_EN_BIT     5
-#define MPU6050_INTCFG_INT_RD_CLEAR_BIT     4
-#define MPU6050_INTCFG_FSYNC_INT_LEVEL_BIT  3
-#define MPU6050_INTCFG_FSYNC_INT_EN_BIT     2
-#define MPU6050_INTCFG_I2C_BYPASS_EN_BIT    1
-#define MPU6050_INTCFG_CLKOUT_EN_BIT        0
-
-#define MPU6050_INTMODE_ACTIVEHIGH  0x00
-#define MPU6050_INTMODE_ACTIVELOW   0x01
-
-#define MPU6050_INTDRV_PUSHPULL     0x00
-#define MPU6050_INTDRV_OPENDRAIN    0x01
-
-#define MPU6050_INTLATCH_50USPULSE  0x00
-#define MPU6050_INTLATCH_WAITCLEAR  0x01
-
-#define MPU6050_INTCLEAR_STATUSREAD 0x00
-#define MPU6050_INTCLEAR_ANYREAD    0x01
-
-#define MPU6050_INTERRUPT_FF_BIT            7
-#define MPU6050_INTERRUPT_MOT_BIT           6
-#define MPU6050_INTERRUPT_ZMOT_BIT          5
-#define MPU6050_INTERRUPT_FIFO_OFLOW_BIT    4
-#define MPU6050_INTERRUPT_I2C_MST_INT_BIT   3
-#define MPU6050_INTERRUPT_PLL_RDY_INT_BIT   2
-#define MPU6050_INTERRUPT_DMP_INT_BIT       1
-#define MPU6050_INTERRUPT_DATA_RDY_BIT      0
-
-// TODO: figure out what these actually do
-// UMPL source code is not very obivous
-#define MPU6050_DMPINT_5_BIT            5
-#define MPU6050_DMPINT_4_BIT            4
-#define MPU6050_DMPINT_3_BIT            3
-#define MPU6050_DMPINT_2_BIT            2
-#define MPU6050_DMPINT_1_BIT            1
-#define MPU6050_DMPINT_0_BIT            0
-
-#define MPU6050_MOTION_MOT_XNEG_BIT     7
-#define MPU6050_MOTION_MOT_XPOS_BIT     6
-#define MPU6050_MOTION_MOT_YNEG_BIT     5
-#define MPU6050_MOTION_MOT_YPOS_BIT     4
-#define MPU6050_MOTION_MOT_ZNEG_BIT     3
-#define MPU6050_MOTION_MOT_ZPOS_BIT     2
-#define MPU6050_MOTION_MOT_ZRMOT_BIT    0
-
-#define MPU6050_DELAYCTRL_DELAY_ES_SHADOW_BIT   7
-#define MPU6050_DELAYCTRL_I2C_SLV4_DLY_EN_BIT   4
-#define MPU6050_DELAYCTRL_I2C_SLV3_DLY_EN_BIT   3
-#define MPU6050_DELAYCTRL_I2C_SLV2_DLY_EN_BIT   2
-#define MPU6050_DELAYCTRL_I2C_SLV1_DLY_EN_BIT   1
-#define MPU6050_DELAYCTRL_I2C_SLV0_DLY_EN_BIT   0
-
-#define MPU6050_PATHRESET_GYRO_RESET_BIT    2
-#define MPU6050_PATHRESET_ACCEL_RESET_BIT   1
-#define MPU6050_PATHRESET_TEMP_RESET_BIT    0
-
-#define MPU6050_DETECT_ACCEL_ON_DELAY_BIT       5
-#define MPU6050_DETECT_ACCEL_ON_DELAY_LENGTH    2
-#define MPU6050_DETECT_FF_COUNT_BIT             3
-#define MPU6050_DETECT_FF_COUNT_LENGTH          2
-#define MPU6050_DETECT_MOT_COUNT_BIT            1
-#define MPU6050_DETECT_MOT_COUNT_LENGTH         2
-
-#define MPU6050_DETECT_DECREMENT_RESET  0x0
-#define MPU6050_DETECT_DECREMENT_1      0x1
-#define MPU6050_DETECT_DECREMENT_2      0x2
-#define MPU6050_DETECT_DECREMENT_4      0x3
-
-#define MPU6050_USERCTRL_DMP_EN_BIT             7
-#define MPU6050_USERCTRL_FIFO_EN_BIT            6
-#define MPU6050_USERCTRL_I2C_MST_EN_BIT         5
-#define MPU6050_USERCTRL_I2C_IF_DIS_BIT         4
-#define MPU6050_USERCTRL_DMP_RESET_BIT          3
-#define MPU6050_USERCTRL_FIFO_RESET_BIT         2
-#define MPU6050_USERCTRL_I2C_MST_RESET_BIT      1
-#define MPU6050_USERCTRL_SIG_COND_RESET_BIT     0
-
-#define MPU6050_PWR1_DEVICE_RESET_BIT   7
-#define MPU6050_PWR1_SLEEP_BIT          6
-#define MPU6050_PWR1_CYCLE_BIT          5
-#define MPU6050_PWR1_TEMP_DIS_BIT       3
-#define MPU6050_PWR1_CLKSEL_BIT         2
-#define MPU6050_PWR1_CLKSEL_LENGTH      3
-
-#define MPU6050_CLOCK_INTERNAL          0x00
-#define MPU6050_CLOCK_PLL_XGYRO         0x01
-#define MPU6050_CLOCK_PLL_YGYRO         0x02
-#define MPU6050_CLOCK_PLL_ZGYRO         0x03
-#define MPU6050_CLOCK_PLL_EXT32K        0x04
-#define MPU6050_CLOCK_PLL_EXT19M        0x05
-#define MPU6050_CLOCK_KEEP_RESET        0x07
-
-#define MPU6050_PWR2_LP_WAKE_CTRL_BIT       7
-#define MPU6050_PWR2_LP_WAKE_CTRL_LENGTH    2
-#define MPU6050_PWR2_STBY_XA_BIT            5
-#define MPU6050_PWR2_STBY_YA_BIT            4
-#define MPU6050_PWR2_STBY_ZA_BIT            3
-#define MPU6050_PWR2_STBY_XG_BIT            2
-#define MPU6050_PWR2_STBY_YG_BIT            1
-#define MPU6050_PWR2_STBY_ZG_BIT            0
-
-#define MPU6050_WAKE_FREQ_1P25      0x0
-#define MPU6050_WAKE_FREQ_2P5       0x1
-#define MPU6050_WAKE_FREQ_5         0x2
-#define MPU6050_WAKE_FREQ_10        0x3
-
-#define MPU6050_BANKSEL_PRFTCH_EN_BIT       6
-#define MPU6050_BANKSEL_CFG_USER_BANK_BIT   5
-#define MPU6050_BANKSEL_MEM_SEL_BIT         4
-#define MPU6050_BANKSEL_MEM_SEL_LENGTH      5
-
-#define MPU6050_WHO_AM_I_BIT        6
-#define MPU6050_WHO_AM_I_LENGTH     6
-
-#define MPU6050_DMP_MEMORY_BANKS        8
-#define MPU6050_DMP_MEMORY_BANK_SIZE    256
-#define MPU6050_DMP_MEMORY_CHUNK_SIZE   16
-
-// note: DMP code memory blocks defined at end of header file
-
-class MPU6050 {
-  public:
-    MPU6050();
-    MPU6050(uint8_t address);
-
-    void initialize();
-    bool testConnection();
-
-    // AUX_VDDIO register
-    uint8_t getAuxVDDIOLevel();
-    void setAuxVDDIOLevel(uint8_t level);
-
-    // SMPLRT_DIV register
-    uint8_t getRate();
-    void setRate(uint8_t rate);
-
-    // CONFIG register
-    uint8_t getExternalFrameSync();
-    void setExternalFrameSync(uint8_t sync);
-    uint8_t getDLPFMode();
-    void setDLPFMode(uint8_t bandwidth);
-
-    // GYRO_CONFIG register
-    uint8_t getFullScaleGyroRange();
-    void setFullScaleGyroRange(uint8_t range);
-
-    // ACCEL_CONFIG register
-    bool getAccelXSelfTest();
-    void setAccelXSelfTest(bool enabled);
-    bool getAccelYSelfTest();
-    void setAccelYSelfTest(bool enabled);
-    bool getAccelZSelfTest();
-    void setAccelZSelfTest(bool enabled);
-    uint8_t getFullScaleAccelRange();
-    void setFullScaleAccelRange(uint8_t range);
-    uint8_t getDHPFMode();
-    void setDHPFMode(uint8_t mode);
-
-    // FF_THR register
-    uint8_t getFreefallDetectionThreshold();
-    void setFreefallDetectionThreshold(uint8_t threshold);
-
-    // FF_DUR register
-    uint8_t getFreefallDetectionDuration();
-    void setFreefallDetectionDuration(uint8_t duration);
-
-    // MOT_THR register
-    uint8_t getMotionDetectionThreshold();
-    void setMotionDetectionThreshold(uint8_t threshold);
-
-    // MOT_DUR register
-    uint8_t getMotionDetectionDuration();
-    void setMotionDetectionDuration(uint8_t duration);
-
-    // ZRMOT_THR register
-    uint8_t getZeroMotionDetectionThreshold();
-    void setZeroMotionDetectionThreshold(uint8_t threshold);
-
-    // ZRMOT_DUR register
-    uint8_t getZeroMotionDetectionDuration();
-    void setZeroMotionDetectionDuration(uint8_t duration);
-
-    // FIFO_EN register
-    bool getTempFIFOEnabled();
-    void setTempFIFOEnabled(bool enabled);
-    bool getXGyroFIFOEnabled();
-    void setXGyroFIFOEnabled(bool enabled);
-    bool getYGyroFIFOEnabled();
-    void setYGyroFIFOEnabled(bool enabled);
-    bool getZGyroFIFOEnabled();
-    void setZGyroFIFOEnabled(bool enabled);
-    bool getAccelFIFOEnabled();
-    void setAccelFIFOEnabled(bool enabled);
-    bool getSlave2FIFOEnabled();
-    void setSlave2FIFOEnabled(bool enabled);
-    bool getSlave1FIFOEnabled();
-    void setSlave1FIFOEnabled(bool enabled);
-    bool getSlave0FIFOEnabled();
-    void setSlave0FIFOEnabled(bool enabled);
-
-    // I2C_MST_CTRL register
-    bool getMultiMasterEnabled();
-    void setMultiMasterEnabled(bool enabled);
-    bool getWaitForExternalSensorEnabled();
-    void setWaitForExternalSensorEnabled(bool enabled);
-    bool getSlave3FIFOEnabled();
-    void setSlave3FIFOEnabled(bool enabled);
-    bool getSlaveReadWriteTransitionEnabled();
-    void setSlaveReadWriteTransitionEnabled(bool enabled);
-    uint8_t getMasterClockSpeed();
-    void setMasterClockSpeed(uint8_t speed);
-
-    // I2C_SLV* registers (Slave 0-3)
-    uint8_t getSlaveAddress(uint8_t num);
-    void setSlaveAddress(uint8_t num, uint8_t address);
-    uint8_t getSlaveRegister(uint8_t num);
-    void setSlaveRegister(uint8_t num, uint8_t reg);
-    bool getSlaveEnabled(uint8_t num);
-    void setSlaveEnabled(uint8_t num, bool enabled);
-    bool getSlaveWordByteSwap(uint8_t num);
-    void setSlaveWordByteSwap(uint8_t num, bool enabled);
-    bool getSlaveWriteMode(uint8_t num);
-    void setSlaveWriteMode(uint8_t num, bool mode);
-    bool getSlaveWordGroupOffset(uint8_t num);
-    void setSlaveWordGroupOffset(uint8_t num, bool enabled);
-    uint8_t getSlaveDataLength(uint8_t num);
-    void setSlaveDataLength(uint8_t num, uint8_t length);
-
-    // I2C_SLV* registers (Slave 4)
-    uint8_t getSlave4Address();
-    void setSlave4Address(uint8_t address);
-    uint8_t getSlave4Register();
-    void setSlave4Register(uint8_t reg);
-    void setSlave4OutputByte(uint8_t data);
-    bool getSlave4Enabled();
-    void setSlave4Enabled(bool enabled);
-    bool getSlave4InterruptEnabled();
-    void setSlave4InterruptEnabled(bool enabled);
-    bool getSlave4WriteMode();
-    void setSlave4WriteMode(bool mode);
-    uint8_t getSlave4MasterDelay();
-    void setSlave4MasterDelay(uint8_t delay);
-    uint8_t getSlate4InputByte();
-
-    // I2C_MST_STATUS register
-    bool getPassthroughStatus();
-    bool getSlave4IsDone();
-    bool getLostArbitration();
-    bool getSlave4Nack();
-    bool getSlave3Nack();
-    bool getSlave2Nack();
-    bool getSlave1Nack();
-    bool getSlave0Nack();
-
-    // INT_PIN_CFG register
-    bool getInterruptMode();
-    void setInterruptMode(bool mode);
-    bool getInterruptDrive();
-    void setInterruptDrive(bool drive);
-    bool getInterruptLatch();
-    void setInterruptLatch(bool latch);
-    bool getInterruptLatchClear();
-    void setInterruptLatchClear(bool clear);
-    bool getFSyncInterruptLevel();
-    void setFSyncInterruptLevel(bool level);
-    bool getFSyncInterruptEnabled();
-    void setFSyncInterruptEnabled(bool enabled);
-    bool getI2CBypassEnabled();
-    void setI2CBypassEnabled(bool enabled);
-    bool getClockOutputEnabled();
-    void setClockOutputEnabled(bool enabled);
-
-    // INT_ENABLE register
-    uint8_t getIntEnabled();
-    void setIntEnabled(uint8_t enabled);
-    bool getIntFreefallEnabled();
-    void setIntFreefallEnabled(bool enabled);
-    bool getIntMotionEnabled();
-    void setIntMotionEnabled(bool enabled);
-    bool getIntZeroMotionEnabled();
-    void setIntZeroMotionEnabled(bool enabled);
-    bool getIntFIFOBufferOverflowEnabled();
-    void setIntFIFOBufferOverflowEnabled(bool enabled);
-    bool getIntI2CMasterEnabled();
-    void setIntI2CMasterEnabled(bool enabled);
-    bool getIntDataReadyEnabled();
-    void setIntDataReadyEnabled(bool enabled);
-
-    // INT_STATUS register
-    uint8_t getIntStatus();
-    bool getIntFreefallStatus();
-    bool getIntMotionStatus();
-    bool getIntZeroMotionStatus();
-    bool getIntFIFOBufferOverflowStatus();
-    bool getIntI2CMasterStatus();
-    bool getIntDataReadyStatus();
-
-    // ACCEL_*OUT_* registers
-    void 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);
-    void getMotion6(int16_t* ax, int16_t* ay, int16_t* az, int16_t* gx, int16_t* gy, int16_t* gz);
-    void getAcceleration(int16_t* x, int16_t* y, int16_t* z);
-    int16_t getAccelerationX();
-    int16_t getAccelerationY();
-    int16_t getAccelerationZ();
-
-    // TEMP_OUT_* registers
-    int16_t getTemperature();
-
-    // GYRO_*OUT_* registers
-    void getRotation(int16_t* x, int16_t* y, int16_t* z);
-    int16_t getRotationX();
-    int16_t getRotationY();
-    int16_t getRotationZ();
-
-    // EXT_SENS_DATA_* registers
-    uint8_t getExternalSensorByte(int position);
-    uint16_t getExternalSensorWord(int position);
-    uint32_t getExternalSensorDWord(int position);
-
-    // MOT_DETECT_STATUS register
-    bool getXNegMotionDetected();
-    bool getXPosMotionDetected();
-    bool getYNegMotionDetected();
-    bool getYPosMotionDetected();
-    bool getZNegMotionDetected();
-    bool getZPosMotionDetected();
-    bool getZeroMotionDetected();
-
-    // I2C_SLV*_DO register
-    void setSlaveOutputByte(uint8_t num, uint8_t data);
-
-    // I2C_MST_DELAY_CTRL register
-    bool getExternalShadowDelayEnabled();
-    void setExternalShadowDelayEnabled(bool enabled);
-    bool getSlaveDelayEnabled(uint8_t num);
-    void setSlaveDelayEnabled(uint8_t num, bool enabled);
-
-    // SIGNAL_PATH_RESET register
-    void resetGyroscopePath();
-    void resetAccelerometerPath();
-    void resetTemperaturePath();
-
-    // MOT_DETECT_CTRL register
-    uint8_t getAccelerometerPowerOnDelay();
-    void setAccelerometerPowerOnDelay(uint8_t delay);
-    uint8_t getFreefallDetectionCounterDecrement();
-    void setFreefallDetectionCounterDecrement(uint8_t decrement);
-    uint8_t getMotionDetectionCounterDecrement();
-    void setMotionDetectionCounterDecrement(uint8_t decrement);
-
-    // USER_CTRL register
-    bool getFIFOEnabled();
-    void setFIFOEnabled(bool enabled);
-    bool getI2CMasterModeEnabled();
-    void setI2CMasterModeEnabled(bool enabled);
-    void switchSPIEnabled(bool enabled);
-    void resetFIFO();
-    void resetI2CMaster();
-    void resetSensors();
-
-    // PWR_MGMT_1 register
-    void reset();
-    bool getSleepEnabled();
-    void setSleepEnabled(bool enabled);
-    bool getWakeCycleEnabled();
-    void setWakeCycleEnabled(bool enabled);
-    bool getTempSensorEnabled();
-    void setTempSensorEnabled(bool enabled);
-    uint8_t getClockSource();
-    void setClockSource(uint8_t source);
-
-    // PWR_MGMT_2 register
-    uint8_t getWakeFrequency();
-    void setWakeFrequency(uint8_t frequency);
-    bool getStandbyXAccelEnabled();
-    void setStandbyXAccelEnabled(bool enabled);
-    bool getStandbyYAccelEnabled();
-    void setStandbyYAccelEnabled(bool enabled);
-    bool getStandbyZAccelEnabled();
-    void setStandbyZAccelEnabled(bool enabled);
-    bool getStandbyXGyroEnabled();
-    void setStandbyXGyroEnabled(bool enabled);
-    bool getStandbyYGyroEnabled();
-    void setStandbyYGyroEnabled(bool enabled);
-    bool getStandbyZGyroEnabled();
-    void setStandbyZGyroEnabled(bool enabled);
-
-    // FIFO_COUNT_* registers
-    uint16_t getFIFOCount();
-
-    // FIFO_R_W register
-    uint8_t getFIFOByte();
-    void setFIFOByte(uint8_t data);
-    void getFIFOBytes(uint8_t* data, uint8_t length);
-
-    // WHO_AM_I register
-    uint8_t getDeviceID();
-    void setDeviceID(uint8_t id);
-
-    // ======== UNDOCUMENTED/DMP REGISTERS/METHODS ========
-
-    // XG_OFFS_TC register
-    uint8_t getOTPBankValid();
-    void setOTPBankValid(bool enabled);
-    int8_t getXGyroOffset();
-    void setXGyroOffset(int8_t offset);
-
-    // YG_OFFS_TC register
-    int8_t getYGyroOffset();
-    void setYGyroOffset(int8_t offset);
-
-    // ZG_OFFS_TC register
-    int8_t getZGyroOffset();
-    void setZGyroOffset(int8_t offset);
-
-    // X_FINE_GAIN register
-    int8_t getXFineGain();
-    void setXFineGain(int8_t gain);
-
-    // Y_FINE_GAIN register
-    int8_t getYFineGain();
-    void setYFineGain(int8_t gain);
-
-    // Z_FINE_GAIN register
-    int8_t getZFineGain();
-    void setZFineGain(int8_t gain);
-
-    // XA_OFFS_* registers
-    int16_t getXAccelOffset();
-    void setXAccelOffset(int16_t offset);
-
-    // YA_OFFS_* register
-    int16_t getYAccelOffset();
-    void setYAccelOffset(int16_t offset);
-
-    // ZA_OFFS_* register
-    int16_t getZAccelOffset();
-    void setZAccelOffset(int16_t offset);
-
-    // XG_OFFS_USR* registers
-    int16_t getXGyroOffsetUser();
-    void setXGyroOffsetUser(int16_t offset);
-
-    // YG_OFFS_USR* register
-    int16_t getYGyroOffsetUser();
-    void setYGyroOffsetUser(int16_t offset);
-
-    // ZG_OFFS_USR* register
-    int16_t getZGyroOffsetUser();
-    void setZGyroOffsetUser(int16_t offset);
-
-    // INT_ENABLE register (DMP functions)
-    bool getIntPLLReadyEnabled();
-    void setIntPLLReadyEnabled(bool enabled);
-    bool getIntDMPEnabled();
-    void setIntDMPEnabled(bool enabled);
-
-    // DMP_INT_STATUS
-    bool getDMPInt5Status();
-    bool getDMPInt4Status();
-    bool getDMPInt3Status();
-    bool getDMPInt2Status();
-    bool getDMPInt1Status();
-    bool getDMPInt0Status();
-
-    // INT_STATUS register (DMP functions)
-    bool getIntPLLReadyStatus();
-    bool getIntDMPStatus();
-
-    // USER_CTRL register (DMP functions)
-    bool getDMPEnabled();
-    void setDMPEnabled(bool enabled);
-    void resetDMP();
-
-    // BANK_SEL register
-    void setMemoryBank(uint8_t bank, bool prefetchEnabled = false, bool userBank = false);
-
-    // MEM_START_ADDR register
-    void setMemoryStartAddress(uint8_t address);
-
-    // MEM_R_W register
-    uint8_t readMemoryByte();
-    void writeMemoryByte(uint8_t data);
-    void readMemoryBlock(uint8_t* data, uint16_t dataSize, uint8_t bank = 0, uint8_t address = 0);
-    bool writeMemoryBlock(const uint8_t* data, uint16_t dataSize, uint8_t bank = 0, uint8_t address = 0, bool verify = true,
-                          bool useProgMem = false);
-    bool writeProgMemoryBlock(const uint8_t* data, uint16_t dataSize, uint8_t bank = 0, uint8_t address = 0,
-                              bool verify = true);
-
-    bool writeDMPConfigurationSet(const uint8_t* data, uint16_t dataSize, bool useProgMem = false);
-    bool writeProgDMPConfigurationSet(const uint8_t* data, uint16_t dataSize);
-
-    // DMP_CFG_1 register
-    uint8_t getDMPConfig1();
-    void setDMPConfig1(uint8_t config);
-
-    // DMP_CFG_2 register
-    uint8_t getDMPConfig2();
-    void setDMPConfig2(uint8_t config);
-
-    // special methods for MotionApps 2.0 implementation
-    #ifdef MPU6050_INCLUDE_DMP_MOTIONAPPS20
-    uint8_t* dmpPacketBuffer;
-    uint16_t dmpPacketSize;
-
-    uint8_t dmpInitialize();
-    bool dmpPacketAvailable();
-
-    uint8_t dmpSetFIFORate(uint8_t fifoRate);
-    uint8_t dmpGetFIFORate();
-    uint8_t dmpGetSampleStepSizeMS();
-    uint8_t dmpGetSampleFrequency();
-    int32_t dmpDecodeTemperature(int8_t tempReg);
-
-    // Register callbacks after a packet of FIFO data is processed
-    //uint8_t dmpRegisterFIFORateProcess(inv_obj_func func, int16_t priority);
-    //uint8_t dmpUnregisterFIFORateProcess(inv_obj_func func);
-    uint8_t dmpRunFIFORateProcesses();
-
-    // Setup FIFO for various output
-    uint8_t dmpSendQuaternion(uint_fast16_t accuracy);
-    uint8_t dmpSendGyro(uint_fast16_t elements, uint_fast16_t accuracy);
-    uint8_t dmpSendAccel(uint_fast16_t elements, uint_fast16_t accuracy);
-    uint8_t dmpSendLinearAccel(uint_fast16_t elements, uint_fast16_t accuracy);
-    uint8_t dmpSendLinearAccelInWorld(uint_fast16_t elements, uint_fast16_t accuracy);
-    uint8_t dmpSendControlData(uint_fast16_t elements, uint_fast16_t accuracy);
-    uint8_t dmpSendSensorData(uint_fast16_t elements, uint_fast16_t accuracy);
-    uint8_t dmpSendExternalSensorData(uint_fast16_t elements, uint_fast16_t accuracy);
-    uint8_t dmpSendGravity(uint_fast16_t elements, uint_fast16_t accuracy);
-    uint8_t dmpSendPacketNumber(uint_fast16_t accuracy);
-    uint8_t dmpSendQuantizedAccel(uint_fast16_t elements, uint_fast16_t accuracy);
-    uint8_t dmpSendEIS(uint_fast16_t elements, uint_fast16_t accuracy);
-
-    // Get Fixed Point data from FIFO
-    uint8_t dmpGetAccel(int32_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGetAccel(int16_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGetAccel(VectorInt16* v, const uint8_t* packet = 0);
-    uint8_t dmpGetQuaternion(int32_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGetQuaternion(int16_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGetQuaternion(Quaternion* q, const uint8_t* packet = 0);
-    uint8_t dmpGet6AxisQuaternion(int32_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGet6AxisQuaternion(int16_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGet6AxisQuaternion(Quaternion* q, const uint8_t* packet = 0);
-    uint8_t dmpGetRelativeQuaternion(int32_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGetRelativeQuaternion(int16_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGetRelativeQuaternion(Quaternion* data, const uint8_t* packet = 0);
-    uint8_t dmpGetGyro(int32_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGetGyro(int16_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGetGyro(VectorInt16* v, const uint8_t* packet = 0);
-    uint8_t dmpSetLinearAccelFilterCoefficient(float coef);
-    uint8_t dmpGetLinearAccel(int32_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGetLinearAccel(int16_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGetLinearAccel(VectorInt16* v, const uint8_t* packet = 0);
-    uint8_t dmpGetLinearAccel(VectorInt16* v, VectorInt16* vRaw, VectorFloat* gravity);
-    uint8_t dmpGetLinearAccelInWorld(int32_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGetLinearAccelInWorld(int16_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGetLinearAccelInWorld(VectorInt16* v, const uint8_t* packet = 0);
-    uint8_t dmpGetLinearAccelInWorld(VectorInt16* v, VectorInt16* vReal, Quaternion* q);
-    uint8_t dmpGetGyroAndAccelSensor(int32_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGetGyroAndAccelSensor(int16_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGetGyroAndAccelSensor(VectorInt16* g, VectorInt16* a, const uint8_t* packet = 0);
-    uint8_t dmpGetGyroSensor(int32_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGetGyroSensor(int16_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGetGyroSensor(VectorInt16* v, const uint8_t* packet = 0);
-    uint8_t dmpGetControlData(int32_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGetTemperature(int32_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGetGravity(int32_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGetGravity(int16_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGetGravity(VectorInt16* v, const uint8_t* packet = 0);
-    uint8_t dmpGetGravity(VectorFloat* v, Quaternion* q);
-    uint8_t dmpGetUnquantizedAccel(int32_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGetUnquantizedAccel(int16_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGetUnquantizedAccel(VectorInt16* v, const uint8_t* packet = 0);
-    uint8_t dmpGetQuantizedAccel(int32_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGetQuantizedAccel(int16_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGetQuantizedAccel(VectorInt16* v, const uint8_t* packet = 0);
-    uint8_t dmpGetExternalSensorData(int32_t* data, uint16_t size, const uint8_t* packet = 0);
-    uint8_t dmpGetEIS(int32_t* data, const uint8_t* packet = 0);
-
-    uint8_t dmpGetEuler(float* data, Quaternion* q);
-    uint8_t dmpGetYawPitchRoll(float* data, Quaternion* q, VectorFloat* gravity);
-
-    // Get Floating Point data from FIFO
-    uint8_t dmpGetAccelFloat(float* data, const uint8_t* packet = 0);
-    uint8_t dmpGetQuaternionFloat(float* data, const uint8_t* packet = 0);
-
-    uint8_t dmpProcessFIFOPacket(const unsigned char* dmpData);
-    uint8_t dmpReadAndProcessFIFOPacket(uint8_t numPackets, uint8_t* processed = NULL);
-
-    uint8_t dmpSetFIFOProcessedCallback(void (*func)(void));
-
-    uint8_t dmpInitFIFOParam();
-    uint8_t dmpCloseFIFO();
-    uint8_t dmpSetGyroDataSource(uint8_t source);
-    uint8_t dmpDecodeQuantizedAccel();
-    uint32_t dmpGetGyroSumOfSquare();
-    uint32_t dmpGetAccelSumOfSquare();
-    void dmpOverrideQuaternion(long* q);
-    uint16_t dmpGetFIFOPacketSize();
-    #endif
-
-    // special methods for MotionApps 4.1 implementation
-    #ifdef MPU6050_INCLUDE_DMP_MOTIONAPPS41
-    uint8_t* dmpPacketBuffer;
-    uint16_t dmpPacketSize;
-
-    uint8_t dmpInitialize();
-    bool dmpPacketAvailable();
-
-    uint8_t dmpSetFIFORate(uint8_t fifoRate);
-    uint8_t dmpGetFIFORate();
-    uint8_t dmpGetSampleStepSizeMS();
-    uint8_t dmpGetSampleFrequency();
-    int32_t dmpDecodeTemperature(int8_t tempReg);
-
-    // Register callbacks after a packet of FIFO data is processed
-    //uint8_t dmpRegisterFIFORateProcess(inv_obj_func func, int16_t priority);
-    //uint8_t dmpUnregisterFIFORateProcess(inv_obj_func func);
-    uint8_t dmpRunFIFORateProcesses();
-
-    // Setup FIFO for various output
-    uint8_t dmpSendQuaternion(uint_fast16_t accuracy);
-    uint8_t dmpSendGyro(uint_fast16_t elements, uint_fast16_t accuracy);
-    uint8_t dmpSendAccel(uint_fast16_t elements, uint_fast16_t accuracy);
-    uint8_t dmpSendLinearAccel(uint_fast16_t elements, uint_fast16_t accuracy);
-    uint8_t dmpSendLinearAccelInWorld(uint_fast16_t elements, uint_fast16_t accuracy);
-    uint8_t dmpSendControlData(uint_fast16_t elements, uint_fast16_t accuracy);
-    uint8_t dmpSendSensorData(uint_fast16_t elements, uint_fast16_t accuracy);
-    uint8_t dmpSendExternalSensorData(uint_fast16_t elements, uint_fast16_t accuracy);
-    uint8_t dmpSendGravity(uint_fast16_t elements, uint_fast16_t accuracy);
-    uint8_t dmpSendPacketNumber(uint_fast16_t accuracy);
-    uint8_t dmpSendQuantizedAccel(uint_fast16_t elements, uint_fast16_t accuracy);
-    uint8_t dmpSendEIS(uint_fast16_t elements, uint_fast16_t accuracy);
-
-    // Get Fixed Point data from FIFO
-    uint8_t dmpGetAccel(int32_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGetAccel(int16_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGetAccel(VectorInt16* v, const uint8_t* packet = 0);
-    uint8_t dmpGetQuaternion(int32_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGetQuaternion(int16_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGetQuaternion(Quaternion* q, const uint8_t* packet = 0);
-    uint8_t dmpGet6AxisQuaternion(int32_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGet6AxisQuaternion(int16_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGet6AxisQuaternion(Quaternion* q, const uint8_t* packet = 0);
-    uint8_t dmpGetRelativeQuaternion(int32_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGetRelativeQuaternion(int16_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGetRelativeQuaternion(Quaternion* data, const uint8_t* packet = 0);
-    uint8_t dmpGetGyro(int32_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGetGyro(int16_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGetGyro(VectorInt16* v, const uint8_t* packet = 0);
-    uint8_t dmpGetMag(int16_t* data, const uint8_t* packet = 0);
-    uint8_t dmpSetLinearAccelFilterCoefficient(float coef);
-    uint8_t dmpGetLinearAccel(int32_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGetLinearAccel(int16_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGetLinearAccel(VectorInt16* v, const uint8_t* packet = 0);
-    uint8_t dmpGetLinearAccel(VectorInt16* v, VectorInt16* vRaw, VectorFloat* gravity);
-    uint8_t dmpGetLinearAccelInWorld(int32_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGetLinearAccelInWorld(int16_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGetLinearAccelInWorld(VectorInt16* v, const uint8_t* packet = 0);
-    uint8_t dmpGetLinearAccelInWorld(VectorInt16* v, VectorInt16* vReal, Quaternion* q);
-    uint8_t dmpGetGyroAndAccelSensor(int32_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGetGyroAndAccelSensor(int16_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGetGyroAndAccelSensor(VectorInt16* g, VectorInt16* a, const uint8_t* packet = 0);
-    uint8_t dmpGetGyroSensor(int32_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGetGyroSensor(int16_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGetGyroSensor(VectorInt16* v, const uint8_t* packet = 0);
-    uint8_t dmpGetControlData(int32_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGetTemperature(int32_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGetGravity(int32_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGetGravity(int16_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGetGravity(VectorInt16* v, const uint8_t* packet = 0);
-    uint8_t dmpGetGravity(VectorFloat* v, Quaternion* q);
-    uint8_t dmpGetUnquantizedAccel(int32_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGetUnquantizedAccel(int16_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGetUnquantizedAccel(VectorInt16* v, const uint8_t* packet = 0);
-    uint8_t dmpGetQuantizedAccel(int32_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGetQuantizedAccel(int16_t* data, const uint8_t* packet = 0);
-    uint8_t dmpGetQuantizedAccel(VectorInt16* v, const uint8_t* packet = 0);
-    uint8_t dmpGetExternalSensorData(int32_t* data, uint16_t size, const uint8_t* packet = 0);
-    uint8_t dmpGetEIS(int32_t* data, const uint8_t* packet = 0);
-
-    uint8_t dmpGetEuler(float* data, Quaternion* q);
-    uint8_t dmpGetYawPitchRoll(float* data, Quaternion* q, VectorFloat* gravity);
-
-    // Get Floating Point data from FIFO
-    uint8_t dmpGetAccelFloat(float* data, const uint8_t* packet = 0);
-    uint8_t dmpGetQuaternionFloat(float* data, const uint8_t* packet = 0);
-
-    uint8_t dmpProcessFIFOPacket(const unsigned char* dmpData);
-    uint8_t dmpReadAndProcessFIFOPacket(uint8_t numPackets, uint8_t* processed = NULL);
-
-    uint8_t dmpSetFIFOProcessedCallback(void (*func)(void));
-
-    uint8_t dmpInitFIFOParam();
-    uint8_t dmpCloseFIFO();
-    uint8_t dmpSetGyroDataSource(uint8_t source);
-    uint8_t dmpDecodeQuantizedAccel();
-    uint32_t dmpGetGyroSumOfSquare();
-    uint32_t dmpGetAccelSumOfSquare();
-    void dmpOverrideQuaternion(long* q);
-    uint16_t dmpGetFIFOPacketSize();
-    #endif
-
-  private:
-    uint8_t devAddr;
-    uint8_t buffer[14];
-};
-
-#endif /* _MPU6050_H_ */
diff --git a/labyrinthe/4-arduino_pyserial/etape1/4-labyrinthe.blend b/labyrinthe/4-arduino_pyserial/etape1/4-labyrinthe.blend
deleted file mode 100644
index 7c5f4651622c1498f8479f4b4186b6e5a917e84c..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1152424
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	P!%JO*N2(BDG(b^oMiIv{LqG~)ssfD2dv
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�p9`LRQVo4=)4U;OTZ{4J;ZBLt3tdM
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

1qtzF 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 diff --git a/labyrinthe/4-arduino_pyserial/etape1/4-labyrinthe.py b/labyrinthe/4-arduino_pyserial/etape1/4-labyrinthe.py deleted file mode 100644 index b833ba4..0000000 --- a/labyrinthe/4-arduino_pyserial/etape1/4-labyrinthe.py +++ /dev/null @@ -1,151 +0,0 @@ -import bge # Bibliothèque Blender Game Engine (BGE) -import serial # Liaison série - -############################################################################### -# 4-labyrinthe.py -# @title: Module (unique) de la scène 3D du labyrinthe à bille pilotable avec une centrale inertielle (capteur IMU) -# @project: Blender-EduTech - Tutoriel 4 : Labyrinthe à bille - Interfacer avec une carte Arduino par la liaision série -# @lang: fr -# @authors: Philippe Roy -# @copyright: Copyright (C) 2023 Philippe Roy -# @license: GNU GPL -# -# Commandes déclenchées par UPBGE pour le scène du labyrinthe -# -############################################################################### - -# Récupérer la scène 3D -scene = bge.logic.getCurrentScene() -# print("Objets de la scene : ", scene.objects) # Lister les objets de la scène - -# Constantes -JUST_ACTIVATED = bge.logic.KX_INPUT_JUST_ACTIVATED -JUST_RELEASED = bge.logic.KX_INPUT_JUST_RELEASED -ACTIVATE = bge.logic.KX_INPUT_ACTIVE - -# Communication avec la carte Arduino -# serial_baud=115200 -# # serial_comm = serial.Serial('COM4',serial_baud, timeout=0.016) # Windows -# serial_comm = serial.Serial('/dev/ttyACM0',serial_baud, timeout=0.016) # GNU/Linux -# print (serial_comm) - -# Détection de la carte avec la liaison série -serial_comm = labyrinthe_carte.init_serial() -if serial_comm is None: - bge.logic.endGame() -print("Communication Carte Arduino établie") - -############################################################################### -# Gestion de la centrale inertielle (capteur IMU (inertial measurement unit)) -############################################################################### - -# Lecture du capteur IMU -def capteur(cont): - obj = cont.owner # obj est l'objet associé au contrôleur donc 'Plateau' - obj_bille = scene.objects['Bille'] - echelle = 0.2 # Facteur d'échelle entre la capteur et la 3D - ecart=0.001 # Écart maxi sur la rotation - - # Touche ESC -> Quitter - keyboard = bge.logic.keyboard - if keyboard.inputs[bge.events.ESCKEY].status[0] == ACTIVATE: - serial_comm.close() - bge.logic.endGame() - - # Lecture de la liaison série : programme Arduino : 4-labyrinthe-imu.ino - serial_msg_in = str(serial_comm.readline()) - - # Roulis/Roll(x) et Tangage/Pitch(y) - if serial_msg_in.find(",")>0: - txt = serial_msg_in.split(',',2) - x_txt = txt[0][2:] - y_txt = txt[1][:-5] - if x_txt != " NAN" and y_txt != " NAN": # NAN : Not A Number - x=-(float(x_txt)/57.3) * echelle # 1/ 360 / (2 * pi) - y=-(float(y_txt)/57.3) * echelle # 1/ 360 / (2 * pi) - while abs(x-obj.worldOrientation.to_euler().x) > ecart : - obj.applyRotation((x-obj.worldOrientation.to_euler().x, 0, -obj.worldOrientation.to_euler().z), False) - while abs(y-obj.worldOrientation.to_euler().y) > ecart : - obj.applyRotation((0, y-obj.worldOrientation.to_euler().y, -obj.worldOrientation.to_euler().z), False) - -############################################################################### -# Gameplay -############################################################################### - -# Initialisation de la scène -def init(cont): - obj = cont.owner # obj est l'objet associé au contrôleur donc 'Bille' - - # Mémorisation de la position de départ de la bille - obj['init_x']=obj.worldPosition.x - obj['init_y']=obj.worldPosition.y - obj['init_z']=obj.worldPosition.z - - # Cacher le panneau de la victoire et suspendre la physique du panneau cliquable - scene.objects['Panneau victoire'].setVisible(False,True) - scene.objects['Panneau victoire - plan'].suspendPhysics (True) - scene.objects['Bouton fermer'].color = (0, 0, 0, 1) # Noir - -# Cycle (boucle de contrôle de la bille) -def cycle(cont): - obj = cont.owner # obj est l'objet associé au contrôleur donc 'Bille' - obj['z']=obj.worldPosition.z # la propriété z est mis à jour avec la position globale en z de la bille - - # Si l'altitude de bille < -10 et pas de victoire -> chute - if obj['z'] < -10 and obj['victoire'] == False: - print ("Chuuuu.....te") - depart() - -# Départ de la bille -def depart(): - obj_bille = scene.objects['Bille'] - obj_plateau = scene.objects['Plateau'] - - # Replacement du plateau (tous les angles à 0 en plusieurs fois) - while obj_plateau.worldOrientation.to_euler().x != 0 and obj_plateau.worldOrientation.to_euler().y !=0 and obj_plateau.worldOrientation.to_euler().z !=0 : - obj_plateau.applyRotation((-obj_plateau.worldOrientation.to_euler().x, -obj_plateau.worldOrientation.to_euler().y, -obj_plateau.worldOrientation.to_euler().z), False) - - # Mettre la bille à la position de départ avec une vitesse nulle - obj_bille = scene.objects['Bille'] - obj_bille.worldLinearVelocity=(0, 0, 0) - obj_bille.worldAngularVelocity=(0, 0, 0) - obj_bille.worldPosition.x = obj_bille['init_x'] - obj_bille.worldPosition.y = obj_bille['init_y'] - obj_bille.worldPosition.z = obj_bille['init_z']+0.5 # On repose la bille - obj_bille['victoire']=False - obj_bille['chute'] = False - -# Victoire (colision de la bille avec l'arrivée) -def victoire(cont): - scene.objects['Bille']['victoire']=True - scene.objects['Panneau victoire'].setVisible(True,True) # Afficher le panneau de la victoire - scene.objects['Panneau victoire - plan'].restorePhysics() # Restaurer la physique du panneau cliquable - start = 1 - end = 100 - layer = 0 - priority = 1 - blendin = 1.0 - mode = bge.logic.KX_ACTION_MODE_PLAY - layerWeight = 0.0 - ipoFlags = 0 - speed = 1 - scene.objects['Panneau victoire'].playAction('Panneau victoireAction', start, end, layer, priority, blendin, mode, layerWeight, ipoFlags, speed) - -# Highlight du bouton Fermer -def victoire_fermer_hl(cont): - obj = cont.owner - - # Activation - if cont.sensors['MO'].status == JUST_ACTIVATED: - obj.color = (1, 1, 1, 1) # Blanc - - # Désactivation - if cont.sensors['MO'].status == JUST_RELEASED: - obj.color = (0, 0, 0, 1) # Noir - -# Fermer le panneau de la victoire (clic) -def victoire_fermer(cont): - if cont.sensors['Click'].status == JUST_ACTIVATED and cont.sensors['MO'].positive: - scene.objects['Panneau victoire'].setVisible(False,True) # Cacher le panneau de la victoire - scene.objects['Panneau victoire - plan'].suspendPhysics (True) # Suspendre la physique du panneau cliquable - depart()