.. highlight:: cpp Accelerometer ============= All boards come with an accelerometer. The specific accelerometer model varies amongst the boards, howevever the API provides accelerometer agnostic functions in the `accelerometer.h `_ header file that can be safely used with all supported accelerometers. Users can check which accelerometer is on their board at runtime to determine the appropriate accelerometer specific functions they need to use, if necessary. :: #include "metawear/core/module.h" #include "metawear/sensor/accelerometer_bosch.h" #include "metawear/sensor/accelerometer_mma8452q.h" void check_acc_type(MblMwMetaWearBoard* board) { auto acc_type= mbl_mw_metawearboard_lookup_module(board, MBL_MW_MODULE_ACCELEROMETER); switch(acc_type) { case MBL_MW_MODULE_TYPE_NA: // should never reach this case statement printf("No accelerometer on this board\n"); break; case MBL_MW_MODULE_ACC_TYPE_MMA8452Q: printf("Acc Type = MMA8452Q\n"); break; case MBL_MW_MODULE_ACC_TYPE_BMI160: printf("Acc Type = BMI160\n"); break; case MBL_MW_MODULE_ACC_TYPE_BMA255: printf("Acc Type = BMA255\n"); break; default: printf("Unknown type\n"); break; } Acceleration Sampling --------------------- Acceleration sampling measures the current acceleration forces at periodic intervals. To enable acceleration sampling, call `mbl_mw_acc_enable_acceleration_sampling `_ before starting the accelerometer. Linear acceleration is represented with the `MblMwCartesianFloat `_ struct and the values are in units of Gs. The ``x``, ``y``, and ``z`` fields contain the acceleration in that direction. :: #include "metawear/core/datasignal.h" #include "metawear/core/types.h" #include "metawear/sensor/accelerometer.h" void enable_acc_sampling(MblMwMetaWearBoard* board) { auto data_handler = [](const MblMwData* data) -> void { // Cast value to MblMwCartesianFloat* auto acceleration = (MblMwCartesianFloat*) data->value; printf("(%.3fg, %.3fg, %.3fg)\n", acceleration->x, acceleration->y, acceleration->z); }; auto acc_signal= mbl_mw_acc_get_acceleration_data_signal(board); mbl_mw_datasignal_subscribe(acc_signal, data_handler); mbl_mw_acc_enable_acceleration_sampling(board); mbl_mw_acc_start(board); } Configuration ^^^^^^^^^^^^^ Users can configure the output data rate and the sampling range; these parameters control the sampling rate and the data range and resolution respectively. After configuring the settings, call `mbl_mw_acc_write_acceleration_config `_ to write the configuration to the sensor. :: #include "metawear/sensor/accelerometer.h" void configure_acc(MblMwMetaWearBoard* board) { // Set ODR to 25Hz or closest valid frequency mbl_mw_acc_set_odr(board, 25.f); // Set range to +/-4g or closest valid range mbl_mw_acc_set_range(board, 4.f); // Write the config to the sensor mbl_mw_acc_write_acceleration_config(board); } High Frequency Stream ^^^^^^^^^^^^^^^^^^^^^ Firmware v1.2.3+ contains a packed mode for the accelerometer which combines 3 acceleration data samples into 1 ble packet allowing the board to stream data at a throughput higher than 100Hz. This special data signal is retrieved from the `mbl_mw_acc_get_high_freq_acceleration_data_signal `_ function and is only for streaming; do not use it with data processing or logging. :: auto high_freq_signal= mbl_mw_acc_get_high_freq_acceleration_data_signal(board); mbl_mw_datasignal_subscribe(high_freq_signal, [](const MblMwData* data) -> void { // Cast value to MblMwCartesianFloat* auto acceleration = (MblMwCartesianFloat*) data->value; printf("(%.3fg, %.3fg, %.3fg)\n", acceleration->x, acceleration->y, acceleration->z); }); mbl_mw_acc_set_odr(board, 200.f); mbl_mw_acc_enable_acceleration_sampling(board); mbl_mw_acc_start(board); Step Counter ------------ The BMI160 accelerometer comes with a built in step counter. It has three operation modes that configure the sensitivity and robustness of the counter: ========= ============================================================================================== Mode Description ========= ============================================================================================== Normal Balanced between false positives and false negatives, recommended for most applications Sensitive Few false negatives but eventually more false positives, recommended for light weighted people Robust Few false positives but eventually more false negatives ========= ============================================================================================== When you have set the operation mode, call `mbl_mw_acc_bmi160_write_step_counter_config `_ to save the configuration to the board. :: #include "metawear/sensor/accelerometer_bosch.h" mbl_mw_acc_bmi160_set_step_counter_mode(board, MBL_MW_ACC_BMI160_STEP_COUNTER_MODE_SENSITIVE); mbl_mw_acc_bmi160_write_step_counter_config(board); Reading The Counter ^^^^^^^^^^^^^^^^^^^ One way to retrieve step counts is to periodcally read the step counter. To read the step counter, call `mbl_mw_datasignal_read `_ with the step counter data signal. The counter is not enabled by default so you will need enable it by calling `mbl_mw_acc_bmi160_enable_step_counter `_ when configuring the board. :: // enable the counter mbl_mw_acc_bmi160_enable_step_counter(board); mbl_mw_acc_bmi160_write_step_counter_config(board); mbl_mw_acc_start(board); // read step counter auto step_counter= mbl_mw_acc_bmi160_get_step_counter_data_signal(board); mbl_mw_datasignal_subscribe(step_counter, [](const MblMwData* data) -> void { printf("steps= %d\n", *((uint32_t*) data->value)); }); mbl_mw_datasignal_read(adc_signal); Using The Detector ^^^^^^^^^^^^^^^^^^ Alternatively, you can receive notifications for each step detected by calling `mbl_mw_acc_bmi160_enable_step_detector `_ instead. :: auto detector= mbl_mw_acc_bmi160_get_step_detector_data_signal(board); mbl_mw_datasignal_subscribe(detector, [](const MblMwData* data) -> void { printf("step detected\n"); }); mbl_mw_acc_bmi160_enable_step_detector(board); mbl_mw_acc_bosch_start(board);