Gyroscope

Gyroscopes, or gyros, are devices that measure or maintain rotational motion. The units of angular velocity are measured in degrees per second (°/s) or revolutions per second (RPS). Angular velocity is simply a measurement of speed of rotation.

MetaWear RG, RPro, C, MMR, MMC, MTR, and CPro come with a Bosch BMI160 6-axis IMU. The gyro functionality of this sensor is accessed by the functions in the gyro_bmi160.h header file.

Configuration

The gyro’s data sampling rate and the range/resolution of the angular velocity are controlled by theoutput data rate and sampling range respectively. After selecting the desired settings in the API, call mbl_mw_gyro_bmi160_write_config. to write the chnges to the sensor.

// Set ODR to 50Hz
MetaWear.mbl_mw_gyro_bmi160_set_odr(board, MBL_MW_GYRO_BMI160_ODR_50HZ);

// Set data range to +/125 degrees per second
MetaWear.mbl_mw_gyro_bmi160_set_range(board, MBL_MW_GYRO_BMI160_FSR_125DPS);

// Write the changes to the sensor
MetaWear.mbl_mw_gyro_bmi160_write_config(board);

Rotation Rate Sampling

Rotate rate sampling measures the rate of change of the pitch, yaw, and roll angles, in other words, the angular velocity of the spin around the XYZ axes. To enable rotation rate sampling, call mbl_mw_gyro_bmi160_enable_rotation_sampling before starting the gyro.

Angular velocity is represented by the MblMwCartesianFloat struct and is in units of degrees per second. The x, y, and z fields contain the angular velocity of the spin around that axis.

let gyro = MetaWear.mbl_mw_gyro_bmi160_get_rotation_data_signal(device.board);

MetaWear.mbl_mw_datasignal_subscribe(gyro, ref.NULL, MetaWear.FnVoid_VoidP_DataP.toPointer((ctx, pointer) => {
    var data = pointer.deref();
    var value = data.parseValue();
    console.log('epoch: ' + data.epoch + ' gyro: ' + value.x + ' ' + value.y + ' ' + value.z)
}))

MetaWear.mbl_mw_gyro_bmi160_enable_rotation_sampling(device.board);
MetaWear.mbl_mw_gyro_bmi160_start(device.board);

High Frequency Stream

Firmware v1.2.3+ contains a packed mode for the hyro which combines 3 rotation 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_gyro_bmi160_get_rotation_data_signal function and is only for streaming; do not use it with data processing or logging.

let gyro = MetaWear.mbl_mw_gyro_bmi160_get_rotation_data_signal(device.board);

MetaWear.mbl_mw_gyro_bmi160_set_odr(device.board, 200);

MetaWear.mbl_mw_datasignal_subscribe(gyro, ref.NULL, MetaWear.FnVoid_VoidP_DataP.toPointer((ctx, pointer) => {
    var data = pointer.deref();
    var value = data.parseValue();
    console.log('epoch: ' + data.epoch + ' gyro: ' + value.x + ' ' + value.y + ' ' + value.z)
}))

MetaWear.mbl_mw_gyro_bmi160_enable_rotation_sampling(device.board);
MetaWear.mbl_mw_gyro_bmi160_start(device.board);