This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

nrf52833 BMI270 IMU sample output seems wrong

Nrf52833DK with bmi 270 sample (zephyr/samples/bmi270).

The data has always been odd

ACC data is too high & Gyro data is too low. The Gyro data flips between -1.99 and 0 while sitting stationary...

 0.360338 -4.770722 -10.803591 0.002396 -1.995473 0.009055
 0.358542 -4.786884 -10.823344 -1.979760 0.018110 0.000266
 0.366324 -4.810228 -10.831125 -1.992543 0.004527 0.004793
 0.381886 -4.793468 -10.839505 -1.993609 0.005859 0.004527
 0.346571 -4.764737 -10.770670 0.015180 -1.981091 0.013848
 0.337592 -4.763540 -10.783839 -1.995473 0.002396 0.006391
 0.348366 -4.769525 -10.800598 0.003728 -1.996538 0.007457
 0.359141 -4.773715 -10.798204 0.010386 -1.988282 0.010386
 0.344775 -4.753963 -10.747326 0.017311 -1.977097 0.015979
 0.339987 -4.760547 -10.794613 0.006924 -1.992011 0.009321
 0.345374 -4.771321 -10.821548 -1.994674 0.001597 0.005859
 1.004398 -2.345557 -10.461809 0.000532 -1.738470 0.675930
 -1.707899 -13.749095 -3.770332 -1.654578 -1.520084 -1.389053
 2.729473 0.405829 -8.105478 0.123041 -2.347459 7.974544
 6.067690 8.081275 -10.885595 -2.647873 2.707185 7.334567
 -9.189070 -15.927651 -8.346103 1.256783 -2.291797 5.264430
 7.710163 10.682056 -10.482758 0.550492 -1.797594 -7.793582

Is there a way to change

sensor_channel_get(dev, SENSOR_CHAN_ACCEL_XYZ, acc);

So that it does not run the math to change the values to m/s2? I just want the hex value from the memory location.

Please, also, help with what the new fprint would look like if that changed:

		struct sensor_value acc[3], gyr[3];
		// struct sensor_value temperature;
		sensor_sample_fetch(dev);

		sensor_channel_get(dev, SENSOR_CHAN_ACCEL_XYZ, acc);
		sensor_channel_get(dev, SENSOR_CHAN_GYRO_XYZ, gyr);
		// sensor_channel_get(dev, SENSOR_CHAN_AMBIENT_TEMP, &temperature);

		printf(" %d.%06d %d.%06d %d.%06d %d.%06d %d.%06d %d.%06d \n",
		       acc[0].val1, acc[0].val2,
		       acc[1].val1, acc[1].val2,
		       acc[2].val1, acc[2].val2,
		       gyr[0].val1, gyr[0].val2,
		       gyr[1].val1, gyr[1].val2,
		       gyr[2].val1, gyr[2].val2); 
}

Main C.

/*
 * Copyright (c) 2021 Bosch Sensortec GmbH
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <zephyr.h>
#include <drivers/sensor.h>
#include <stdio.h>
#include <sys/printk.h>
#include <device.h>
#include <devicetree.h>
#include <drivers/gpio.h>

/* The devicetree node identifier for the "led0" alias. */
#define LED0_NODE DT_ALIAS(led0)

#if DT_NODE_HAS_STATUS(LED0_NODE, okay)
#define LED0	DT_GPIO_LABEL(LED0_NODE, gpios)
#define PIN	DT_GPIO_PIN(LED0_NODE, gpios)
#define FLAGS	DT_GPIO_FLAGS(LED0_NODE, gpios)
#else
/* A build error here means your board isn't set up to blink an LED. */
#error "Unsupported board: led0 devicetree alias is not defined"
#define LED0	""
#define PIN	0
#define FLAGS	0
#endif

struct k_work my_work;
struct k_timer my_timer;
const struct device *dev;
bool led_is_on = true;

struct sensor_value full_scale, sampling_freq, oversampling;

