Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of L3GD20 by
Revision 3:17c3c3f59c4d, committed 2017-08-07
- Comitter:
- salco
- Date:
- Mon Aug 07 01:25:38 2017 +0000
- Parent:
- 2:b45dbca259f8
- Commit message:
- Change the declaration of variable but need checkup because I am not sure everything work.ex: set the register 0x39 and the device dont have this register.
Changed in this revision
L3GD20.cpp | Show annotated file Show diff for this revision Revisions of this file |
L3GD20.h | Show annotated file Show diff for this revision Revisions of this file |
--- a/L3GD20.cpp Mon May 22 15:18:15 2017 +0000 +++ b/L3GD20.cpp Mon Aug 07 01:25:38 2017 +0000 @@ -38,45 +38,81 @@ // #define GYR_ADDRESS (0xD2 >> 1) #define GYR_ADDRESS 0xD6 - // Public Methods ////////////////////////////////////////////////////////////// // Constructor -L3GD20::L3GD20(PinName sda, PinName scl): - _L3GD20(sda, scl) +L3GD20::L3GD20(PinName sda, PinName scl) +{ + + m_ptr_I2C = new I2C(sda, scl); + + init(); + + +} + +L3GD20::L3GD20(I2C* pI2C) +{ + m_ptr_I2C = pI2C; + init(); +} + +L3GD20::~L3GD20() +{ + delete m_ptr_I2C; +} + +void L3GD20::init(void) { char reg_v; - _L3GD20.frequency(200000); + + m_ptr_I2C->frequency(200000); - reg_v = 0; - write_reg(GYR_ADDRESS,L3GD20_LOW_ODR,reg_v); + reg_v = 0; + if(write_reg(GYR_ADDRESS,L3GD20_LOW_ODR,reg_v) == false) + { + debug("Unable to write in regiter \n"); + } // 0x6F // DR = 01 (200 Hz ODR); BW = 10 (50 Hz bandwidth); PD = 1 (normal mode); Zen = Yen = Xen = 1 (all axes enabled) reg_v = 0; reg_v |= 0x6F; - write_reg(GYR_ADDRESS,L3GD20_CTRL_REG1,reg_v); - - + if(write_reg(GYR_ADDRESS,L3GD20_CTRL_REG1,reg_v) == false) + { + debug("Unable to write in regiter \n"); + } } - + + bool L3GD20::read(float *gx, float *gy, float *gz) { char gyr[6]; - - if (recv(GYR_ADDRESS, L3GD20_OUT_X_L, gyr, 6)) { - //scale is 8.75 mdps/digit - *gx = float(short(gyr[1] << 8 | gyr[0]))*0.00875; - *gy = float(short(gyr[3] << 8 | gyr[2]))*0.00875; - *gz = float(short(gyr[5] << 8 | gyr[4]))*0.00875; - - - return true; + bool result = false; + + if(m_ptr_I2C != NULL) + { + if (recv(GYR_ADDRESS, L3GD20_OUT_X_L, gyr, 6)) { + //scale is 8.75 mdps/digit + *gx = float(short(gyr[1] << 8 | gyr[0]))*0.00875; + *gy = float(short(gyr[3] << 8 | gyr[2]))*0.00875; + *gz = float(short(gyr[5] << 8 | gyr[4]))*0.00875; + + + result = true; + } + else + { + debug("Unable to receive \n"); + } } - - return false; + else + { + debug("Pointer null \n"); + } + return result; } @@ -84,8 +120,12 @@ bool L3GD20::write_reg(int addr_i2c,int addr_reg, char v) { + bool result = false; char data[2] = {addr_reg, v}; - return L3GD20::_L3GD20.write(addr_i2c, data, 2) == 0; + //__disable_irq(); + result = m_ptr_I2C->write(addr_i2c, data, 2) == 0; + //__enable_irq(); + return result; } bool L3GD20::read_reg(int addr_i2c,int addr_reg, char *v) @@ -93,18 +133,38 @@ char data = addr_reg; bool result = false; - __disable_irq(); - if ((_L3GD20.write(addr_i2c, &data, 1) == 0) && (_L3GD20.read(addr_i2c, &data, 1) == 0)){ + //__disable_irq(); + if ((m_ptr_I2C->write(addr_i2c, &data, 1) == 0) && (m_ptr_I2C->read(addr_i2c, &data, 1) == 0)){ *v = data; result = true; } - __enable_irq(); + //__enable_irq(); return result; } bool L3GD20::recv(char sad, char sub, char *buf, int length) { + bool result = false; + if (length > 1) sub |= 0x80; - - return _L3GD20.write(sad, &sub, 1, true) == 0 && _L3GD20.read(sad, buf, length) == 0; + //__disable_irq(); + result = (m_ptr_I2C->write(sad, &sub, 1, true) == 0); + if(result == false) debug("Unable to Write \n"); + result = result && (m_ptr_I2C->read(sad, buf, length) == 0); + if(result == false) debug("Unable to Read \n"); + //__enable_irq(); + return result; +} + +bool L3GD20::Convert_to_RadPerSec(float *gx, float *gy, float *gz) +{ + bool result = false; + if((gx != NULL) && (gy != NULL) && (gz != NULL) ) + { + *gx /= DPS_TO_RPS; + *gy /= DPS_TO_RPS; + *gz /= DPS_TO_RPS; + result = true; + } + return result; } \ No newline at end of file
--- a/L3GD20.h Mon May 22 15:18:15 2017 +0000 +++ b/L3GD20.h Mon Aug 07 01:25:38 2017 +0000 @@ -29,7 +29,7 @@ #define __L3GD20_H #include "mbed.h" - + // register addresses #define L3GD20_WHO_AM_I 0x0F @@ -64,6 +64,9 @@ #define L3GD20_INT1_DURATION 0x38 #define L3GD20_LOW_ODR 0x39 // D20H + +#define DPS_TO_RPS 57.2957795130824 + /** Interface library for the ST L3GD20 3-axis gyro * * Ported from Pololu L3GD20 library for Arduino by @@ -85,17 +88,24 @@ * @param scl is the pin for the I2C SCL line */ L3GD20(PinName sda, PinName scl); + L3GD20(I2C *pI2C); + + /** Destructor of the class + */ + ~L3GD20(); /** Read gyro values * @param g Array containing x, y, and z gyro values * @return g Array containing x, y, and z gyro values */ bool read(float *gx, float *gy, float *gz); + bool Convert_to_RadPerSec(float *gx, float *gy, float *gz); private: - I2C _L3GD20; + I2C* m_ptr_I2C;//_L3GD20; float gx, gy, gz; + void init(void) ; bool write_reg(int addr_i2c,int addr_reg, char v); bool read_reg(int addr_i2c,int addr_reg, char *v); bool recv(char sad, char sub, char *buf, int length);