Thingy53: how to enable bmi270 on board?

Hi community,

I need to get data from the BMI270 sensor that is on the Thingy:53 board. I have already taken some previous topics as reference but I still haven't been successful.
I would like to know how to enable and get data from the BMI270 via both I2C and SPI. I am using ncs-2.9.0.

Here is my main.c code:

#include <zephyr/kernel.h>
#include <zephyr/device.h>
#include <zephyr/drivers/sensor.h>
#include <zephyr/logging/log.h>
#include <zephyr/sys/printk.h>

LOG_MODULE_REGISTER(bmi270_sample, LOG_LEVEL_INF);

void main(void)
{
    const struct device *dev = DEVICE_DT_GET_ANY(bosch_bmi270);

    if (!device_is_ready(dev)) {
        LOG_ERR("Sensor BMI270 não está pronto.");
        return;
    }

    LOG_INF("Sensor BMI270 pronto.");

    // Força ativação de acelerômetro e giroscópio
    sensor_attr_set(dev, SENSOR_CHAN_ACCEL_XYZ, SENSOR_ATTR_FULL_SCALE, NULL);
    sensor_attr_set(dev, SENSOR_CHAN_ACCEL_XYZ, SENSOR_ATTR_SAMPLING_FREQUENCY, NULL);
    sensor_attr_set(dev, SENSOR_CHAN_GYRO_XYZ, SENSOR_ATTR_FULL_SCALE, NULL);
    sensor_attr_set(dev, SENSOR_CHAN_GYRO_XYZ, SENSOR_ATTR_SAMPLING_FREQUENCY, NULL);

    k_sleep(K_MSEC(100)); // tempo para estabilizar sensor

    while (1) {
        struct sensor_value accel_x, accel_y, accel_z;
        struct sensor_value gyro_x, gyro_y, gyro_z;

        if (sensor_sample_fetch(dev) < 0) {
            LOG_ERR("Erro ao obter amostra do sensor.");
            continue;
        }

        if (sensor_channel_get(dev, SENSOR_CHAN_ACCEL_X, &accel_x) < 0 ||
            sensor_channel_get(dev, SENSOR_CHAN_ACCEL_Y, &accel_y) < 0 ||
            sensor_channel_get(dev, SENSOR_CHAN_ACCEL_Z, &accel_z) < 0 ||
            sensor_channel_get(dev, SENSOR_CHAN_GYRO_X, &gyro_x) < 0 ||
            sensor_channel_get(dev, SENSOR_CHAN_GYRO_Y, &gyro_y) < 0 ||
            sensor_channel_get(dev, SENSOR_CHAN_GYRO_Z, &gyro_z) < 0) {
            LOG_ERR("Erro ao obter valores dos canais.");
            continue;
        }

        printf("Aceleração [m/s²]: X = %.2f | Y = %.2f | Z = %.2f\n",
               sensor_value_to_double(&accel_x),
               sensor_value_to_double(&accel_y),
               sensor_value_to_double(&accel_z));

        printf("Giroscópio [rad/s]: X = %.2f | Y = %.2f | Z = %.2f\n\n",
               sensor_value_to_double(&gyro_x),
               sensor_value_to_double(&gyro_y),
               sensor_value_to_double(&gyro_z));

        k_sleep(K_MSEC(500));
    }
}

my prj.conf code:

CONFIG_SPI=y
CONFIG_SENSOR=y
CONFIG_BMI270=y
CONFIG_LOG=y
CONFIG_NEWLIB_LIBC=y
CONFIG_NEWLIB_LIBC_FLOAT_PRINTF=y

I didn't need to create the .overlay. The code compiled, I got feedback from the sensor, but the data doesn't change. The result:

[00:00:00.097,167] <inf> bmi270_sample: Sensor BMI270 pronto.
Aceleração [m/s²]: X = 0.00 | Y = 0.00 | Z = 0.00
Giroscópio [rad/s]: X = 0.00 | Y = 0.00 | Z = 0.00

Aceleração [m/s²]: X = 0.00 | Y = 0.00 | Z = 0.00
Giroscópio [rad/s]: X = 0.00 | Y = 0.00 | Z = 0.00

Aceleração [m/s²]: X = 0.00 | Y = 0.00 | Z = 0.00
Giroscópio [rad/s]: X = 0.00 | Y = 0.00 | Z = 0.00

Aceleração [m/s²]: X = 0.00 | Y = 0.00 | Z = 0.00
Giroscópio [rad/s]: X = 0.00 | Y = 0.00 | Z = 0.00

I would like to know if there is a configuration or programming error.

I tried to apply the changes suggested in this topic, however I was unsuccessful.

 

Related