A library of the 9-Axis Sensor BNO055 from Bosch Sensortec.
Requires the I2C-Master library - Link
Diff: bno055.cpp
- Revision:
- 7:ccb2dcdfac08
- Parent:
- 6:3dcf44b8289a
--- a/bno055.cpp Thu Jul 11 11:31:55 2019 +0000 +++ b/bno055.cpp Thu Jul 11 12:10:54 2019 +0000 @@ -215,6 +215,8 @@ /** * @brief Returns the currently used Power Mode * + * The data is also accessible through the <em>mode</em>-struct (object.mode.power). + * * @return uint8_t Currently used Power Mode */ uint8_t BNO055::getPowerMode(void) @@ -226,6 +228,31 @@ return mode.power; } +/** + * @brief Sets the desired Operation Mode + * + * All of the information aren't definitive or could be straight up wrong. It is therefore highly recommended to read the datasheet of the BNO055. + * + * <table> + * <caption>Operation Modes</caption> + * <tr><th>Type <th>Description + * <tr><td>OPERATION_MODE_CONFIGMODE <td>Used when configuring the system + * <tr><td>OPERATION_MODE_ACCONLY <td>Enables Accelerometer only + * <tr><td>OPERATION_MODE_MAGONLY <td>Enables Magnetometer only + * <tr><td>OPERATION_MODE_GYROONLY <td>Enables Gyroscope only + * <tr><td>OPERATION_MODE_ACCMAG <td>Enables Accelerometer and Magnetometer only + * <tr><td>OPERATION_MODE_ACCGYRO <td>Enables Accelerometer and Gyroscope only + * <tr><td>OPERATION_MODE_MAGGYRO <td>Enables Magnetometer and Gyroscope only + * <tr><td>OPERATION_MODE_AMG <td>Enables all three sensors + * <tr><td>OPERATION_MODE_IMU <td>Enables Accelerometer & Gyroscope and relative position + * <tr><td>OPERATION_MODE_COMPASS <td>Enables Accelerometer & Magnetometer and absolute position + * <tr><td>OPERATION_MODE_M4G <td>"Magnet for Gyroscope" is similar to <em>IMU</em>, but instead using the gyroscope, it uses the magnetometer + * <tr><td>OPERATION_MODE_NDOF_FMC_OFF <td>"9 degrees of freedom" but without fast magnetometer calibration. + * <tr><td>OPERATION_MODE_NDOF <td>"9 degrees of freedom" - Magnetometer is calibrated very fast and increased data output + * </table> + * + * @param new_opr_mode + */ void BNO055::setOperationMode(bno055_opr_mode_t new_opr_mode) { //trying to write a mode, that is already being used, doesn't make any sense and can be ignored. @@ -252,6 +279,13 @@ } } +/** + * @brief Returns the current Operation Mode + * + * The data is also accessible through the <em>mode</em>-struct (object.mode.operation). + * + * @return uint8_t The current Operation Mode + */ uint8_t BNO055::getOperationMode(void) { mode.operation = m_i2c_master.i2c_read(m_bno055_address, OPR_MODE); @@ -261,6 +295,15 @@ return mode.operation; } +/** + * @brief Set I2C-Registermap Page + * + * The BNO055 contains two Register Map pages: Page 0 and Page 1. This function is used to switch between those two. + * + * Possible Options are: PAGE_0 & PAGE_1 + * + * @param new_page Desired new page number + */ void BNO055::setPage(bno055_page_t new_page) { page = new_page; @@ -272,6 +315,13 @@ m_i2c_master.i2c_write(m_bno055_address, PAGE_ID, page); } +/** + * @brief Returns the current Registermap-Page + * + * The data is also accessible through the <em>page</em>-struct (object.page). + * + * @return uint8_t The Current Page + */ uint8_t BNO055::getPage(void) { page = m_i2c_master.i2c_read(m_bno055_address, PAGE_ID); @@ -283,6 +333,13 @@ return page; } +/** + * @brief Returns the System Status + * + * The data is also accessible through the <em>system</em>-struct (object.system.status). + * + * @return uint8_t System Status + */ uint8_t BNO055::getSystemStatus(void) { system.status = m_i2c_master.i2c_read(m_bno055_address, SYS_STATUS); @@ -292,6 +349,13 @@ return system.status; } +/** + * @brief Returns the System Error + * + * The data is also accessible through the <em>system</em>-struct (object.system.error). + * + * @return uint8_t System Error + */ uint8_t BNO055::getSystemError(void) { system.error = m_i2c_master.i2c_read(m_bno055_address, SYS_ERR); @@ -301,6 +365,13 @@ return system.error; } +/** + * @brief Configure External Oscillator Input + * + * The external oscillator increases data accuracy. + * + * @param enabled <strong>TRUE</strong> enables external oscillator input, <strong>FALSE</strong> disabled input + */ void BNO055::useExternalOscillator(bool enabled) { char data = static_cast<char>(enabled) << 7; @@ -317,6 +388,9 @@ m_i2c_master.i2c_writeBits(m_bno055_address, SYS_TRIGGER, data, MASK_EXT_CLOCK); } +/** + * @brief Resets the System via Software + */ void BNO055::resetSW(void) { #ifdef DEBUGGING_ENABLED @@ -336,6 +410,11 @@ m_i2c_master.i2c_writeBits(m_bno055_address, SYS_TRIGGER, 0x00, MASK_SYSTEM_RESET); } +/** + * @brief Resets the System via Reset-Pin + * + * Resets the System with the referenced Reset-Pin during object-construction + */ void BNO055::resetHW(void) { #ifdef DEBUGGING_ENABLED @@ -351,6 +430,13 @@ } +/** + * @brief Remaps the three Axes to respect the new Orientation + * + * use <code>REMAP_OPTION_PX</code> with X defining one of the 8 orientation options (see datasheet) + * + * @param orientation_placement Orientation of the IC + */ void BNO055::setOrientation(bno055_remap_options_t orientation_placement) { axis.map = (orientation_placement >> SHIFT_1BYTE) & 0xFF; @@ -365,6 +451,11 @@ m_i2c_master.i2c_writeBits(m_bno055_address, AXIS_MAP_SIGN, axis.sign, MASK_SIGN_AXIS); } +/** + * @brief Returns the current Orientation + * + * The data is accessible through the <em>axis</em>-struct (object.axis.map & object.axis.sign). + */ void BNO055::getOrientation(void) { m_i2c_master.i2c_readSeries(m_bno055_address, AXIS_MAP_CONFIG,register_data,LENGTH_2_BYTES); @@ -378,6 +469,17 @@ axis.sign = register_data[1]; } +/** + * @brief Assign Axis to different Axes + * + * But it's not possible to map the two axes on the same axis. It will not return anything, even if it's correct. + * + * Possible values are: <code>X_AXIS, Y_AXIS, Z_AXIS</code> + * + * @param x_axis New Axis which will be applied to the X-Axis + * @param y_axis New Axis which will be applied to the Y-Axis + * @param z_axis New Axis which will be applied to the Z-Axis + */ void BNO055::assignAxis(bno055_axis_t x_axis, bno055_axis_t y_axis, bno055_axis_t z_axis) { //check if multiple axis have the same remap-axis. If true, then this part can be skipped, as @@ -399,6 +501,15 @@ } } +/** + * @brief Inverts the Axis + * + * Possible values are: <code>POSITIVE & NEGATIVE</code> + * + * @param x_sign New Sign for the X-Axis + * @param y_sign New Sign for the Y-Axis + * @param z_sign New Sign for the Z-Axis + */ void BNO055::setAxisSign(bno055_axis_sign_t x_sign, bno055_axis_sign_t y_sign, bno055_axis_sign_t z_sign) { axis.sign = x_sign + (y_sign << 1) + (z_sign << 2); @@ -408,6 +519,12 @@ m_i2c_master.i2c_writeBits(m_bno055_address, AXIS_MAP_SIGN, axis.sign, MASK_SIGN_AXIS); } +/** + * @brief Gets the System's Calibration Status + * + * The data is accessible through the <em>calibration</em>-struct (object.calibration.status, object.calibration.system, object.calibration.gyro, object.calibration.acceleration, object.calibration.magneto) + * + */ void BNO055::getCalibrationStatus(void) { calibration.status = m_i2c_master.i2c_read(m_bno055_address, CALIB_STAT); @@ -426,6 +543,11 @@ #endif } +/** + * @brief Gets the Interrupt-flags + * + * The data is accessible through the <em>interrupt</em>-struct (object.interrupt.xxx) + */ void BNO055::getInterruptFlag(void) { setPage(PAGE_1); @@ -451,6 +573,11 @@ setPage(PAGE_0); } +/** + * @brief Returns the enabled Interrupt + * + * @return uint8_t The value containing the enabled interrupts (see datasheet) + */ uint8_t BNO055::getEnabledInterrupts(void) { setPage(PAGE_1); @@ -464,6 +591,15 @@ return data_interrupt_enable; } +/** + * @brief Configure the Interrupts + * + * @param accel_no_motion <code>ENABLE</code> to enable interrupt, <code>DISABLE</code> to disable interrupt + * @param accel_any_motion <code>ENABLE</code> to enable interrupt, <code>DISABLE</code> to disable interrupt + * @param accel_high_g <code>ENABLE</code> to enable interrupt, <code>DISABLE</code> to disable interrupt + * @param gyro_high_rate <code>ENABLE</code> to enable interrupt, <code>DISABLE</code> to disable interrupt + * @param gyro_any_motion <code>ENABLE</code> to enable interrupt, <code>DISABLE</code> to disable interrupt + */ void BNO055::setEnableInterrupts(bno055_enable_t accel_no_motion, bno055_enable_t accel_any_motion, bno055_enable_t accel_high_g, @@ -482,8 +618,17 @@ setPage(PAGE_0); } - - +/** + * @brief Sets the Interrupt Mask + * + * This function enables or disabled the changing of the Interrupt-pin. + * + * @param accel_no_motion <code>ENABLE</code> to enable interrupt-calling, <code>DISABLE</code> to disable it + * @param accel_any_motion <code>ENABLE</code> to enable interrupt-calling, <code>DISABLE</code> to disable it + * @param accel_high_g <code>ENABLE</code> to enable interrupt-calling, <code>DISABLE</code> to disable it + * @param gyro_high_rate <code>ENABLE</code> to enable interrupt-calling, <code>DISABLE</code> to disable it + * @param gyro_any_motion <code>ENABLE</code> to enable interrupt-calling, <code>DISABLE</code> to disable it + */ void BNO055::setInterruptMask(bno055_enable_t accel_no_motion, bno055_enable_t accel_any_motion, bno055_enable_t accel_high_g, @@ -502,6 +647,11 @@ setPage(PAGE_0); } +/** + * @brief Returns current Interrupt Mask + * + * @return uint8_t Current Interrupt Mask (see datasheet) + */ uint8_t BNO055::getInterruptMask(void) { setPage(PAGE_1); @@ -516,6 +666,7 @@ return data_interrupt_mask; } + void BNO055::configAccelerationInterrupt(bno055_config_int_axis_t high_axis, bno055_config_int_axis_t am_nm_axis, bno055_any_motion_sample_t am_dur @@ -550,7 +701,11 @@ } //ACCELERATION - +/** + * @brief Returns Acceleration Data + * + * Data is accessible through the <em>accel</em>-struct (object.accel.x, object.accel.y, object.accel.z), after calling this function + */ void BNO055::getAcceleration(void) { if(format.acceleration == ACCELERATION) @@ -568,7 +723,11 @@ } //MAGNETOMETER - +/** + * @brief Returns Magnetometer Data + * + * Data is accessible through the <em>magneto</em>-struct (object.magneto.x, object.magneto.y, object.magneto.z), after calling this function + */ void BNO055::getMagnetometer(void) { get(MAG_DATA_VECTOR, magneto, MICRO_TESLA_FORMAT, false); @@ -579,7 +738,11 @@ } //GYROSCOPE - +/** + * @brief Returns Gyroscope Data + * + * Data is accessible through the <em>gyro</em>-struct (object.gyro.x, object.gyro.y, object.gyro.z), after calling this function + */ void BNO055::getGyroscope(void) { if(format.gyroscope == DEGREE_PER_SEC) @@ -596,7 +759,11 @@ } //EULER-DEGREES - +/** + * @brief Returns Euler Degree Data + * + * Data is accessible through the <em>euler</em>-struct (object.euler.x, object.euler.y, object.euler.z), after calling this function + */ void BNO055::getEulerDegrees(void) { if(format.euler == DEGREES) @@ -613,7 +780,11 @@ } //QUATERNION - +/** + * @brief Returns Quaternion Data + * + * Data is accessible through the <em>quaternion</em>-struct (object.quaternion.x, object.quaternion.y, object.quaternion.z), after calling this function + */ void BNO055::getQuaternion(void) { get(QUA_DATA_VECTOR, quaternion, QUATERNION_FORMAT); @@ -624,7 +795,11 @@ } //LINEAR ACCELERATION - +/** + * @brief Returns Linear Acceleration Data + * + * Data is accessible through the <em>linear_accel</em>-struct (object.linear_accel.x, object.linear_accel.y, object.linear_accel.z), after calling this function + */ void BNO055::getLinearAcceleration(void) { if(format.acceleration == ACCELERATION) @@ -641,7 +816,11 @@ } //GRAVITY VECTOR - +/** + * @brief Returns Gravity Vector Data + * + * Data is accessible through the <em>gravity_vector</em>-struct (object.gravity_vector.x, object.gravity_vector.y, object.gravity_vector.z), after calling this function + */ void BNO055::getGravityVector(void) { if(format.acceleration == ACCELERATION) @@ -658,7 +837,11 @@ } //TEMPERATURE - +/** + * @brief Returns Temperature Data + * + * Data is accessible through the <em>temperature</em>-struct (object.temperature), after calling this function + */ void BNO055::getTemperature(void) { m_i2c_master.i2c_readSeries(m_bno055_address, TEMP, register_data, LENGTH_1_BYTES);