树梅派linux编成,i2c读取mpu9250数据

最近刚买了块树梅派3b,打算重新玩下linux驱动等,正好身边有mpu9250模块,用来研究正好。

操作环境:

1.PC:FEDORA28

2.交叉编译环境

3.树莓派3b,并且系统为linux

4.mpu9250模块

5.MotionSensorExample

以上的第五点就是在github上的一份案例代码,修改一部分就可以用。

main函数在main.c,lib–I2Cdev是i2c读取的一些底层函数,不需要动这里,主要是在inv_mpu_lib目录下的inv_mpu.c,修改的主要是这里。

修改Makefile,尝试编译

先看MontionSensor目录下的Makefile

扫描二维码关注公众号,回复: 5605123 查看本文章
CXX=arm-linux-gnueabihf-g++
AR=arm-linux-gnueabihf-ar
CXXFLAGS=-Wall   -g -O2
CXX_OPTS=-c -DMPU9250 -DMPU_DEBUG -I../libs/
省略无关代码

我用的模块是9250,所以DMPU9250 -DMPU_DEBUG,这里做出修改,如果你的是6050,就改成相应的数字。编译顺利。但是放到派上,出现了MPU init failed!经过追踪,错误是在下面的代码里。

#elif defined MPU6500
#define MPU6500_MEM_REV_ADDR    (0x17)
    if (mpu_read_mem(MPU6500_MEM_REV_ADDR, 1, &rev))
        return 1;
    if (rev == 0x1)
        st.chip_cfg.accel_half = 0;
    else
    {
#if defined MPU_DEBUG
        printf_P("Unsupported software product rev. %d.\r\n", rev);
#endif
        return 1;
    }
 
    /* MPU6500 shares 4kB of memory between the DMP and the FIFO. Since the
     * first 3kB are needed by the DMP, we'll use the last 1kB for the FIFO.
     */
    data[0] = BIT_FIFO_SIZE_1024 | 0x8;
    if (i2c_write(st.hw->addr, st.reg->accel_cfg2, 1, data))
        return 1;
#endif

这里看不出到底有必要,于是将代码注释之后,顺利运行。
在这里插入图片描述

int main() {
    char sql[512] ; //插入数据库语句
    int ret;
    int insert;
    ret = sqlite3_open("mpu9250.db", &db);
    if(ret)
    {
        printf("can not open database.\n");
    }
    else
    {
        printf("open database succsee.\n");
    }

   int i  = 0;
	ms_open();
    while(i < 5000){
        ms_update();
        sprintf(sql,"insert into mpu9250 values (%d,%2.1f,%2.1f, %2.1f, %2.1f, %2.1f, %2.1f);", i, ypr[YAW] ,ypr[PITCH], ypr[ROLL],compass[0],compass[1],compass[2]);
        insert =  sqlite3_exec(db, sql, 0, 0, &errmsg);//插入
        printf("index= %d\tyaw = %2.1f\tpitch = %2.1f\troll = %2.1f\ttemperature = %2.1f\tcompass = %2.1f, %2.1f, %2.1f\n", i,ypr[YAW], ypr[PITCH],ypr[ROLL],temp,compass[0],compass[1],compass[2]);
        delay_ms(5);
        i++;
    }
    sqlite3_close(db);
	return 0;
}

为了测试获取到的数据是否准确,特地增加了数据库保存了5000条数据,并对数据进行作图看有什么效果。
在这里插入图片描述这是磁力计AK8963的数据,看起来数据应该都是比较准确的。感谢CSDN广大牛人的博客,接下来计划对该代码改写,用spi驱动读取mpu9250的数据。

猜你喜欢

转载自blog.csdn.net/weixin_42866931/article/details/84886114
今日推荐