树梅派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
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的数据,看起来数据应该都是比较准确的。感谢****广大牛人的博客,接下来计划对该代码改写,用spi驱动读取mpu9250的数据。