First Revision of sample code for interfacing ROHM Multi-Sensor Shield board with MultiTech's DragonFly Host Board
Dependencies: mbed
Fork of ROHM-DragonFly-MultiSensorShield_Interface by
Code Example for ROHM Mutli-Sensor Shield interfaced onto the MultiTech DragonFly Host Cell Board
This code was written to be used with the MultiTech DragonFly Evaluation Kit.
This is the basic example code for interfacing ROHM's Multi-sensor Shield Board onto this board.
Additional information about the ROHM MultiSensor Shield Board can be found at the following link: https://github.com/ROHMUSDC/ROHM_SensorPlatform_Multi-Sensor-Shield
Operation
Ultimately, this code will initialize all the sensors on the Multi-sensor shield board and then poll the sensors. The sensor data will then be returned through the on-board USB to UART interface and can be viewable on any PC with a standard COM port reader (Terminal, TeraTerm, HyperTerm, etc...)
Supported ROHM Sensor Devices
- BDE0600G Temperature Sensor
- BM1383GLV Pressure Sensor
- BU52014 Hall Sensor
- ML8511 UV Sensor
- RPR-0521 ALS/PROX Sensor
- BH1745NUC Color Sensor
- KMX62 Accel/Mag Sensor
- KX122 Accel Sensor
- KXG03 Gyro/Accel Sensor
Sensor Applicable Code Sections
- All functionality can be found in the function main()
- Ultimately code is split up into an "initalization" and "main loop" section
- Specific sensor information can be found using the #ifdef statements at the beginning of the code
Questions/Feedback
Please feel free to let us know any questions/feedback/comments/concerns you may have by addressing the following e-mail:
Revision 7:ae40e49391c8, committed 2015-12-18
- Comitter:
- kbahar3
- Date:
- Fri Dec 18 00:23:19 2015 +0000
- Parent:
- 6:872eb454b3c4
- Child:
- 8:9ab9b42c3be4
- Commit message:
- Added code for KXG03
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/main.cpp Mon Sep 28 18:36:57 2015 +0000 +++ b/main.cpp Fri Dec 18 00:23:19 2015 +0000 @@ -15,12 +15,13 @@ //Macros for checking each of the different Sensor Devices #define AnalogTemp //BDE0600 #define AnalogUV //ML8511 -#define HallSensor //BU52011 +#define HallSensor //BU52014 #define RPR0521 //RPR0521 #define KMX62 //KMX61, Accel/Mag #define COLOR //BH1745 -#define KX022 //KX022, Accel Only +#define KX122 //KX122, Accel Only #define Pressure //BM1383 +#define KXG03 //KXG03 //Define Pins for I2C Interface I2C i2c(I2C_SDA, I2C_SCL); @@ -99,28 +100,66 @@ int BH1745_Green; #endif -#ifdef KX022 -int KX022_addr_w = 0x3C; //write -int KX022_addr_r = 0x3D; //read -char KX022_Accel_CNTL1[2] = {0x18, 0x41}; -char KX022_Accel_ODCNTL[2] = {0x1B, 0x02}; -char KX022_Accel_CNTL3[2] = {0x1A, 0xD8}; -char KX022_Accel_TILT_TIMER[2] = {0x22, 0x01}; -char KX022_Accel_CNTL2[2] = {0x18, 0xC1}; -char KX022_Content_ReadData[6]; -char KX022_Addr_Accel_ReadData = 0x06; -float KX022_Accel_X; -float KX022_Accel_Y; -float KX022_Accel_Z; -short int KX022_Accel_X_RawOUT = 0; -short int KX022_Accel_Y_RawOUT = 0; -short int KX022_Accel_Z_RawOUT = 0; -int KX022_Accel_X_LB = 0; -int KX022_Accel_X_HB = 0; -int KX022_Accel_Y_LB = 0; -int KX022_Accel_Y_HB = 0; -int KX022_Accel_Z_LB = 0; -int KX022_Accel_Z_HB = 0; +#ifdef KX122 +int KX122_addr_w = 0x3C; //write +int KX122_addr_r = 0x3D; //read +char KX122_Accel_CNTL1[2] = {0x18, 0x41}; +char KX122_Accel_ODCNTL[2] = {0x1B, 0x02}; +char KX122_Accel_CNTL3[2] = {0x1A, 0xD8}; +char KX122_Accel_TILT_TIMER[2] = {0x22, 0x01}; +char KX122_Accel_CNTL2[2] = {0x18, 0xC1}; +char KX122_Content_ReadData[6]; +char KX122_Addr_Accel_ReadData = 0x06; +float KX122_Accel_X; +float KX122_Accel_Y; +float KX122_Accel_Z; +short int KX122_Accel_X_RawOUT = 0; +short int KX122_Accel_Y_RawOUT = 0; +short int KX122_Accel_Z_RawOUT = 0; +int KX122_Accel_X_LB = 0; +int KX122_Accel_X_HB = 0; +int KX122_Accel_Y_LB = 0; +int KX122_Accel_Y_HB = 0; +int KX122_Accel_Z_LB = 0; +int KX122_Accel_Z_HB = 0; +#endif + +#ifdef KXG03 +int i = 11; +int t = 1; +short int aveX = 0; +short int aveX2 = 0; +short int aveX3 = 0; +short int aveY = 0; +short int aveY2 = 0; +short int aveY3 = 0; +short int aveZ = 0; +short int aveZ2 = 0; +short int aveZ3 = 0; +float ave22; +float ave33; +int KXG03_addr_w = 0x9C; //write +int KXG03_addr_r = 0x9D; //read +char KXG03_STBY_REG[2] = {0x43, 0x00}; +char KXG03_Content_Gyro_ReadData[6]; +char KXG03_Content_Accel_ReadData[6]; +char KXG03_Addr_Gyro_ReadData = 0x02; +char KXG03_Addr_Accel_ReadData = 0x08; +float KXG03_Gyro_X; +float KXG03_Gyro_Y; +float KXG03_Gyro_Z; +short int KXG03_Gyro_X_RawOUT = 0; +short int KXG03_Gyro_Y_RawOUT = 0; +short int KXG03_Gyro_Z_RawOUT = 0; +short int KXG03_Gyro_X_RawOUT2 = 0; +short int KXG03_Gyro_Y_RawOUT2 = 0; +short int KXG03_Gyro_Z_RawOUT2 = 0; +float KXG03_Accel_X; +float KXG03_Accel_Y; +float KXG03_Accel_Z; +short int KXG03_Accel_X_RawOUT = 0; +short int KXG03_Accel_Y_RawOUT = 0; +short int KXG03_Accel_Z_RawOUT = 0; #endif #ifdef Pressure @@ -166,12 +205,16 @@ i2c.write(BH1745_addr_w, &BH1745_mode3[0], 2, false); #endif -#ifdef KX022 - i2c.write(KX022_addr_w, &KX022_Accel_CNTL1[0], 2, false); - i2c.write(KX022_addr_w, &KX022_Accel_ODCNTL[0], 2, false); - i2c.write(KX022_addr_w, &KX022_Accel_CNTL3[0], 2, false); - i2c.write(KX022_addr_w, &KX022_Accel_TILT_TIMER[0], 2, false); - i2c.write(KX022_addr_w, &KX022_Accel_CNTL2[0], 2, false); +#ifdef KX122 + i2c.write(KX122_addr_w, &KX122_Accel_CNTL1[0], 2, false); + i2c.write(KX122_addr_w, &KX122_Accel_ODCNTL[0], 2, false); + i2c.write(KX122_addr_w, &KX122_Accel_CNTL3[0], 2, false); + i2c.write(KX122_addr_w, &KX122_Accel_TILT_TIMER[0], 2, false); + i2c.write(KX122_addr_w, &KX122_Accel_CNTL2[0], 2, false); +#endif + +#ifdef KXG03 + i2c.write(KXG03_addr_w, &KXG03_STBY_REG[0], 2, false); #endif #ifdef Pressure @@ -192,7 +235,7 @@ BDE0600_output = (BDE0600_output-(float)1.753)/((float)-0.01068) + (float)30; printf("BDE0600 Analog Temp Sensor Data:\r\n"); - printf(" Temp = %.2f C\r\n", BDE0600_output); + printf(" Temp = %.2f degC\r\n", BDE0600_output); #endif #ifdef AnalogUV @@ -308,26 +351,115 @@ printf(" MagZ= %0.2f uT\r\n", MEMS_Mag_Conv_Zout); #endif - #ifdef KX022 - //Read KX022 Portion from the IC - i2c.write(KX022_addr_w, &KX022_Addr_Accel_ReadData, 1, RepStart); - i2c.read(KX022_addr_r, &KX022_Content_ReadData[0], 6, NoRepStart); + #ifdef KX122 + //Read KX122 Portion from the IC + i2c.write(KX122_addr_w, &KX122_Addr_Accel_ReadData, 1, RepStart); + i2c.read(KX122_addr_r, &KX122_Content_ReadData[0], 6, NoRepStart); //Format Data - KX022_Accel_X_RawOUT = (KX022_Content_ReadData[1]<<8) | (KX022_Content_ReadData[0]); - KX022_Accel_Y_RawOUT = (KX022_Content_ReadData[3]<<8) | (KX022_Content_ReadData[2]); - KX022_Accel_Z_RawOUT = (KX022_Content_ReadData[5]<<8) | (KX022_Content_ReadData[4]); + KX122_Accel_X_RawOUT = (KX122_Content_ReadData[1]<<8) | (KX122_Content_ReadData[0]); + KX122_Accel_Y_RawOUT = (KX122_Content_ReadData[3]<<8) | (KX122_Content_ReadData[2]); + KX122_Accel_Z_RawOUT = (KX122_Content_ReadData[5]<<8) | (KX122_Content_ReadData[4]); //Scale Data - KX022_Accel_X = (float)KX022_Accel_X_RawOUT / 16384; - KX022_Accel_Y = (float)KX022_Accel_Y_RawOUT / 16384; - KX022_Accel_Z = (float)KX022_Accel_Z_RawOUT / 16384; + KX122_Accel_X = (float)KX122_Accel_X_RawOUT / 16384; + KX122_Accel_Y = (float)KX122_Accel_Y_RawOUT / 16384; + KX122_Accel_Z = (float)KX122_Accel_Z_RawOUT / 16384; //Return Data through UART - printf("KX022 Accelerometer Sensor Data: \r\n"); - printf(" AccX= %0.2f g\r\n", KX022_Accel_X); - printf(" AccY= %0.2f g\r\n", KX022_Accel_Y); - printf(" AccZ= %0.2f g\r\n", KX022_Accel_Z); + printf("KX122 Accelerometer Sensor Data: \r\n"); + printf(" AccX= %0.2f g\r\n", KX122_Accel_X); + printf(" AccY= %0.2f g\r\n", KX122_Accel_Y); + printf(" AccZ= %0.2f g\r\n", KX122_Accel_Z); + #endif + + #ifdef KXG03 + //Read KXG03 Gyro Portion from the IC + i2c.write(KXG03_addr_w, &KXG03_Addr_Gyro_ReadData, 1, RepStart); + i2c.read(KXG03_addr_r, &KXG03_Content_Gyro_ReadData[0], 6, NoRepStart); + + if (t == 1){ + int i = 11; + while(--i) + { + //Read KXG03 Gyro Portion from the IC + i2c.write(KXG03_addr_w, &KXG03_Addr_Gyro_ReadData, 1, RepStart); + i2c.read(KXG03_addr_r, &KXG03_Content_Gyro_ReadData[0], 6, NoRepStart); + + //Format Data + KXG03_Gyro_X_RawOUT = (KXG03_Content_Gyro_ReadData[1]<<8) | (KXG03_Content_Gyro_ReadData[0]); + KXG03_Gyro_Y_RawOUT = (KXG03_Content_Gyro_ReadData[3]<<8) | (KXG03_Content_Gyro_ReadData[2]); + KXG03_Gyro_Z_RawOUT = (KXG03_Content_Gyro_ReadData[5]<<8) | (KXG03_Content_Gyro_ReadData[4]); + aveX = KXG03_Gyro_X_RawOUT; + aveY = KXG03_Gyro_Y_RawOUT; + aveZ = KXG03_Gyro_Z_RawOUT; + aveX2 = aveX2 + aveX; + aveY2 = aveY2 + aveY; + aveZ2 = aveZ2 + aveZ; + } + aveX3 = aveX2 / 10; + aveY3 = aveY2 / 10; + aveZ3 = aveZ2 / 10; + printf("KXG03 Gyroscopic Sensor Data: \r\n"); + printf("KXG03 Gyroscopic Offset Calculation: \r\n"); + printf(" aveX2= %d \r\n", aveX2); + printf(" aveY2= %d \r\n", aveY2); + printf(" aveZ2= %d \r\n", aveZ2); + printf(" aveX3= %d \r\n", aveX3); + printf(" aveY3= %d \r\n", aveY3); + printf(" aveZ3= %d \r\n", aveZ3); + t = 0; + } + + else { + //Read KXG03 Gyro Portion from the IC + i2c.write(KXG03_addr_w, &KXG03_Addr_Gyro_ReadData, 1, RepStart); + i2c.read(KXG03_addr_r, &KXG03_Content_Gyro_ReadData[0], 6, NoRepStart); + + //Format Data + KXG03_Gyro_X_RawOUT = (KXG03_Content_Gyro_ReadData[1]<<8) | (KXG03_Content_Gyro_ReadData[0]); + KXG03_Gyro_Y_RawOUT = (KXG03_Content_Gyro_ReadData[3]<<8) | (KXG03_Content_Gyro_ReadData[2]); + KXG03_Gyro_Z_RawOUT = (KXG03_Content_Gyro_ReadData[5]<<8) | (KXG03_Content_Gyro_ReadData[4]); + + //printf(" aveX3= %d \r\n", aveX3); + //printf(" aveY3= %d \r\n", aveY3); + //printf(" aveZ3= %d \r\n", aveZ3); + + KXG03_Gyro_X_RawOUT2 = KXG03_Gyro_X_RawOUT - aveX3; + KXG03_Gyro_Y_RawOUT2 = KXG03_Gyro_Y_RawOUT - aveY3; + KXG03_Gyro_Z_RawOUT2 = KXG03_Gyro_Z_RawOUT - aveZ3; + + //Scale Data + KXG03_Gyro_X = (float)KXG03_Gyro_X_RawOUT2 * (float)0.007813 + (float)0.000004; + KXG03_Gyro_Y = (float)KXG03_Gyro_Y_RawOUT2 * (float)0.007813 + (float)0.000004; + KXG03_Gyro_Z = (float)KXG03_Gyro_Z_RawOUT2 * (float)0.007813 + (float)0.000004; + + printf("KXG03 Gyroscopic Sensor Data: \r\n"); + printf(" GyroX= %0.2f deg/sec\r\n", KXG03_Gyro_X); + printf(" GyroY= %0.2f deg/sec\r\n", KXG03_Gyro_Y); + printf(" GyroZ= %0.2f deg/sec\r\n", KXG03_Gyro_Z); + + //Read KXG03 Accel Portion from the IC + i2c.write(KXG03_addr_w, &KXG03_Addr_Accel_ReadData, 1, RepStart); + i2c.read(KXG03_addr_r, &KXG03_Content_Accel_ReadData[0], 6, NoRepStart); + + KXG03_Accel_X_RawOUT = (KXG03_Content_Accel_ReadData[1]<<8) | (KXG03_Content_Accel_ReadData[0]); + KXG03_Accel_Y_RawOUT = (KXG03_Content_Accel_ReadData[3]<<8) | (KXG03_Content_Accel_ReadData[2]); + KXG03_Accel_Z_RawOUT = (KXG03_Content_Accel_ReadData[5]<<8) | (KXG03_Content_Accel_ReadData[4]); + + //Scale Data + KXG03_Accel_X = (float)KXG03_Accel_X_RawOUT * (float)0.000061 + (float)0.000017; + KXG03_Accel_Y = (float)KXG03_Accel_Y_RawOUT * (float)0.000061 + (float)0.000017; + KXG03_Accel_Z = (float)KXG03_Accel_Z_RawOUT * (float)0.000061 + (float)0.000017; + + //Return Data through UART + printf(" AccX= %0.2f g\r\n", KXG03_Accel_X); + printf(" AccY= %0.2f g\r\n", KXG03_Accel_Y); + printf(" AccZ= %0.2f g\r\n", KXG03_Accel_Z); + aveX2 = 0; + aveY2 = 0; + aveZ2 = 0; + } #endif #ifdef Pressure @@ -343,7 +475,7 @@ BM1383_Pres_Conv_Out = (BM1383_Var + BM1383_Deci); //question pending here... printf("BM1383 Pressure Sensor Data:\r\n"); - printf(" Temperature= %0.2f C\r\n", BM1383_Temp_Conv_Out); + printf(" Temperature= %0.2f degC\r\n", BM1383_Temp_Conv_Out); printf(" Pressure = %0.2f hPa\r\n", BM1383_Pres_Conv_Out); #endif //*********************************************************************