我用rtthread的sensor框架,添加rtt的BMI160软件包,发现读出来的加速度传感器值异常。
当板子平放在桌面上,静止不动,打印的log是
当板子垫一个U盘,使他倾斜一个角度,静止不动,打印的log是
感觉像是陀螺仪的数据而不是加速度的。
代码如下
int bmx160_port(void)
{
struct rt_sensor_config cfg;
cfg.intf.dev_name = “i2c3”;
cfg.intf.user_data = (void *)0x68;
cfg.irq_pin.pin = RT_PIN_NONE;
cfg.irq_pin.mode = PIN_MODE_INPUT_PULLDOWN;
rt_hw_bmx160_init(“bmi160”, &cfg);
return 0;
}
static void sensor_show_data(rt_size_t num, rt_sensor_t sensor, struct rt_sensor_data *sensor_data)
{
switch (sensor->info.type)
{
case RT_SENSOR_CLASS_ACCE:
rt_kprintf(“num:%3d, x:%5d, y:%5d, z:%5d, timestamp:%5d\n”, num, sensor_data->data.acce.x, sensor_data->data.acce.y, sensor_data->data.acce.z, sensor_data->timestamp);
break;
case RT_SENSOR_CLASS_GYRO:
rt_kprintf(“num:%3d, x:%8d, y:%8d, z:%8d, timestamp:%5d\n”, num, sensor_data->data.gyro.x, sensor_data->data.gyro.y, sensor_data->data.gyro.z, sensor_data->timestamp);
break;
case RT_SENSOR_CLASS_MAG:
rt_kprintf(“num:%3d, x:%5d, y:%5d, z:%5d, timestamp:%5d\n”, num, sensor_data->data.mag.x, sensor_data->data.mag.y, sensor_data->data.mag.z, sensor_data->timestamp);
break;
case RT_SENSOR_CLASS_HUMI:
rt_kprintf(“num:%3d, humi:%3d.%d%%, timestamp:%5d\n”, num, sensor_data->data.humi / 10, sensor_data->data.humi % 10, sensor_data->timestamp);
break;
case RT_SENSOR_CLASS_TEMP:
rt_kprintf(“num:%3d, temp:%3d.%dC, timestamp:%5d\n”, num, sensor_data->data.temp / 10, sensor_data->data.temp % 10, sensor_data->timestamp);
break;
case RT_SENSOR_CLASS_BARO:
rt_kprintf(“num:%3d, press:%5d, timestamp:%5d\n”, num, sensor_data->data.baro, sensor_data->timestamp);
break;
case RT_SENSOR_CLASS_STEP:
rt_kprintf(“num:%3d, step:%5d, timestamp:%5d\n”, num, sensor_data->data.step, sensor_data->timestamp);
break;
default:
break;
}
}
int main(void)
{
rt_device_t dev = RT_NULL;
rt_size_t res, i=0;
struct rt_sensor_data data;
rt_thread_mdelay(1000);
bmx160_port();
/* 查找系统中的传感器设备 */
dev = rt_device_find(“acce_bmi”);
if (dev == RT_NULL){
rt_kprintf(“Can’t find device\n”);
return 0;
}
/* 以轮询模式打开传感器设备 */
if (rt_device_open(dev, RT_DEVICE_FLAG_RDONLY) != RT_EOK){
rt_kprintf("open device failed!");
return 0;
}
while (1){
rt_thread_mdelay(1000);
/* 从传感器读取一个数据 */
res = rt_device_read(dev, 0, &data, 1);
if (res != 1){
rt_kprintf("read data failed!size is %d\r\n", res);
}
else{
sensor_show_data(i, (rt_sensor_t)dev, &data);
}
}
}
更多回帖