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";
};
};