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 BNO055 by
Diff: BNO055.cpp
- Revision:
- 0:24f23c36dd24
- Child:
- 1:2c3322a8d417
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/BNO055.cpp Thu May 28 19:22:25 2015 +0000
@@ -0,0 +1,179 @@
+#include "BNO055.h"
+#include "mbed.h"
+
+BNO055::BNO055(PinName SDA, PinName SCL) : _i2c(SDA,SCL){
+ //Set I2C fast and bring reset line high
+ _i2c.frequency(400000);
+ address = BNOAddress;
+ accel_scale = 1.0f;
+ rate_scale = 1.0f/16.0f;
+ angle_scale = 1.0f/16.0f;
+ temp_scale = 1.0f;
+ }
+
+void BNO055::reset(){
+//Perform a power-on-reset
+ readchar(BNO055_SYS_TRIGGER_ADDR);
+ rx = rx | 0x20;
+ writechar(BNO055_SYS_TRIGGER_ADDR,rx);
+//Wait for the system to come back up again (datasheet says 650ms)
+ wait_ms(675);
+}
+
+bool BNO055::check(){
+//Check we have communication link with the chip
+ readchar(BNO055_CHIP_ID_ADDR);
+ if (rx != 0xA0) return false;
+//Grab the chip ID and software versions
+ tx[0] = BNO055_CHIP_ID_ADDR;
+ _i2c.write(address,tx,1,true);
+ _i2c.read(address+1,rawdata,7,false);
+ ID.id = rawdata[0];
+ ID.accel = rawdata[1];
+ ID.mag = rawdata[2];
+ ID.gyro = rawdata[3];
+ ID.sw[0] = rawdata[4];
+ ID.sw[1] = rawdata[5];
+ ID.bootload = rawdata[6];
+ setpage(1);
+ tx[0] = BNO055_UNIQUE_ID_ADDR;
+ _i2c.write(address,tx,1,true);
+ _i2c.read(address+1,ID.serial,16,false);
+ setpage(0);
+ return true;
+ }
+
+void BNO055::SetExternalCrystal(bool yn){
+// Read the current status from the device
+ readchar(BNO055_SYS_TRIGGER_ADDR);
+ if (yn) rx = rx | 0x80;
+ else rx = rx & 0x7F;
+ writechar(BNO055_SYS_TRIGGER_ADDR,rx);
+}
+
+void BNO055::set_accel_units(char units){
+ readchar(BNO055_UNIT_SEL_ADDR);
+ if(units == MPERSPERS){
+ rx = rx & 0xFE;
+ accel_scale = 0.01f;
+ }
+ else {
+ rx = rx | units;
+ accel_scale = 1.0f;
+ }
+ writechar(BNO055_UNIT_SEL_ADDR,rx);
+}
+
+void BNO055::set_anglerate_units(char units){
+ readchar(BNO055_UNIT_SEL_ADDR);
+ if (units == DEG_PER_SEC){
+ rx = rx & 0xFD;
+ rate_scale = 1.0f/16.0f;
+ }
+ else {
+ rx = rx | units;
+ rate_scale = 1.0f/900.0f;
+ }
+ writechar(BNO055_UNIT_SEL_ADDR,rx);
+}
+
+void BNO055::set_angle_units(char units){
+ readchar(BNO055_UNIT_SEL_ADDR);
+ if (units == DEGREES){
+ rx = rx & 0xFB;
+ angle_scale = 1.0f/16.0f;
+ }
+ else {
+ rx = rx | units;
+ rate_scale = 1.0f/900.0f;
+ }
+ writechar(BNO055_UNIT_SEL_ADDR,rx);
+}
+
+void BNO055::set_temp_units(char units){
+ readchar(BNO055_UNIT_SEL_ADDR);
+ if (units == CENTIGRADE){
+ rx = rx & 0x7F;
+ temp_scale = 1.0f;
+ }
+ else {
+ rx = rx | units;
+ temp_scale = 2.0f;
+ }
+ writechar(BNO055_UNIT_SEL_ADDR,rx);
+}
+
+void BNO055::setmode(char omode){
+ writechar(BNO055_OPR_MODE_ADDR,omode);
+ op_mode = omode;
+}
+
+void BNO055::setpowermode(char pmode){
+ writechar(BNO055_PWR_MODE_ADDR,pmode);
+ pwr_mode = pmode;
+}
+
+void BNO055::get_accel(void){
+ tx[0] = BNO055_ACCEL_DATA_X_LSB_ADDR;
+ _i2c.write(address,tx,1,true);
+ _i2c.read(address+1,rawdata,6,0);
+ accel.rawx = (rawdata[1] << 8 | rawdata[0]);
+ accel.rawy = (rawdata[3] << 8 | rawdata[2]);
+ accel.rawz = (rawdata[5] << 8 | rawdata[4]);
+ accel.x = float(accel.rawx)*accel_scale;
+ accel.y = float(accel.rawy)*accel_scale;
+ accel.z = float(accel.rawz)*accel_scale;
+}
+
+void BNO055::get_gyro(void){
+ tx[0] = BNO055_GYRO_DATA_X_LSB_ADDR;
+ _i2c.write(address,tx,1,true);
+ _i2c.read(address+1,rawdata,6,0);
+ gyro.rawx = (rawdata[1] << 8 | rawdata[0]);
+ gyro.rawy = (rawdata[3] << 8 | rawdata[2]);
+ gyro.rawz = (rawdata[5] << 8 | rawdata[4]);
+ gyro.x = float(gyro.rawx)*rate_scale;
+ gyro.y = float(gyro.rawy)*rate_scale;
+ gyro.z = float(gyro.rawz)*rate_scale;
+}
+
+void BNO055::get_mag(void){
+ tx[0] = BNO055_MAG_DATA_X_LSB_ADDR;
+ _i2c.write(address,tx,1,true);
+ _i2c.read(address+1,rawdata,6,0);
+ mag.rawx = (rawdata[1] << 8 | rawdata[0]);
+ mag.rawy = (rawdata[3] << 8 | rawdata[2]);
+ mag.rawz = (rawdata[5] << 8 | rawdata[4]);
+ mag.x = float(mag.rawx);
+ mag.y = float(mag.rawy);
+ mag.z = float(mag.rawz);
+}
+
+void BNO055::get_lia(void){
+ tx[0] = BNO055_LINEAR_ACCEL_DATA_X_LSB_ADDR;
+ _i2c.write(address,tx,1,true);
+ _i2c.read(address+1,rawdata,6,0);
+ lia.rawx = (rawdata[1] << 8 | rawdata[0]);
+ lia.rawy = (rawdata[3] << 8 | rawdata[2]);
+ lia.rawz = (rawdata[5] << 8 | rawdata[4]);
+ lia.x = float(lia.rawx)*accel_scale;
+ lia.y = float(lia.rawy)*accel_scale;
+ lia.z = float(lia.rawz)*accel_scale;
+}
+
+void BNO055::get_grv(void){
+ tx[0] = BNO055_GRAVITY_DATA_X_LSB_ADDR;
+ _i2c.write(address,tx,1,true);
+ _i2c.read(address+1,rawdata,6,0);
+ gravity.rawx = (rawdata[1] << 8 | rawdata[0]);
+ gravity.rawy = (rawdata[3] << 8 | rawdata[2]);
+ gravity.rawz = (rawdata[5] << 8 | rawdata[4]);
+ gravity.x = float(gravity.rawx)*accel_scale;
+ gravity.y = float(gravity.rawy)*accel_scale;
+ gravity.z = float(gravity.rawz)*accel_scale;
+}
+
+void BNO055::get_calib(void){
+ readchar(BNO055_CALIB_STAT_ADDR);
+ calib = rx;
+}
\ No newline at end of file
