RT_Thread sensor框架下的MPU6050,IIC读取
2023年7 月 10日 RT-Thread Studio 版本: 2.2.6 可用
这是一个小白测试用记录,大佬互喷,欢迎指出问题
整体来说,只有一个find找名字是个坑
建立工程
略,后续补充
屏蔽cubemax生成的代码
略,后续补充
打开需要的片上外设
略,后续补充
使用rt_thread settings添加mpu6050软件包
略,后续补充
如何启动程序
添加6050后会在packges包出现mpu6xxx-v1.1.1
打开README_ZH.md
在文章中会有这么一段程序
初始化示例
#include "sensor_inven_mpu6xxx.h"
int rt_hw_mpu6xxx_port(void)
{
struct rt_sensor_config cfg;
cfg.intf.dev_name = "i2c1";
cfg.intf.user_data = (void *)MPU6XXX_ADDR_DEFAULT;
cfg.irq_pin.pin = RT_PIN_NONE;
rt_hw_mpu6xxx_init("mpu", &cfg);
return 0;
}
INIT_APP_EXPORT(rt_hw_mpu6xxx_port);
将这一段代码添加到main函数之前
main函数中不需要启动,因为INIT_APP_EXPORT这个函数是自启动,需要了解可用bing一下,有文章讲解很详细,这里只做应用
下一步应当要读取MPU6050的值,但在此之前,先下载程序,在终端中查看是否有6050这个设备
终端中查看find要的name
这里取用了一个投机取巧的办法,自己不太会这个rt_thread sensor ,在初始化中,并不清楚自己初始化的函数为哪一个,导致使用官方的
rt_device_t rt_device_find(const char name);*
查找代码时,一直找不到 const char name我一直以为我的设备名称为
rt_hw_mpu6xxx_init(“mpu”, &cfg); 中的 “mpu”,但实际上并不是,这个 const char name 名字需要在终端中查看
终端这里输入list_device 在终端中会弹出已经注册好的三个mpu函数 分别为 mag_mpu,
gyro_mpu和acce_mpu三个函数,可以看到type中显示为sensor Device 复制下来这三个函数。
在main函数中 代码中添加一个做测试
#define SENSOR_DEVICE_NAME "gyro_mpu" /* 传感器设备名称 */
rt_device_t dev; /* 传感器设备句柄 */
/* 根据设备名称查找传感器设备,获取设备句柄 */
dev= rt_device_find(SENSOR_DEVICE_NAME);
if (dev==RT_NULL) {
printf("MPU6050_find file.....\n");
return -RT_ERROR;
}
此时find函数已经完成
OPEN 6050
此时照着RT的文档中心看就可以,这里直接抄过来,添加到main函数中
rt_device_open(dev, RT_DEVICE_FLAG_RDONLY);//这里是以轮询的方式进行读取
读取6050
rt_device_read(dev, 0, &data, 1)
打印出数据
rt_kprintf("acce: x:%5d, y:%5d, z:%5d, timestamp:%5d\n", data.data.acce.x, data.data.acce.y, data.data.acce.z, data.timestamp);
最终main中是怎么样的
这里直接把文档中心的代码抄过来,现在就可以直接读取到数据了
#define SAMPLE_SENSOR_NAME "gyro_mpu" /* 传感器设备名称 */
#include "sensor_inven_mpu6xxx.h"
int rt_hw_mpu6xxx_port(void)
{
struct rt_sensor_config cfg;
cfg.intf.dev_name = "i2c1";
cfg.intf.user_data = (void *)MPU6XXX_ADDR_DEFAULT;
cfg.irq_pin.pin = RT_PIN_NONE;
rt_hw_mpu6xxx_init("mpu", &cfg);
return 0;
}
INIT_APP_EXPORT(rt_hw_mpu6xxx_port)
int main(void)
{
rt_device_t dev;
struct rt_sensor_data data;
/* 查找传感器设备 */
dev = rt_device_find(SAMPLE_SENSOR_NAME);
/* 以只读及轮询模式打开传感器设备 */
rt_device_open(dev, RT_DEVICE_FLAG_RDONLY);
if (rt_device_read(dev, 0, &data, 1) == 1)
{
rt_kprintf("acce: x:%5d, y:%5d, z:%5d, timestamp:%5d\n", data.data.acce.x, data.data.acce.y, data.data.acce.z, data.timestamp);
}
rt_device_close(dev);//如果是要一直读取,将if加入while中 屏蔽掉close这个代码
return RT_EOK;
}
在这里只添加了一个函数,想要读取其他值应该要添加其他两个?
不通过sensor框架直接读取mpu6050数据
https://github.com/RT-Thread-packages/mpu-6xxx
在这个文档里面,但感觉不添加到sensor框架,那不是移植的时候变得更麻烦了?复制使用过了,没有问题可以直接使用。