"Sensors Reader" Sample Application for X-NUCLEO-IKS01A1 Expansion Board
Dependencies: X_NUCLEO_IKS01A2 mbed
Fork of Sensors_Reader by
Revision 68:61c4480769a1, committed 2017-02-25
- Comitter:
- mbedAustin
- Date:
- Sat Feb 25 03:01:12 2017 +0000
- Parent:
- 67:6f54b8c6f65b
- Commit message:
- Updated sensor library from IKS0A1 to IKS0A2
Changed in this revision
diff -r 6f54b8c6f65b -r 61c4480769a1 X_NUCLEO_IKS01A1.lib --- a/X_NUCLEO_IKS01A1.lib Thu Nov 24 16:33:18 2016 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -https://developer.mbed.org/teams/ST/code/X_NUCLEO_IKS01A1/#bd74c33ecbbd
diff -r 6f54b8c6f65b -r 61c4480769a1 X_NUCLEO_IKS01A2.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/X_NUCLEO_IKS01A2.lib Sat Feb 25 03:01:12 2017 +0000 @@ -0,0 +1,1 @@ +https://developer.mbed.org/teams/ST/code/X_NUCLEO_IKS01A2/#63b2b4c21092
diff -r 6f54b8c6f65b -r 61c4480769a1 main.cpp --- a/main.cpp Thu Nov 24 16:33:18 2016 +0000 +++ b/main.cpp Sat Feb 25 03:01:12 2017 +0000 @@ -1,278 +1,143 @@ -/** - ****************************************************************************** - * @file main.cpp - * @author AST / EST - * @version V0.0.1 - * @date 14-April-2015 - * @brief Example application for using the X_NUCLEO_IKS01A1 - * MEMS Inertial & Environmental Sensor Nucleo expansion board. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** -*/ - -/** - * @mainpage X_NUCLEO_IKS01A1 MEMS Inertial & Environmental Sensor Nucleo Expansion Board Firmware Package - * - * <b>Introduction</b> - * - * This firmware package includes Components Device Drivers, Board Support Package - * and example application for STMicroelectronics X_NUCLEO_IKS01A1 MEMS Inertial & Environmental Nucleo - * Expansion Board - * - * <b>Example Application</b> - * - */ - - -/*** Includes ----------------------------------------------------------------- ***/ -#include "mbed.h" -#include "assert.h" -#include "x_nucleo_iks01a1.h" - -#include <Ticker.h> - - -/*** Constants ---------------------------------------------------------------- ***/ -namespace { - const int MS_INTERVALS = 1000; -} - - -/*** Macros ------------------------------------------------------------------- ***/ -#define APP_LOOP_PERIOD 3000 // in ms - -#if defined(TARGET_STM) -#define LED_OFF (0) -#else -#define LED_OFF (1) -#endif -#define LED_ON (!LED_OFF) - - -/*** Typedefs ----------------------------------------------------------------- ***/ -typedef struct { - int32_t AXIS_X; - int32_t AXIS_Y; - int32_t AXIS_Z; -} AxesRaw_TypeDef; - - -/*** Static variables --------------------------------------------------------- ***/ -#ifdef DBG_MCU -/* betzw: enable debugging while using sleep modes */ -#include "DbgMCU.h" -static DbgMCU enable_dbg; -#endif // DBG_MCU - -static X_NUCLEO_IKS01A1 *mems_expansion_board = X_NUCLEO_IKS01A1::Instance(); -static GyroSensor *gyroscope = mems_expansion_board->GetGyroscope(); -static MotionSensor *accelerometer = mems_expansion_board->GetAccelerometer(); -static MagneticSensor *magnetometer = mems_expansion_board->magnetometer; -static HumiditySensor *humidity_sensor = mems_expansion_board->ht_sensor;; -static PressureSensor *pressure_sensor = mems_expansion_board->pt_sensor; -static TempSensor *temp_sensor1 = mems_expansion_board->ht_sensor; -static TempSensor *temp_sensor2 = mems_expansion_board->pt_sensor; - -static Ticker ticker; -static DigitalOut myled(LED1, LED_OFF); - -static volatile bool timer_irq_triggered = false; -static volatile bool ff_irq_triggered = false; - - -/*** Helper Functions (1/2) ------------------------------------------------------------ ***/ - - -/*** Interrupt Handler Top-Halves ------------------------------------------------------ ***/ -/* Called in interrupt context, therefore just set a trigger variable */ -static void timer_irq(void) { - timer_irq_triggered = true; -} - -/* Called in interrupt context, therefore just set a trigger variable */ -static void ff_irq(void) { - ff_irq_triggered = true; - - /* Disable IRQ until handled */ - mems_expansion_board->gyro_lsm6ds3->Disable_Free_Fall_Detection_IRQ(); -} - - -/*** Interrupt Handler Bottom-Halves ------------------------------------------------- ***/ -/* Handle Free Fall Interrupt - (here we are in "normal" context, i.e. not in IRQ context) -*/ -static void handle_ff_irq(void) { - printf("\nFree Fall Detected!\n\n"); - - /* Re-enable IRQ */ - mems_expansion_board->gyro_lsm6ds3->Enable_Free_Fall_Detection_IRQ(); -} - - -/*** Helper Functions (2/2) ------------------------------------------------------------ ***/ -/* print floats & doubles */ -static char *printDouble(char* str, double v, int decimalDigits=2) -{ - int i = 1; - int intPart, fractPart; - int len; - char *ptr; - - /* prepare decimal digits multiplicator */ - for (;decimalDigits!=0; i*=10, decimalDigits--); - - /* calculate integer & fractinal parts */ - intPart = (int)v; - fractPart = (int)((v-(double)(int)v)*i); - - /* fill in integer part */ - sprintf(str, "%i.", intPart); - - /* prepare fill in of fractional part */ - len = strlen(str); - ptr = &str[len]; - - /* fill in leading fractional zeros */ - for (i/=10;i>1; i/=10, ptr++) { - if(fractPart >= i) break; - *ptr = '0'; - } - - /* fill in (rest of) fractional part */ - sprintf(ptr, "%i", fractPart); - - return str; -} - -/* Initialization function */ -static void init(void) { - uint8_t id1, id2; - - /* Determine ID of Humidity & Temperature Sensor */ - CALL_METH(humidity_sensor, ReadID, &id1, 0x0); - CALL_METH(temp_sensor1, ReadID, &id2, 0x0); - printf("Humidity | Temperature Sensor ID = %s (0x%x | 0x%x)\n", - ((id1 == I_AM_HTS221) ? "HTS221 " : "UNKNOWN"), - id1, id2 - ); - assert(id1 == id2); - - /* Determine ID of Gyro & Motion Sensor */ - assert((mems_expansion_board->gyro_lsm6ds0 == NULL) || - (mems_expansion_board->gyro_lsm6ds3 == NULL)); - CALL_METH(gyroscope, ReadID, &id1, 0x0); - CALL_METH(accelerometer, ReadID, &id2, 0x0); - printf("Gyroscope | Motion Sensor ID = %s (0x%x | 0x%x)\n", - ((id1 == I_AM_LSM6DS3_XG) ? "LSM6DS3" : - ((id1 == I_AM_LSM6DS0_XG) ? "LSM6DS0" : "UNKNOWN")), - id1, id2 - ); - assert(id1 == id2); - - /* Register Free Fall Detection IRQ Handler & Enable Detection */ - if(mems_expansion_board->gyro_lsm6ds3 != NULL) { - mems_expansion_board->gyro_lsm6ds3->Attach_Free_Fall_Detection_IRQ(ff_irq); - mems_expansion_board->gyro_lsm6ds3->Enable_Free_Fall_Detection(); - } -} - -/* Main cycle function */ -static void main_cycle(void) { - float TEMPERATURE_Value; - float HUMIDITY_Value; - float PRESSURE_Value; - float PRESSURE_Temp_Value; - AxesRaw_TypeDef MAG_Value; - AxesRaw_TypeDef ACC_Value; - AxesRaw_TypeDef GYR_Value; - char buffer1[32]; - char buffer2[32]; - char buffer3[32]; - char buffer4[32]; - unsigned int ret = 0; - - /* Switch LED On */ - myled = LED_ON; - printf("===\n"); - - /* Determine Environmental Values */ - ret |= (!CALL_METH(temp_sensor1, GetTemperature, &TEMPERATURE_Value, 0.0f) ? 0x0 : 0x1); - ret |= (!CALL_METH(humidity_sensor, GetHumidity, &HUMIDITY_Value, 0.0f) ? 0x0 : 0x2);; - ret |= (!CALL_METH(pressure_sensor, GetPressure, &PRESSURE_Value, 0.0f) ? 0x0 : 0x4);; - ret |= (!CALL_METH(temp_sensor2, GetFahrenheit, &PRESSURE_Temp_Value, 0.0f) ? 0x0 : 0x8);; - ret |= (!CALL_METH(magnetometer, Get_M_Axes, (int32_t *)&MAG_Value, 0) ? 0x0 : 0x10);; - ret |= (!CALL_METH(accelerometer, Get_X_Axes, (int32_t *)&ACC_Value, 0) ? 0x0 : 0x20);; - ret |= (!CALL_METH(gyroscope, Get_G_Axes, (int32_t *)&GYR_Value, 0) ? 0x0 : 0x40); - - /* Print Values Out */ - printf("I2C [errors]: 0x%.2x X Y Z\n", ret); - printf("MAG [mgauss]: %9ld %9ld %9ld\n", - MAG_Value.AXIS_X, MAG_Value.AXIS_Y, MAG_Value.AXIS_Z); - printf("ACC [mg]: %9ld %9ld %9ld\n", - ACC_Value.AXIS_X, ACC_Value.AXIS_Y, ACC_Value.AXIS_Z); - printf("GYR [mdps]: %9ld %9ld %9ld\n", - GYR_Value.AXIS_X, GYR_Value.AXIS_Y, GYR_Value.AXIS_Z); - printf("---\nTEMP | HUMIDITY: %s°C | %s%%\nTEMP | PRESSURE: %s°F | %smbar\n", - printDouble(buffer1, TEMPERATURE_Value), - printDouble(buffer2, HUMIDITY_Value), - printDouble(buffer4, PRESSURE_Temp_Value), - printDouble(buffer3, PRESSURE_Value)); - - /* Switch LED Off */ - myled = LED_OFF; -} - - -/*** Main function ------------------------------------------------------------- ***/ -/* Generic main function/loop for enabling WFE in case of - interrupt based cyclic execution -*/ -int main() -{ - /* Start & initialize */ - printf("\n--- Starting new run ---\n"); - init(); - - /* Start timer irq */ - ticker.attach_us(timer_irq, MS_INTERVALS * APP_LOOP_PERIOD); - - while (true) { - if(timer_irq_triggered) { - timer_irq_triggered = false; - main_cycle(); - } else if(ff_irq_triggered) { - ff_irq_triggered = false; - handle_ff_irq(); - } else { - __WFE(); /* it is recommended that SEVONPEND in the - System Control Register is NOT set */ - } - } -} +/** + ****************************************************************************** + * @file main.cpp + * @author CLab + * @version V1.0.0 + * @date 2-December-2016 + * @brief Simple Example application for using the X_NUCLEO_IKS01A1 + * MEMS Inertial & Environmental Sensor Nucleo expansion board. + ****************************************************************************** + * @attention + * + * <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2> + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** +*/ + +/* Includes */ +#include "mbed.h" +#include "x_nucleo_iks01a2.h" + +/* Instantiate the expansion board */ +static X_NUCLEO_IKS01A2 *mems_expansion_board = X_NUCLEO_IKS01A2::Instance(D14, D15, D4, D5); + +/* Retrieve the composing elements of the expansion board */ +static LSM303AGR_MAG_Sensor *magnetometer = mems_expansion_board->magnetometer; +static HTS221Sensor *hum_temp = mems_expansion_board->ht_sensor; +static LPS22HBSensor *press_temp = mems_expansion_board->pt_sensor; +static LSM6DSLSensor *acc_gyro = mems_expansion_board->acc_gyro; +static LSM303AGR_ACC_Sensor *accelerometer = mems_expansion_board->accelerometer; + +/* Helper function for printing floats & doubles */ +static char *printDouble(char* str, double v, int decimalDigits=2) +{ + int i = 1; + int intPart, fractPart; + int len; + char *ptr; + + /* prepare decimal digits multiplicator */ + for (;decimalDigits!=0; i*=10, decimalDigits--); + + /* calculate integer & fractinal parts */ + intPart = (int)v; + fractPart = (int)((v-(double)(int)v)*i); + + /* fill in integer part */ + sprintf(str, "%i.", intPart); + + /* prepare fill in of fractional part */ + len = strlen(str); + ptr = &str[len]; + + /* fill in leading fractional zeros */ + for (i/=10;i>1; i/=10, ptr++) { + if(fractPart >= i) break; + *ptr = '0'; + } + + /* fill in (rest of) fractional part */ + sprintf(ptr, "%i", fractPart); + + return str; +} + + +/* Simple main function */ +int main() { + uint8_t id; + float value1, value2; + char buffer1[32], buffer2[32]; + int32_t axes[3]; + + /* Enable all sensors */ + hum_temp->Enable(); + press_temp->Enable(); + magnetometer->Enable(); + accelerometer->Enable(); + acc_gyro->Enable_X(); + acc_gyro->Enable_G(); + + printf("\r\n--- Starting new run ---\r\n"); + + hum_temp->ReadID(&id); + printf("HTS221 humidity & temperature = 0x%X\r\n", id); + press_temp->ReadID(&id); + printf("LPS22HB pressure & temperature = 0x%X\r\n", id); + magnetometer->ReadID(&id); + printf("LSM303AGR magnetometer = 0x%X\r\n", id); + accelerometer->ReadID(&id); + printf("LSM303AGR accelerometer = 0x%X\r\n", id); + acc_gyro->ReadID(&id); + printf("LSM6DSL accelerometer & gyroscope = 0x%X\r\n", id); + + while(1) { + printf("\r\n"); + + hum_temp->GetTemperature(&value1); + hum_temp->GetHumidity(&value2); + printf("HTS221: [temp] %7s C, [hum] %s%%\r\n", printDouble(buffer1, value1), printDouble(buffer2, value2)); + + press_temp->GetTemperature(&value1); + press_temp->GetPressure(&value2); + printf("LPS22HB: [temp] %7s C, [press] %s mbar\r\n", printDouble(buffer1, value1), printDouble(buffer2, value2)); + + printf("---\r\n"); + + magnetometer->Get_M_Axes(axes); + printf("LSM303AGR [mag/mgauss]: %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]); + + accelerometer->Get_X_Axes(axes); + printf("LSM303AGR [acc/mg]: %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]); + + acc_gyro->Get_X_Axes(axes); + printf("LSM6DSL [acc/mg]: %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]); + + acc_gyro->Get_G_Axes(axes); + printf("LSM6DSL [gyro/mdps]: %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]); + + wait(1.5); + } +}
diff -r 6f54b8c6f65b -r 61c4480769a1 mbed.bld --- a/mbed.bld Thu Nov 24 16:33:18 2016 +0000 +++ b/mbed.bld Sat Feb 25 03:01:12 2017 +0000 @@ -1,1 +1,1 @@ -http://mbed.org/users/mbed_official/code/mbed/builds/d75b3fe1f5cb \ No newline at end of file +http://mbed.org/users/mbed_official/code/mbed/builds/ef9c61f8c49f \ No newline at end of file