test
Dependents: Nucleo_printf Nucleo-transfer
Fork of MPU6050 by
Revision 5:dc92d3573d50, committed 2017-11-30
- Comitter:
- Ishy
- Date:
- Thu Nov 30 08:59:55 2017 +0000
- Parent:
- 4:ebe4230c882d
- Commit message:
- test
Changed in this revision
diff -r ebe4230c882d -r dc92d3573d50 MPU6050.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MPU6050.cpp Thu Nov 30 08:59:55 2017 +0000 @@ -0,0 +1,237 @@ +/** + * Includes + */ +#include "MPU6050.h" + +MPU6050::MPU6050(PinName sda, PinName scl) : connection(sda, scl) { + this->setSleepMode(false); + + //Initializations: + currentGyroRange = 0; + currentAcceleroRange=0; +} + +//-------------------------------------------------- +//-------------------General------------------------ +//-------------------------------------------------- + +void MPU6050::write(char address, char data) { + char temp[2]; + temp[0]=address; + temp[1]=data; + + connection.write(MPU6050_ADDRESS * 2,temp,2); +} + +char MPU6050::read(char address) { + char retval; + connection.write(MPU6050_ADDRESS * 2, &address, 1, true); + connection.read(MPU6050_ADDRESS * 2, &retval, 1); + return retval; +} + +void MPU6050::read(char address, char *data, int length) { + connection.write(MPU6050_ADDRESS * 2, &address, 1, true); + connection.read(MPU6050_ADDRESS * 2, data, length); +} + +void MPU6050::setSleepMode(bool state) { + char temp; + temp = this->read(MPU6050_PWR_MGMT_1_REG); + if (state == true) + temp |= 1<<MPU6050_SLP_BIT; + if (state == false) + temp &= ~(1<<MPU6050_SLP_BIT); + this->write(MPU6050_PWR_MGMT_1_REG, temp); +} + +bool MPU6050::testConnection( void ) { + char temp; + temp = this->read(MPU6050_WHO_AM_I_REG); + return (temp == (MPU6050_ADDRESS & 0xFE)); +} + +void MPU6050::setBW(char BW) { + char temp; + BW=BW & 0x07; + temp = this->read(MPU6050_CONFIG_REG); + temp &= 0xF8; + temp = temp + BW; + this->write(MPU6050_CONFIG_REG, temp); +} + +void MPU6050::setI2CBypass(bool state) { + char temp; + temp = this->read(MPU6050_INT_PIN_CFG); + if (state == true) + temp |= 1<<MPU6050_BYPASS_BIT; + if (state == false) + temp &= ~(1<<MPU6050_BYPASS_BIT); + this->write(MPU6050_INT_PIN_CFG, temp); +} + +//-------------------------------------------------- +//----------------Accelerometer--------------------- +//-------------------------------------------------- + +void MPU6050::setAcceleroRange( char range ) { + char temp; + range = range & 0x03; + currentAcceleroRange = range; + + temp = this->read(MPU6050_ACCELERO_CONFIG_REG); + temp &= ~(3<<3); + temp = temp + (range<<3); + this->write(MPU6050_ACCELERO_CONFIG_REG, temp); +} + +int MPU6050::getAcceleroRawX( void ) { + short retval; + char data[2]; + this->read(MPU6050_ACCEL_XOUT_H_REG, data, 2); + retval = (data[0]<<8) + data[1]; + return (int)retval; +} + +int MPU6050::getAcceleroRawY( void ) { + short retval; + char data[2]; + this->read(MPU6050_ACCEL_YOUT_H_REG, data, 2); + retval = (data[0]<<8) + data[1]; + return (int)retval; +} + +int MPU6050::getAcceleroRawZ( void ) { + short retval; + char data[2]; + this->read(MPU6050_ACCEL_ZOUT_H_REG, data, 2); + retval = (data[0]<<8) + data[1]; + return (int)retval; +} + +void MPU6050::getAcceleroRaw( int *data ) { + char temp[6]; + this->read(MPU6050_ACCEL_XOUT_H_REG, temp, 6); + data[0] = (int)(short)((temp[0]<<8) + temp[1]); + data[1] = (int)(short)((temp[2]<<8) + temp[3]); + data[2] = (int)(short)((temp[4]<<8) + temp[5]); +} + +void MPU6050::getAccelero( float *data ) { + int temp[3]; + this->getAcceleroRaw(temp); + if (currentAcceleroRange == MPU6050_ACCELERO_RANGE_2G) { + data[0]=(float)temp[0] / 16384.0 * 9.81; + data[1]=(float)temp[1] / 16384.0 * 9.81; + data[2]=(float)temp[2] / 16384.0 * 9.81; + } + if (currentAcceleroRange == MPU6050_ACCELERO_RANGE_4G){ + data[0]=(float)temp[0] / 8192.0 * 9.81; + data[1]=(float)temp[1] / 8192.0 * 9.81; + data[2]=(float)temp[2] / 8192.0 * 9.81; + } + if (currentAcceleroRange == MPU6050_ACCELERO_RANGE_8G){ + data[0]=(float)temp[0] / 4096.0 * 9.81; + data[1]=(float)temp[1] / 4096.0 * 9.81; + data[2]=(float)temp[2] / 4096.0 * 9.81; + } + if (currentAcceleroRange == MPU6050_ACCELERO_RANGE_16G){ + data[0]=(float)temp[0] / 2048.0 * 9.81; + data[1]=(float)temp[1] / 2048.0 * 9.81; + data[2]=(float)temp[2] / 2048.0 * 9.81; + } + + #ifdef DOUBLE_ACCELERO + data[0]*=2; + data[1]*=2; + data[2]*=2; + #endif +} + +//-------------------------------------------------- +//------------------Gyroscope----------------------- +//-------------------------------------------------- +void MPU6050::setGyroRange( char range ) { + char temp; + currentGyroRange = range; + range = range & 0x03; + temp = this->read(MPU6050_GYRO_CONFIG_REG); + temp &= ~(3<<3); + temp = temp + range<<3; + this->write(MPU6050_GYRO_CONFIG_REG, temp); +} + +int MPU6050::getGyroRawX( void ) { + short retval; + char data[2]; + this->read(MPU6050_GYRO_XOUT_H_REG, data, 2); + retval = (data[0]<<8) + data[1]; + return (int)retval; +} + +int MPU6050::getGyroRawY( void ) { + short retval; + char data[2]; + this->read(MPU6050_GYRO_YOUT_H_REG, data, 2); + retval = (data[0]<<8) + data[1]; + return (int)retval; +} + +int MPU6050::getGyroRawZ( void ) { + short retval; + char data[2]; + this->read(MPU6050_GYRO_ZOUT_H_REG, data, 2); + retval = (data[0]<<8) + data[1]; + return (int)retval; +} + +void MPU6050::getGyroRaw( int *data ) { + char temp[6]; + this->read(MPU6050_GYRO_XOUT_H_REG, temp, 6); + data[0] = (int)(short)((temp[0]<<8) + temp[1]); + data[1] = (int)(short)((temp[2]<<8) + temp[3]); + data[2] = (int)(short)((temp[4]<<8) + temp[5]); +} + +void MPU6050::getGyro( float *data ) { + int temp[3]; + this->getGyroRaw(temp); + if (currentGyroRange == MPU6050_GYRO_RANGE_250) { + data[0]=(float)temp[0] / 7505.7; + data[1]=(float)temp[1] / 7505.7; + data[2]=(float)temp[2] / 7505.7; + } + if (currentGyroRange == MPU6050_GYRO_RANGE_500){ + data[0]=(float)temp[0] / 3752.9; + data[1]=(float)temp[1] / 3752.9; + data[2]=(float)temp[2] / 3752.9; + } + if (currentGyroRange == MPU6050_GYRO_RANGE_1000){ + data[0]=(float)temp[0] / 1879.3;; + data[1]=(float)temp[1] / 1879.3; + data[2]=(float)temp[2] / 1879.3; + } + if (currentGyroRange == MPU6050_GYRO_RANGE_2000){ + data[0]=(float)temp[0] / 939.7; + data[1]=(float)temp[1] / 939.7; + data[2]=(float)temp[2] / 939.7; + } +} +//-------------------------------------------------- +//-------------------Temperature-------------------- +//-------------------------------------------------- +int MPU6050::getTempRaw( void ) { + short retval; + char data[2]; + this->read(MPU6050_TEMP_H_REG, data, 2); + retval = (data[0]<<8) + data[1]; + return (int)retval; +} + +float MPU6050::getTemp( void ) { + float retval; + retval=(float)this->getTempRaw(); + retval=(retval+521.0)/340.0+35.0; + return retval; +} +
diff -r ebe4230c882d -r dc92d3573d50 MPU6050.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MPU6050.h Thu Nov 30 08:59:55 2017 +0000 @@ -0,0 +1,274 @@ +/*Use #define MPU6050_ES before you include this file if you have an engineering sample (older EVBs will have them), to find out if you have one, check your accelerometer output. +If it is half of what you expected, and you still are on the correct planet, you got an engineering sample +*/ + + +#ifndef MPU6050_H +#define MPU6050_H + +/** + * Includes + */ +#include "mbed.h" + + +/** + * Defines + */ +#ifndef MPU6050_ADDRESS + #define MPU6050_ADDRESS 0x68 // address pin low (GND), default for InvenSense evaluation board +#endif + +#ifdef MPU6050_ES + #define DOUBLE_ACCELERO +#endif + +/** + * Registers + */ + #define MPU6050_CONFIG_REG 0x1A + #define MPU6050_GYRO_CONFIG_REG 0x1B + #define MPU6050_ACCELERO_CONFIG_REG 0x1C + + #define MPU6050_INT_PIN_CFG 0x37 + + #define MPU6050_ACCEL_XOUT_H_REG 0x3B + #define MPU6050_ACCEL_YOUT_H_REG 0x3D + #define MPU6050_ACCEL_ZOUT_H_REG 0x3F + + #define MPU6050_TEMP_H_REG 0x41 + + #define MPU6050_GYRO_XOUT_H_REG 0x43 + #define MPU6050_GYRO_YOUT_H_REG 0x45 + #define MPU6050_GYRO_ZOUT_H_REG 0x47 + + + + #define MPU6050_PWR_MGMT_1_REG 0x6B + #define MPU6050_WHO_AM_I_REG 0x75 + + + + /** + * Definitions + */ +#define MPU6050_SLP_BIT 6 +#define MPU6050_BYPASS_BIT 1 + +#define MPU6050_BW_256 0 +#define MPU6050_BW_188 1 +#define MPU6050_BW_98 2 +#define MPU6050_BW_42 3 +#define MPU6050_BW_20 4 +#define MPU6050_BW_10 5 +#define MPU6050_BW_5 6 + +#define MPU6050_ACCELERO_RANGE_2G 0 +#define MPU6050_ACCELERO_RANGE_4G 1 +#define MPU6050_ACCELERO_RANGE_8G 2 +#define MPU6050_ACCELERO_RANGE_16G 3 + +#define MPU6050_GYRO_RANGE_250 0 +#define MPU6050_GYRO_RANGE_500 1 +#define MPU6050_GYRO_RANGE_1000 2 +#define MPU6050_GYRO_RANGE_2000 3 + + +/** MPU6050 IMU library. + * + * Example: + * @code + * Later, maybe + * @endcode + */ +class MPU6050 { + public: + /** + * Constructor. + * + * Sleep mode of MPU6050 is immediatly disabled + * + * @param sda - mbed pin to use for the SDA I2C line. + * @param scl - mbed pin to use for the SCL I2C line. + */ + MPU6050(PinName sda, PinName scl); + + + /** + * Tests the I2C connection by reading the WHO_AM_I register. + * + * @return True for a working connection, false for an error + */ + bool testConnection( void ); + + /** + * Sets the bandwidth of the digital low-pass filter + * + * Macros: MPU6050_BW_256 - MPU6050_BW_188 - MPU6050_BW_98 - MPU6050_BW_42 - MPU6050_BW_20 - MPU6050_BW_10 - MPU6050_BW_5 + * Last number is the gyro's BW in Hz (accelero BW is virtually identical) + * + * @param BW - The three bits that set the bandwidth (use the predefined macros) + */ + void setBW( char BW ); + + /** + * Sets the auxiliary I2C bus in bypass mode to read the sensors behind the MPU6050 (useful for eval board, otherwise just connect them to primary I2C bus) + * + * @param state - Enables/disables the I2C bypass mode + */ + void setI2CBypass ( bool state ); + + /** + * Sets the Accelero full-scale range + * + * Macros: MPU6050_ACCELERO_RANGE_2G - MPU6050_ACCELERO_RANGE_4G - MPU6050_ACCELERO_RANGE_8G - MPU6050_ACCELERO_RANGE_16G + * + * @param range - The two bits that set the full-scale range (use the predefined macros) + */ + void setAcceleroRange(char range); + + /** + * Reads the accelero x-axis. + * + * @return 16-bit signed integer x-axis accelero data + */ + int getAcceleroRawX( void ); + + /** + * Reads the accelero y-axis. + * + * @return 16-bit signed integer y-axis accelero data + */ + int getAcceleroRawY( void ); + + /** + * Reads the accelero z-axis. + * + * @return 16-bit signed integer z-axis accelero data + */ + int getAcceleroRawZ( void ); + + /** + * Reads all accelero data. + * + * @param data - pointer to signed integer array with length three: data[0] = X, data[1] = Y, data[2] = Z + */ + void getAcceleroRaw( int *data ); + + /** + * Reads all accelero data, gives the acceleration in m/s2 + * + * Function uses the last setup value of the full scale range, if you manually set in another range, this won't work. + * + * @param data - pointer to float array with length three: data[0] = X, data[1] = Y, data[2] = Z + */ + void getAccelero( float *data ); + + /** + * Sets the Gyro full-scale range + * + * Macros: MPU6050_GYRO_RANGE_250 - MPU6050_GYRO_RANGE_500 - MPU6050_GYRO_RANGE_1000 - MPU6050_GYRO_RANGE_2000 + * + * @param range - The two bits that set the full-scale range (use the predefined macros) + */ + void setGyroRange(char range); + + /** + * Reads the gyro x-axis. + * + * @return 16-bit signed integer x-axis gyro data + */ + int getGyroRawX( void ); + + /** + * Reads the gyro y-axis. + * + * @return 16-bit signed integer y-axis gyro data + */ + int getGyroRawY( void ); + + /** + * Reads the gyro z-axis. + * + * @return 16-bit signed integer z-axis gyro data + */ + int getGyroRawZ( void ); + + /** + * Reads all gyro data. + * + * @param data - pointer to signed integer array with length three: data[0] = X, data[1] = Y, data[2] = Z + */ + void getGyroRaw( int *data ); + + /** + * Reads all gyro data, gives the gyro in rad/s + * + * Function uses the last setup value of the full scale range, if you manually set in another range, this won't work. + * + * @param data - pointer to float array with length three: data[0] = X, data[1] = Y, data[2] = Z + */ + void getGyro( float *data); + + /** + * Reads temperature data. + * + * @return 16 bit signed integer with the raw temperature register value + */ + int getTempRaw( void ); + + /** + * Returns current temperature + * + * @returns float with the current temperature + */ + float getTemp( void ); + + /** + * Sets the sleep mode of the MPU6050 + * + * @param state - true for sleeping, false for wake up + */ + void setSleepMode( bool state ); + + + /** + * Writes data to the device, could be private, but public is handy so you can transmit directly to the MPU. + * + * @param adress - register address to write to + * @param data - data to write + */ + void write( char address, char data); + + /** + * Read data from the device, could be private, but public is handy so you can transmit directly to the MPU. + * + * @param adress - register address to write to + * @return - data from the register specified by RA + */ + char read( char adress); + + /** + * Read multtiple regigsters from the device, more efficient than using multiple normal reads. + * + * @param adress - register address to write to + * @param length - number of bytes to read + * @param data - pointer where the data needs to be written to + */ + void read( char adress, char *data, int length); + + + + + private: + + I2C connection; + char currentAcceleroRange; + char currentGyroRange; + + +}; + + + +#endif
diff -r ebe4230c882d -r dc92d3573d50 MPU6050_belt.cpp --- a/MPU6050_belt.cpp Wed Oct 11 12:54:48 2017 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,237 +0,0 @@ -/** - * Includes - */ -#include "MPU6050_belt.h" - -MPU6050_belt::MPU6050_belt(PinName sda, PinName scl) : connection(sda, scl) { - this->setSleepMode(false); - - //Initializations: - currentGyroRange = 0; - currentAcceleroRange=0; -} - -//-------------------------------------------------- -//-------------------General------------------------ -//-------------------------------------------------- - -void MPU6050_belt::write(char address, char data) { - char temp[2]; - temp[0]=address; - temp[1]=data; - - connection.write(MPU6050_belt_ADDRESS * 2,temp,2); -} - -char MPU6050_belt::read(char address) { - char retval; - connection.write(MPU6050_belt_ADDRESS * 2, &address, 1, true); - connection.read(MPU6050_belt_ADDRESS * 2, &retval, 1); - return retval; -} - -void MPU6050_belt::read(char address, char *data, int length) { - connection.write(MPU6050_belt_ADDRESS * 2, &address, 1, true); - connection.read(MPU6050_belt_ADDRESS * 2, data, length); -} - -void MPU6050_belt::setSleepMode(bool state) { - char temp; - temp = this->read(MPU6050_belt_PWR_MGMT_1_REG); - if (state == true) - temp |= 1<<MPU6050_belt_SLP_BIT; - if (state == false) - temp &= ~(1<<MPU6050_belt_SLP_BIT); - this->write(MPU6050_belt_PWR_MGMT_1_REG, temp); -} - -bool MPU6050_belt::testConnection( void ) { - char temp; - temp = this->read(MPU6050_belt_WHO_AM_I_REG); - return (temp == (MPU6050_belt_ADDRESS & 0xFE)); -} - -void MPU6050_belt::setBW(char BW) { - char temp; - BW=BW & 0x07; - temp = this->read(MPU6050_belt_CONFIG_REG); - temp &= 0xF8; - temp = temp + BW; - this->write(MPU6050_belt_CONFIG_REG, temp); -} - -void MPU6050_belt::setI2CBypass(bool state) { - char temp; - temp = this->read(MPU6050_belt_INT_PIN_CFG); - if (state == true) - temp |= 1<<MPU6050_belt_BYPASS_BIT; - if (state == false) - temp &= ~(1<<MPU6050_belt_BYPASS_BIT); - this->write(MPU6050_belt_INT_PIN_CFG, temp); -} - -//-------------------------------------------------- -//----------------Accelerometer--------------------- -//-------------------------------------------------- - -void MPU6050_belt::setAcceleroRange( char range ) { - char temp; - range = range & 0x03; - currentAcceleroRange = range; - - temp = this->read(MPU6050_belt_ACCELERO_CONFIG_REG); - temp &= ~(3<<3); - temp = temp + (range<<3); - this->write(MPU6050_belt_ACCELERO_CONFIG_REG, temp); -} - -int MPU6050_belt::getAcceleroRawX( void ) { - short retval; - char data[2]; - this->read(MPU6050_belt_ACCEL_XOUT_H_REG, data, 2); - retval = (data[0]<<8) + data[1]; - return (int)retval; -} - -int MPU6050_belt::getAcceleroRawY( void ) { - short retval; - char data[2]; - this->read(MPU6050_belt_ACCEL_YOUT_H_REG, data, 2); - retval = (data[0]<<8) + data[1]; - return (int)retval; -} - -int MPU6050_belt::getAcceleroRawZ( void ) { - short retval; - char data[2]; - this->read(MPU6050_belt_ACCEL_ZOUT_H_REG, data, 2); - retval = (data[0]<<8) + data[1]; - return (int)retval; -} - -void MPU6050_belt::getAcceleroRaw( int *data ) { - char temp[6]; - this->read(MPU6050_belt_ACCEL_XOUT_H_REG, temp, 6); - data[0] = (int)(short)((temp[0]<<8) + temp[1]); - data[1] = (int)(short)((temp[2]<<8) + temp[3]); - data[2] = (int)(short)((temp[4]<<8) + temp[5]); -} - -void MPU6050_belt::getAccelero( float *data ) { - int temp[3]; - this->getAcceleroRaw(temp); - if (currentAcceleroRange == MPU6050_belt_ACCELERO_RANGE_2G) { - data[0]=(float)temp[0] / 16384.0 * 9.81; - data[1]=(float)temp[1] / 16384.0 * 9.81; - data[2]=(float)temp[2] / 16384.0 * 9.81; - } - if (currentAcceleroRange == MPU6050_belt_ACCELERO_RANGE_4G){ - data[0]=(float)temp[0] / 8192.0 * 9.81; - data[1]=(float)temp[1] / 8192.0 * 9.81; - data[2]=(float)temp[2] / 8192.0 * 9.81; - } - if (currentAcceleroRange == MPU6050_belt_ACCELERO_RANGE_8G){ - data[0]=(float)temp[0] / 4096.0 * 9.81; - data[1]=(float)temp[1] / 4096.0 * 9.81; - data[2]=(float)temp[2] / 4096.0 * 9.81; - } - if (currentAcceleroRange == MPU6050_belt_ACCELERO_RANGE_16G){ - data[0]=(float)temp[0] / 2048.0 * 9.81; - data[1]=(float)temp[1] / 2048.0 * 9.81; - data[2]=(float)temp[2] / 2048.0 * 9.81; - } - - #ifdef DOUBLE_ACCELERO - data[0]*=2; - data[1]*=2; - data[2]*=2; - #endif -} - -//-------------------------------------------------- -//------------------Gyroscope----------------------- -//-------------------------------------------------- -void MPU6050_belt::setGyroRange( char range ) { - char temp; - currentGyroRange = range; - range = range & 0x03; - temp = this->read(MPU6050_belt_GYRO_CONFIG_REG); - temp &= ~(3<<3); - temp = temp + range<<3; - this->write(MPU6050_belt_GYRO_CONFIG_REG, temp); -} - -int MPU6050_belt::getGyroRawX( void ) { - short retval; - char data[2]; - this->read(MPU6050_belt_GYRO_XOUT_H_REG, data, 2); - retval = (data[0]<<8) + data[1]; - return (int)retval; -} - -int MPU6050_belt::getGyroRawY( void ) { - short retval; - char data[2]; - this->read(MPU6050_belt_GYRO_YOUT_H_REG, data, 2); - retval = (data[0]<<8) + data[1]; - return (int)retval; -} - -int MPU6050_belt::getGyroRawZ( void ) { - short retval; - char data[2]; - this->read(MPU6050_belt_GYRO_ZOUT_H_REG, data, 2); - retval = (data[0]<<8) + data[1]; - return (int)retval; -} - -void MPU6050_belt::getGyroRaw( int *data ) { - char temp[6]; - this->read(MPU6050_belt_GYRO_XOUT_H_REG, temp, 6); - data[0] = (int)(short)((temp[0]<<8) + temp[1]); - data[1] = (int)(short)((temp[2]<<8) + temp[3]); - data[2] = (int)(short)((temp[4]<<8) + temp[5]); -} - -void MPU6050_belt::getGyro( float *data ) { - int temp[3]; - this->getGyroRaw(temp); - if (currentGyroRange == MPU6050_belt_GYRO_RANGE_250) { - data[0]=(float)temp[0] / 7505.7; - data[1]=(float)temp[1] / 7505.7; - data[2]=(float)temp[2] / 7505.7; - } - if (currentGyroRange == MPU6050_belt_GYRO_RANGE_500){ - data[0]=(float)temp[0] / 3752.9; - data[1]=(float)temp[1] / 3752.9; - data[2]=(float)temp[2] / 3752.9; - } - if (currentGyroRange == MPU6050_belt_GYRO_RANGE_1000){ - data[0]=(float)temp[0] / 1879.3;; - data[1]=(float)temp[1] / 1879.3; - data[2]=(float)temp[2] / 1879.3; - } - if (currentGyroRange == MPU6050_belt_GYRO_RANGE_2000){ - data[0]=(float)temp[0] / 939.7; - data[1]=(float)temp[1] / 939.7; - data[2]=(float)temp[2] / 939.7; - } -} -//-------------------------------------------------- -//-------------------Temperature-------------------- -//-------------------------------------------------- -int MPU6050_belt::getTempRaw( void ) { - short retval; - char data[2]; - this->read(MPU6050_belt_TEMP_H_REG, data, 2); - retval = (data[0]<<8) + data[1]; - return (int)retval; -} - -float MPU6050_belt::getTemp( void ) { - float retval; - retval=(float)this->getTempRaw(); - retval=(retval+521.0)/340.0+35.0; - return retval; -} -
diff -r ebe4230c882d -r dc92d3573d50 MPU6050_belt.h --- a/MPU6050_belt.h Wed Oct 11 12:54:48 2017 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,274 +0,0 @@ -/*Use #define MPU6050_belt_ES before you include this file if you have an engineering sample (older EVBs will have them), to find out if you have one, check your accelerometer output. -If it is half of what you expected, and you still are on the correct planet, you got an engineering sample -*/ - - -#ifndef MPU6050_belt_H -#define MPU6050_belt_H - -/** - * Includes - */ -#include "mbed.h" - - -/** - * Defines - */ -#ifndef MPU6050_belt_ADDRESS - #define MPU6050_belt_ADDRESS 0x69 // address pin low (GND), default for InvenSense evaluation board -#endif - -#ifdef MPU6050_belt_ES - #define DOUBLE_ACCELERO -#endif - -/** - * Registers - */ - #define MPU6050_belt_CONFIG_REG 0x1A - #define MPU6050_belt_GYRO_CONFIG_REG 0x1B - #define MPU6050_belt_ACCELERO_CONFIG_REG 0x1C - - #define MPU6050_belt_INT_PIN_CFG 0x37 - - #define MPU6050_belt_ACCEL_XOUT_H_REG 0x3B - #define MPU6050_belt_ACCEL_YOUT_H_REG 0x3D - #define MPU6050_belt_ACCEL_ZOUT_H_REG 0x3F - - #define MPU6050_belt_TEMP_H_REG 0x41 - - #define MPU6050_belt_GYRO_XOUT_H_REG 0x43 - #define MPU6050_belt_GYRO_YOUT_H_REG 0x45 - #define MPU6050_belt_GYRO_ZOUT_H_REG 0x47 - - - - #define MPU6050_belt_PWR_MGMT_1_REG 0x6B - #define MPU6050_belt_WHO_AM_I_REG 0x75 - - - - /** - * Definitions - */ -#define MPU6050_belt_SLP_BIT 6 -#define MPU6050_belt_BYPASS_BIT 1 - -#define MPU6050_belt_BW_256 0 -#define MPU6050_belt_BW_188 1 -#define MPU6050_belt_BW_98 2 -#define MPU6050_belt_BW_42 3 -#define MPU6050_belt_BW_20 4 -#define MPU6050_belt_BW_10 5 -#define MPU6050_belt_BW_5 6 - -#define MPU6050_belt_ACCELERO_RANGE_2G 0 -#define MPU6050_belt_ACCELERO_RANGE_4G 1 -#define MPU6050_belt_ACCELERO_RANGE_8G 2 -#define MPU6050_belt_ACCELERO_RANGE_16G 3 - -#define MPU6050_belt_GYRO_RANGE_250 0 -#define MPU6050_belt_GYRO_RANGE_500 1 -#define MPU6050_belt_GYRO_RANGE_1000 2 -#define MPU6050_belt_GYRO_RANGE_2000 3 - - -/** MPU6050_belt IMU library. - * - * Example: - * @code - * Later, maybe - * @endcode - */ -class MPU6050_belt { - public: - /** - * Constructor. - * - * Sleep mode of MPU6050_belt is immediatly disabled - * - * @param sda - mbed pin to use for the SDA I2C line. - * @param scl - mbed pin to use for the SCL I2C line. - */ - MPU6050_belt(PinName sda, PinName scl); - - - /** - * Tests the I2C connection by reading the WHO_AM_I register. - * - * @return True for a working connection, false for an error - */ - bool testConnection( void ); - - /** - * Sets the bandwidth of the digital low-pass filter - * - * Macros: MPU6050_belt_BW_256 - MPU6050_belt_BW_188 - MPU6050_belt_BW_98 - MPU6050_belt_BW_42 - MPU6050_belt_BW_20 - MPU6050_belt_BW_10 - MPU6050_belt_BW_5 - * Last number is the gyro's BW in Hz (accelero BW is virtually identical) - * - * @param BW - The three bits that set the bandwidth (use the predefined macros) - */ - void setBW( char BW ); - - /** - * Sets the auxiliary I2C bus in bypass mode to read the sensors behind the MPU6050_belt (useful for eval board, otherwise just connect them to primary I2C bus) - * - * @param state - Enables/disables the I2C bypass mode - */ - void setI2CBypass ( bool state ); - - /** - * Sets the Accelero full-scale range - * - * Macros: MPU6050_belt_ACCELERO_RANGE_2G - MPU6050_belt_ACCELERO_RANGE_4G - MPU6050_belt_ACCELERO_RANGE_8G - MPU6050_belt_ACCELERO_RANGE_16G - * - * @param range - The two bits that set the full-scale range (use the predefined macros) - */ - void setAcceleroRange(char range); - - /** - * Reads the accelero x-axis. - * - * @return 16-bit signed integer x-axis accelero data - */ - int getAcceleroRawX( void ); - - /** - * Reads the accelero y-axis. - * - * @return 16-bit signed integer y-axis accelero data - */ - int getAcceleroRawY( void ); - - /** - * Reads the accelero z-axis. - * - * @return 16-bit signed integer z-axis accelero data - */ - int getAcceleroRawZ( void ); - - /** - * Reads all accelero data. - * - * @param data - pointer to signed integer array with length three: data[0] = X, data[1] = Y, data[2] = Z - */ - void getAcceleroRaw( int *data ); - - /** - * Reads all accelero data, gives the acceleration in m/s2 - * - * Function uses the last setup value of the full scale range, if you manually set in another range, this won't work. - * - * @param data - pointer to float array with length three: data[0] = X, data[1] = Y, data[2] = Z - */ - void getAccelero( float *data ); - - /** - * Sets the Gyro full-scale range - * - * Macros: MPU6050_belt_GYRO_RANGE_250 - MPU6050_belt_GYRO_RANGE_500 - MPU6050_belt_GYRO_RANGE_1000 - MPU6050_belt_GYRO_RANGE_2000 - * - * @param range - The two bits that set the full-scale range (use the predefined macros) - */ - void setGyroRange(char range); - - /** - * Reads the gyro x-axis. - * - * @return 16-bit signed integer x-axis gyro data - */ - int getGyroRawX( void ); - - /** - * Reads the gyro y-axis. - * - * @return 16-bit signed integer y-axis gyro data - */ - int getGyroRawY( void ); - - /** - * Reads the gyro z-axis. - * - * @return 16-bit signed integer z-axis gyro data - */ - int getGyroRawZ( void ); - - /** - * Reads all gyro data. - * - * @param data - pointer to signed integer array with length three: data[0] = X, data[1] = Y, data[2] = Z - */ - void getGyroRaw( int *data ); - - /** - * Reads all gyro data, gives the gyro in rad/s - * - * Function uses the last setup value of the full scale range, if you manually set in another range, this won't work. - * - * @param data - pointer to float array with length three: data[0] = X, data[1] = Y, data[2] = Z - */ - void getGyro( float *data); - - /** - * Reads temperature data. - * - * @return 16 bit signed integer with the raw temperature register value - */ - int getTempRaw( void ); - - /** - * Returns current temperature - * - * @returns float with the current temperature - */ - float getTemp( void ); - - /** - * Sets the sleep mode of the MPU6050_belt - * - * @param state - true for sleeping, false for wake up - */ - void setSleepMode( bool state ); - - - /** - * Writes data to the device, could be private, but public is handy so you can transmit directly to the MPU. - * - * @param adress - register address to write to - * @param data - data to write - */ - void write( char address, char data); - - /** - * Read data from the device, could be private, but public is handy so you can transmit directly to the MPU. - * - * @param adress - register address to write to - * @return - data from the register specified by RA - */ - char read( char adress); - - /** - * Read multtiple regigsters from the device, more efficient than using multiple normal reads. - * - * @param adress - register address to write to - * @param length - number of bytes to read - * @param data - pointer where the data needs to be written to - */ - void read( char adress, char *data, int length); - - - - - private: - - I2C connection; - char currentAcceleroRange; - char currentGyroRange; - - -}; - - - -#endif