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.