![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
PCA9548 + BNO055
Dependencies: BNO055_fusion RF24_fork mbed
main.cpp
- Committer:
- Makodan
- Date:
- 2017-02-22
- Revision:
- 0:a573c39fe4e8
File content as of revision 0:a573c39fe4e8:
#include "mbed.h" #include "BNO055.h" #include "config.h" #include "RF24.h" I2C i2c(i2c_sda, i2c_scl); Serial pc(TXD, RXD, 9600); DigitalOut myled(ledpin); RF24 radio(spi_MOSI, spi_MISO, spi_SCK, nrf_CE, nrf_CSN ); const uint64_t DataAddress = 0xF0F0F0F0E1LL; const uint64_t SyncAddress = 0xF0F0F0F0D2LL; #define PACKET_Q 1 #define PACKET_I 2 void ScanMUX(); //Scanning on all channels void Read1MUX(); //Read sensors on 0x28 address (all channels) void Read2MUX(); //Read sensors on 0x29 address (all channels) void ChannelMUX(uint8_t channel); void ReadIMU1(uint8_t channel); //Single sensor reading on 0x28 address void ReadIMU2(uint8_t channel); //Single sensor reading on 0x29 address uint8_t AcclerometerScale = 3; // 3 = 16G bool AGCalFlag = false; bool MCalFlag = false; bool SendFlag = false; // Sensor arrays - contain available sensors bool sensarray1[] = {false, false, false, false, false, false, false}; // 0x28 array bool sensarray2[] = {false, false, false, false, false, false, false}; // 0x29 array struct imuData { uint8_t sensorID; uint8_t packageCntr; int16_t q[4]; int32_t linAcc[3]; } imuData; BNO055 imu1(i2c_sda, i2c_scl, unused_pin, 0x50, MODE_NDOF); // Address: 0x28 BNO055 imu2(i2c_sda, i2c_scl, unused_pin, 0x52, MODE_NDOF); // Address: 0x29 BNO055_ID_INF_TypeDef bno055_id_inf; BNO055_QUATERNION_TypeDef BNO055_quaternion; BNO055_EULER_TypeDef euler_angles; BNO055_LIN_ACC_TypeDef linear_acceleration; struct SyncMsg { bool Sleep; //false if sensor should not sleep } SyncMsg; //InterruptIn NRF_irq(PA_0); void sendIRQ(); void SendMSG(); void SetupRadio(); int main() { myled=1; int i; i2c.frequency(400000); //radio setup SetupRadio(); imuData.packageCntr = 0; // Sensor scanning ScanMUX(); // Print out sensor arrays pc.printf("\r\n\t\tCH0\tCH1\tCH2\tCH3\tCH4\tCH5\tCH6"); pc.printf("\r\n0x28 sensors:"); for(i=0; i<7; i++){ pc.printf("\t%d", sensarray1[i]);} pc.printf("\r\n0x29 sensors:"); for(i=0; i<7; i++){ pc.printf("\t%d", sensarray2[i]);} pc.printf("\r\n"); while (1) { Read1MUX(); Read2MUX(); myled = !myled; } } void ScanMUX(){ for(uint8_t x=0; x<7; x++) { ChannelMUX(x); pc.printf("Scanning CH: %d\r\n", x); wait(0.001); imu1.reset(); imu2.reset(); wait(0.01); if(imu1.chip_ready() == 0){ pc.printf("Bosch BNO055 is NOT available at address 0x28!!\r\n"); imu1.reset(); } if(imu2.chip_ready() == 0){ pc.printf("Bosch BNO055 is NOT available at address 0x29!!\r\n"); imu2.reset(); } if(imu1.chip_ready() == 1){ pc.printf("Bosch BNO055 is AVAILABLE at address 0x28!!\r\n"); imu1.read_id_inf(&bno055_id_inf); pc.printf("CHIP ID:0x%02x, ACC ID:0x%02x, MAG ID:0x%02x, GYR ID:0x%02x, ", bno055_id_inf.chip_id, bno055_id_inf.acc_id, bno055_id_inf.mag_id, bno055_id_inf.gyr_id); pc.printf("SW REV:0x%04x, BL REV:0x%02x\r\n", bno055_id_inf.sw_rev_id, bno055_id_inf.bootldr_rev_id); imu1.set_mounting_position(MT_P0); imu1.configure_accelerometer_range(AcclerometerScale); sensarray1[x] = true; } if(imu2.chip_ready() == 1){ pc.printf("Bosch BNO055 is AVAILABLE at address 0x29!!\r\n"); imu2.read_id_inf(&bno055_id_inf); pc.printf("CHIP ID:0x%02x, ACC ID:0x%02x, MAG ID:0x%02x, GYR ID:0x%02x, ", bno055_id_inf.chip_id, bno055_id_inf.acc_id, bno055_id_inf.mag_id, bno055_id_inf.gyr_id); pc.printf("SW REV:0x%04x, BL REV:0x%02x\r\n", bno055_id_inf.sw_rev_id, bno055_id_inf.bootldr_rev_id); imu2.set_mounting_position(MT_P0); imu2.configure_accelerometer_range(AcclerometerScale); sensarray2[x] = true; } } } void Read1MUX(){ uint8_t i=0; for( i=0; i<7; i++) { ChannelMUX(i); if(sensarray1[i]){ ReadIMU1(i); pc.printf("ID:%d\t%d\t%d\t%d\t%d\r\n",imuData.sensorID,imuData.q[0],imuData.q[1],imuData.q[2],imuData.q[3]); } } } void Read2MUX(){ uint8_t i=0; for( i=0; i<7; i++) { ChannelMUX(i); if(sensarray2[i]){ ReadIMU2(i); pc.printf("ID:%d\t%d\t%d\t%d\t%d\r\n",imuData.sensorID,imuData.q[0],imuData.q[1],imuData.q[2],imuData.q[3]); } } } void ChannelMUX(uint8_t channel) { char get; char select; select = 1 << channel; i2c.write(0xE0, &select ,1); wait(0.001); i2c.read(0xE0, &get, 1); wait(0.001); i2c.write(0xE0, &select ,1); wait(0.001); i2c.read(0xE0, &get, 1); } void ReadIMU1(uint8_t channel) { imuData.sensorID = (channel * 10); imu1.get_quaternion(&BNO055_quaternion); imuData.q[0] = BNO055_quaternion.w; imuData.q[1] = BNO055_quaternion.x; imuData.q[2] = BNO055_quaternion.y; imuData.q[3] = BNO055_quaternion.z; imu1.get_abs_accel(&linear_acceleration); float lax = 1.0; float lay = 2.0; float laz = 3.0; lax = (float)linear_acceleration.x; lay = (float)linear_acceleration.y; laz = (float)linear_acceleration.z; memcpy(imuData.linAcc , &lax, 4); memcpy(&imuData.linAcc[1] , &lay, 4); memcpy(&imuData.linAcc[2] , &laz, 4); } void ReadIMU2(uint8_t channel) { imuData.sensorID = ((channel * 10) + 1); // ID: CH number + 1 imu2.get_quaternion(&BNO055_quaternion); imuData.q[0] = BNO055_quaternion.w; imuData.q[1] = BNO055_quaternion.x; imuData.q[2] = BNO055_quaternion.y; imuData.q[3] = BNO055_quaternion.z; imu2.get_abs_accel(&linear_acceleration); float lax = 1.0; float lay = 2.0; float laz = 3.0; lax = (float)linear_acceleration.x; lay = (float)linear_acceleration.y; laz = (float)linear_acceleration.z; memcpy(imuData.linAcc , &lax, 4); memcpy(&imuData.linAcc[1] , &lay, 4); memcpy(&imuData.linAcc[2] , &laz, 4); } void SetupRadio() { radio.begin(); radio.setPALevel(RF24_PA_MAX) ; radio.setDataRate(RF24_2MBPS); radio.setCRCLength(RF24_CRC_16); radio.setChannel(RadioChannel); radio.setRetries(0,2); radio.enableDynamicAck(); radio.enableDynamicPayloads(); radio.openWritingPipe(DataAddress); radio.openReadingPipe(1,SyncAddress); //radio.stopListening(); //radio.setAutoAck(1,false); radio.startListening(); } void SendMSG() { radio.stopListening(); radio.write(&imuData, sizeof(imuData), true); radio.startListening(); if(imuData.packageCntr < 255) imuData.packageCntr++; else imuData.packageCntr = 0; myled = !myled; }