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.