Bosch Sensortec Community

    cancel
    Showing results for 
    Search instead for 
    Did you mean: 

    BMX160 Step Detection

    Highlighted
    Senior Member

    BMX160 Step Detection

    Hi everyone,

    I want to configure BMX160 for step detection for human beings. The sensor will be placed inside the insole.

    Could you please help me to configure the parameters for min_steptime and min_threshold in order to achieve a robust step detection? I cannot find any information for those parameters into the datasheet.. The only info I can find is regarding the working mode (Normal, Sensitive, Robust) and there is no information regarding the bits on registers 0x7A - 0x7B (see 2.11.37 pg 88)

    Screenshot_48.png

     

    This is my configuration so far

    void stepDetector_set(struct bmi160_dev *dev) {
    
      int8_t rslt = 0;
    
      /* Select the Interrupt channel/pin */
      int_config.int_channel = BMI160_INT_CHANNEL_1; // Interrupt channel/pin 1
    
      /* Select the Interrupt type */
      int_config.int_type = BMI160_STEP_DETECT_INT;
    
      /* Select the interrupt channel/pin settings */
      int_config.int_pin_settg.output_en = BMI160_ENABLE;         // na - Enabling interrupt pins to act as output pin
      int_config.int_pin_settg.output_mode = BMI160_DISABLE;      // na - Choosing push-pull mode for interrupt pin
      int_config.int_pin_settg.output_type = BMI160_ENABLE;       // na - Choosing active High output
      int_config.int_pin_settg.edge_ctrl = BMI160_ENABLE;         // na - Choosing edge triggered output
      int_config.int_pin_settg.input_en = BMI160_DISABLE;         // na - Disabling interrupt pin to act as input
      int_config.int_pin_settg.latch_dur = BMI160_LATCH_DUR_NONE; // na - non-latched output
    
      int_config.int_type_cfg.acc_step_detect_int.min_threshold =                                 // ??????
      int_config.int_type_cfg.acc_step_detect_int.step_detector_en = BMI160_ENABLE;           // na - 1-enable, 0-disable the step detector
      int_config.int_type_cfg.acc_step_detect_int.step_detector_mode = BMI160_STEP_DETECT_NORMAL;  // na - Set Normal Mode
      int_config.int_type_cfg.acc_step_detect_int.step_min_buf =                                  // ??????
      int_config.int_type_cfg.acc_step_detect_int.steptime_min =                                 // ??????
    
      /* Set the Step Detector interrupt */
      rslt = bmi160_set_int_config(&int_config, dev); /* sensor is an instance of the structure bmi160_dev */
    
      if (rslt != BMI160_OK) {
        //printf("BMI160 Step Detector interrupt configuration failure!\n");
      } else {
        //printf("BMI160 Step Detector interrupt configuration done!\n");
      }
    }

     

    Thanks in advance

    Nick

    13 REPLIES 13
    Highlighted
    Community Moderator

    Re: BMX160 Step Detection

    Hello,

    The bit define of 0x7A and 0x7B registers were not publicly released, but in BMX160 data sheet it gave out recommened registers values for norma mode, sensitive mode, robust mode.

    step counter setting.JPG

     

    In sensor API, it could call BMX160_RETURN_FUNCTION_TYPE bmx160_set_step_mode(u8 v_step_mode_u8) function to set step counter configuration.

    /**************************************************/
    /**\name STEP CONFIGURATION SELECT MODE */
    /*************************************************/
    #define BMX160_STEP_CONFIG_NORMAL (0X315)
    #define BMX160_STEP_CONFIG_SENSITIVE (0X2D)
    #define BMX160_STEP_CONFIG_ROBUST (0X71D)

    Highlighted
    Senior Member

    Re: BMX160 Step Detection

    Hi BSTRobin and thank you for your promt responce.

    I am using the BMI160 API and there is not any bmi160_set_step_mode() function. I know that there is a dedicated BMX160 API but when I came in contact with the sales support/department they informed me that BMI160 & BMM150 APIs are still valid. So I have already implemented my firmware based on the BMI160 + BMM150 APIs and I will stuck to it.

    So, using the BMI160 API I have to use the bmi160_set_int_config() function passing as parameter an instance of the bmi160_int_settg structure.

    This is my configuration that was base on the integration details provided on BMI160 API

    Should I left min_threshold, step_min_buf, steptime_min to zero?

    void stepDetector_set(struct bmi160_dev *dev) {
    
      int8_t rslt = 0;
    
      /* Select the Interrupt channel/pin */
      int_config.int_channel = BMI160_INT_CHANNEL_1; // Interrupt channel/pin 1
    
      /* Select the Interrupt type */
      int_config.int_type = BMI160_STEP_DETECT_INT;
    
      /* Select the interrupt channel/pin settings */
      int_config.int_pin_settg.output_en = BMI160_ENABLE;         // na - Enabling interrupt pins to act as output pin
      int_config.int_pin_settg.output_mode = BMI160_DISABLE;      // na - Choosing push-pull mode for interrupt pin
      int_config.int_pin_settg.output_type = BMI160_ENABLE;       // na - Choosing active High output
      int_config.int_pin_settg.edge_ctrl = BMI160_ENABLE;         // na - Choosing edge triggered output
      int_config.int_pin_settg.input_en = BMI160_DISABLE;         // na - Disabling interrupt pin to act as input
      int_config.int_pin_settg.latch_dur = BMI160_LATCH_DUR_10_MILLI_SEC; // na - non-latched output
    
      int_config.int_type_cfg.acc_step_detect_int.min_threshold = 0;                              
      int_config.int_type_cfg.acc_step_detect_int.step_detector_en = BMI160_ENABLE;               // na - 1-enable, 0-disable the step detector
      int_config.int_type_cfg.acc_step_detect_int.step_detector_mode = BMI160_STEP_DETECT_NORMAL; 
      int_config.int_type_cfg.acc_step_detect_int.step_min_buf = 0;                               
      int_config.int_type_cfg.acc_step_detect_int.steptime_min = 0;                                
    
      /* Set the Step Detector interrupt */
      rslt = bmi160_set_int_config(&int_config, dev); /* sensor is an instance of the structure bmi160_dev */
    
      if (rslt != BMI160_OK) {
        //printf("BMI160 Step Detector interrupt configuration failure!\n");
      } else {
        //printf("BMI160 Step Detector interrupt configuration done!\n");
      }
    }

     

    This a snapshot from the BMI160 API

    Screenshot_49.png

    Nick

    Highlighted
    Community Moderator

    Re: BMX160 Step Detection

    Hello Nikosant03,

    bmi160_set_int_config() will call config_step_detect() function. If step_detector_mode was set as BMI160_STEP_DETECT_ROBUST, BMI160_STEP_DETECT_NORMAL, BMI160_STEP_DETECT_SENSITIVE, a set of recommended fixed values will be written to the register 0x7A, 0x7B.

    struct bmi160_int_settg int_cfg;
    int_cfg.int_type = BMI160_STEP_DETECT_INT;
    int_cfg.int_type_cfg.acc_step_detect_int.step_detector_en = BMI160_ENABLE;
    int_cfg.int_type_cfg.acc_step_detect_int.step_detector_mode = BMI160_STEP_DETECT_ROBUST;//BMI160_STEP_DETECT_NORMAL, BMI160_STEP_DETECT_SENSITIVE
    bmi160_set_int_config(&int_cfg, dev);

    /*!
    * @brief This API configure the step detector parameter.
    */
    static int8_t config_step_detect(const struct bmi160_acc_step_detect_int_cfg *step_detect_int_cfg,
    const struct bmi160_dev *dev)
    {
    int8_t rslt;
    uint8_t temp = 0;
    uint8_t data_array[2] = { 0 };

    if (step_detect_int_cfg->step_detector_mode == BMI160_STEP_DETECT_NORMAL)
    {
    /* Normal mode setting */
    data_array[0] = 0x15;
    data_array[1] = 0x03;
    }
    else if (step_detect_int_cfg->step_detector_mode == BMI160_STEP_DETECT_SENSITIVE)
    {
    /* Sensitive mode setting */
    data_array[0] = 0x2D;
    data_array[1] = 0x00;
    }
    else if (step_detect_int_cfg->step_detector_mode == BMI160_STEP_DETECT_ROBUST)
    {
    /* Robust mode setting */
    data_array[0] = 0x1D;
    data_array[1] = 0x07;
    }
    else if (step_detect_int_cfg->step_detector_mode == BMI160_STEP_DETECT_USER_DEFINE)
    {
    /* Non recommended User defined setting */
    /* Configuring STEP_CONFIG register */
    rslt = bmi160_get_regs(BMI160_INT_STEP_CONFIG_0_ADDR, &data_array[0], 2, dev);
    if (rslt == BMI160_OK)
    {
    temp = data_array[0] & ~BMI160_STEP_DETECT_MIN_THRES_MASK;

    /* Adding min_threshold */
    data_array[0] = temp | ((step_detect_int_cfg->min_threshold << 3) & BMI160_STEP_DETECT_MIN_THRES_MASK);
    temp = data_array[0] & ~BMI160_STEP_DETECT_STEPTIME_MIN_MASK;

    /* Adding steptime_min */
    data_array[0] = temp | ((step_detect_int_cfg->steptime_min) & BMI160_STEP_DETECT_STEPTIME_MIN_MASK);
    temp = data_array[1] & ~BMI160_STEP_MIN_BUF_MASK;

    /* Adding steptime_min */
    data_array[1] = temp | ((step_detect_int_cfg->step_min_buf) & BMI160_STEP_MIN_BUF_MASK);
    }
    }

    /* Write data to STEP_CONFIG register */
    rslt = bmi160_set_regs(BMI160_INT_STEP_CONFIG_0_ADDR, data_array, 2, dev);

    return rslt;
    }

    Highlighted
    Senior Member

    Re: BMX160 Step Detection

    Thank you for the clarifications!! I have configured and tested and I am able to detect steps.. However, I am facing the issue that when I move the sensor across the z-axis (let's say that this is a jump across z-axis) the IMU generates again an interrupt (thinks that this is a step).. I want to avoid this, otherwise the step detection would be misleading.. Any suggestions?

    Nick

    Icon--AD-black-48x48Icon--address-consumer-data-black-48x48Icon--appointment-black-48x48Icon--back-left-black-48x48Icon--calendar-black-48x48Icon--center-alignedIcon--Checkbox-checkIcon--clock-black-48x48Icon--close-black-48x48Icon--compare-black-48x48Icon--confirmation-black-48x48Icon--dealer-details-black-48x48Icon--delete-black-48x48Icon--delivery-black-48x48Icon--down-black-48x48Icon--download-black-48x48Ic-OverlayAlertIcon--externallink-black-48x48Icon-Filledforward-right_adjustedIcon--grid-view-black-48x48IC_gd_Check-Circle170821_Icons_Community170823_Bosch_Icons170823_Bosch_Icons170821_Icons_CommunityIC-logout170821_Icons_Community170825_Bosch_Icons170821_Icons_CommunityIC-shopping-cart2170821_Icons_CommunityIC-upIC_UserIcon--imageIcon--info-i-black-48x48Icon--left-alignedIcon--Less-minimize-black-48x48Icon-FilledIcon--List-Check-grennIcon--List-Check-blackIcon--List-Cross-blackIcon--list-view-mobile-black-48x48Icon--list-view-black-48x48Icon--More-Maximize-black-48x48Icon--my-product-black-48x48Icon--newsletter-black-48x48Icon--payment-black-48x48Icon--print-black-48x48Icon--promotion-black-48x48Icon--registration-black-48x48Icon--Reset-black-48x48Icon--right-alignedshare-circle1Icon--share-black-48x48Icon--shopping-bag-black-48x48Icon-shopping-cartIcon--start-play-black-48x48Icon--store-locator-black-48x48Ic-OverlayAlertIcon--summary-black-48x48tumblrIcon-FilledvineIc-OverlayAlertwhishlist