void my_work_handler(struct k_work *work)
{
    // printk("Timer triggered !!!!\n");
	// gpio_pin_set(dev, PIN, (int)led_is_on);
	// led_is_on = !led_is_on;
		struct sensor_value acc[3], gyr[3];
		// struct sensor_value temperature;
		sensor_sample_fetch(dev);

		sensor_channel_get(dev, SENSOR_CHAN_ACCEL_XYZ, acc);
		sensor_channel_get(dev, SENSOR_CHAN_GYRO_XYZ, gyr);
		// sensor_channel_get(dev, SENSOR_CHAN_AMBIENT_TEMP, &temperature);

		printf(" %d.%06d %d.%06d %d.%06d %d.%06d %d.%06d %d.%06d \n",
		       acc[0].val1, acc[0].val2,
		       acc[1].val1, acc[1].val2,
		       acc[2].val1, acc[2].val2,
		       gyr[0].val1, gyr[0].val2,
		       gyr[1].val1, gyr[1].val2,
		       gyr[2].val1, gyr[2].val2); 
}
K_WORK_DEFINE(my_work, my_work_handler);
	
void my_expiry_function(struct k_timer *timer_id) {
	k_work_submit(&my_work);
};
K_TIMER_DEFINE(my_timer, my_expiry_function, NULL);


void main(void)
{

	dev = device_get_binding(DT_LABEL(DT_INST(0, bosch_bmi270)));
	if (dev == NULL) {
		printf("Could not get %s device\n",
		       DT_LABEL(DT_INST(0, bosch_bmi270)));
		return;
	}

	printf("Device %p name is %s\n", dev,
	       DT_LABEL(DT_INST(0, bosch_bmi270)));

	/* Setting scale in G, due to loss of precision if the SI unit m/s^2
	 * is used
	 */
	full_scale.val1 = 2;            /* G */
	full_scale.val2 = 0;
	sampling_freq.val1 = 100;       /* Hz. Performance mode */
	sampling_freq.val2 = 0;
	oversampling.val1 = 1;          /* Normal mode */
	oversampling.val2 = 0;

	sensor_attr_set(dev, SENSOR_CHAN_ACCEL_XYZ, SENSOR_ATTR_FULL_SCALE,
			&full_scale);
	sensor_attr_set(dev, SENSOR_CHAN_ACCEL_XYZ, SENSOR_ATTR_OVERSAMPLING,
			&oversampling);
	/* Set sampling frequency last as this also sets the appropriate
	 * power mode. If already sampling, change to 0.0Hz before changing
	 * other attributes
	 */
	sensor_attr_set(dev, SENSOR_CHAN_ACCEL_XYZ,
			SENSOR_ATTR_SAMPLING_FREQUENCY,
			&sampling_freq);


	/* Setting scale in degrees/s to match the sensor scale */
	full_scale.val1 = 500;          /* dps */
	full_scale.val2 = 0;
	sampling_freq.val1 = 100;       /* Hz. Performance mode */
	sampling_freq.val2 = 0;
	oversampling.val1 = 1;          /* Normal mode */
	oversampling.val2 = 0;

	sensor_attr_set(dev, SENSOR_CHAN_GYRO_XYZ, SENSOR_ATTR_FULL_SCALE,
			&full_scale);
	sensor_attr_set(dev, SENSOR_CHAN_GYRO_XYZ, SENSOR_ATTR_OVERSAMPLING,
			&oversampling);
	/* Set sampling frequency last as this also sets the appropriate
	 * power mode. If already sampling, change sampling frequency to
	 * 0.0Hz before changing other attributes
	 */
	sensor_attr_set(dev, SENSOR_CHAN_GYRO_XYZ,
			SENSOR_ATTR_SAMPLING_FREQUENCY,
			&sampling_freq);

/* 	int ret;

	dev = device_get_binding(LED0);
	if (dev == NULL) {
		return;
	}

	ret = gpio_pin_configure(dev, PIN, GPIO_OUTPUT_ACTIVE | FLAGS);
	if (ret < 0) {
		return;
	} */

	k_timer_start(&my_timer, K_MSEC(1000), K_MSEC(1000));
}

prj.conf

CONFIG_STDOUT_CONSOLE=y
CONFIG_I2C=y
CONFIG_SENSOR=y
CONFIG_BMI270=y

app.overlay

/*
 * Copyright (c) 2021 Bosch Sensortec GmbH
 *
 * SPDX-License-Identifier: Apache-2.0
 */

&arduino_i2c {
	status = "okay";

	bmi270@68 {
		compatible = "bosch,bmi270";
		reg = <0x68>;
		label = "BMI270";
	};
};

Parents Reply Children
  • Hi there,

    I think it's best that you contact the people that wrote the driver over at the Zephyr GitHub repository. The driver is external and is not written by us. The conversion is happening inside the driver. If you want to omit the conversion then you need to modify the driver somehow, which I can't really help you with as we didn't write it in the first place. 

    Maybe someone else on this forum has experience with this driver or a better suggestion. 

    regards

    Jared 

Related