Firefly开源社区

12
发表新贴

ROC-RK3308-CC开发实例总结--MPU6050运动处理传感器模块调试

166

积分

1

威望

0

贡献

技术小白

积分
166
发表于 2019-2-16 15:11:28     
本帖最后由 飞神 于 2019-4-9 14:12 编辑

传感器介绍
       MPU60X0是invenSence公司的一款全球首例9轴运动处理传感器。它内部集成了3轴MEMS陀螺仪和3轴MEMS加速度计,同时可以通过I2C接口(注意这个接口是XDA、XCL,而开发板与MPU6050通信的接口是SDA、SCL)连接一个第三方的数据传感器,比如说磁力计,扩展成9轴数据输出。MPU6050内置1024字节的fifo缓冲区,可编程的加速度范围和陀螺仪范围,可编程的中断,使用400khz快速模式的i2c通信。对于MPU6050这款传感器的介绍,更详细的可参考手册和度娘,这款传感器很经典,网上的资料特别多。
        MPU6050这款传感器应用场合非常多,如果你仔细观察,你会发现我们身边也有许多它的影子。如下


无人机


3.png


平衡车
2.png
运动手环
5.png

vr眼镜
4.png


每天刷的步数(也是依赖手机的陀螺仪传感器)
1.png

驱动mpu6050的方式

        看完上边花里胡哨的图片后,想必您对这款传感器不陌生了,现在我开始说如何在ROC-RK3308-CC开发板上轻松简单的实现设备的驱动,MPU6050作为一款经典而且性能非常强大的传感器,在RK3308的SDK中可以用多种方式去驱动,我在这简单总结一下,如下

1.纯粹自己写
      这种方式就是自己通过i2c的接口函数去配置传感器的寄存器,然后在某一个条件去获取传感器的数据,进而将数据上报到用户层,在该论坛里就有贴子实现过,感兴趣的可自行搜索。
2.使用Rockchip的传感器框架来写
      Rockchip的传感器框架在linux/kernel/drivers/input/sensors目录下,具体参考相应的文档去实现该驱动。
3.使用invenSence自身的驱动代码(无需自己写驱动)
      本帖就是使用这种方式去实现,看下文。

如何使用invensense自身的驱动

         ROC-RK3308的SDK中已经集成了invenSense厂商的驱动代码,因此我们无需再去写驱动代码,只需要完成设备树的适配就可以驱动相应的设备,invenSense的驱动框架源码目录如下    

  1. linux/kernel/drivers/staging/iio/imu/inv_mpu
复制代码
其实这个invenSense的驱动框架是与安卓的Hal层配合使用的,那么既然Hal层能获取数据,那么我们Linux的用户层也一样能拿到数据。

下面我们一步一步来实现适配。
      
1.设备树的适配

既然驱动代码都已经有了,那么我们就可以按照官方的驱动代码去填写我们的设备树,设备树进行如下配置:
  1. &i2c1 {
  2.     clock-frequency = <400000>;
  3.     status = "okay";

  4. mpu6050: mpu@68 {   
  5.              compatible = "invensense,mpu6050";
  6.              reg = <0x68>;
  7.              mpu-int_config = <0>;
  8.              mpu-level_shifter = <0>;
  9.              mpu-orientation = <1 0 0 0 1 0 0 0 1>;
  10.              orientation-x= <1>;
  11.              orientation-y= <0>;
  12.              orientation-z= <0>;
  13.              irq-gpio = <&gpio0 RK_PB7 IRQ_TYPE_LEVEL_LOW>;
  14.              mpu-debug = <1>;
  15.              status = "okay";
  16.          };  
  17. };

复制代码
参数含义(很重要!!
compatible必须是"invensense,mpu6050"
reg = <0x68>;这个是i2c从设备地址,这个地址取值mpu6050的ADO脚,它接地就是0x68,它拉高就是0x69
irq-gpio = <&gpio0 RK_PB7 IRQ_TYPE_LEVEL_LOW>;这个就是mpu6050的int脚接的中断口,必须要接中断才能获取设备数据。
mpu-int_config = <0>;是中断使能配置寄存器的值(如果扩展成9轴,那么这个参数还会作用于中断引脚配置寄存器),填0即可,因为内部驱动代码会帮你开相应中断。
这里额外要注意,比如如果要填0x10的话,那么这样填写mpu-int_config = <0x10000000>或者mpu-int_config = /bits/ 8 <0x10>; 。
mpu-orientation=<1 0 0 0 1 0 0 0 1>;是设备的3*3的方向矩阵
orientation-x= <1>;//代表取反
orientation-y= <0>;
orientation-z= <0>;
根据你实际的layout进行配置方向矩阵,这部分的信息可通过sysfs文件系统的接口获取,进而实现你的设备layout

到这里也许你会问,我就想获取一些数据而已,怎么搞那么多的参数,我不配置那么多行不行?
答案是不行的,要么就自己去改源码咯。因为在probe函数里遍历设备树的驱动代码如果没有匹配到这些选项就会立即报错退出。


2.make menuconfig的选配

打开驱动目录下的Kconfig
  1. linux/kernel/drivers/staging/iio/imu/inv_mpu/Kconfig
复制代码
从文件中可以看出,要想用invenSense的驱动框架,必须将相应的依赖项选配上。
  1. config INV_MPU_IIO
  2.     tristate "Invensense MPU devices"
  3.     depends on I2C && SYSFS && IIO && IIO_KFIFO_BUF && IIO_TRIGGER && !INV_MPU
  4.     default n
  5.     help
  6.       This driver supports the Invensense MPU devices.
  7.       This includes MPU6050/MPU3050/MPU9150/ITG3500/MPU6500/MPU9250.
  8.       This driver can be built as a module. The module will be called
  9.       inv-mpu-iio.

复制代码
将编译好的新内核烧录进开发板中,将会出现三个文件
  1. /dev/iio:device0
  2. /sys/bus/iio/devices/iio:device0
  3. /sys/bus/iio/devices/trigger0
复制代码


3.配置sysfs和获取传感器数据

如果上述操作成功,那么在/sys/bus/iio/devices/iio\:device0/目录下将会生成这些文件
6.png
这些文件就是启动参数的配置文件,这些文件的含义具体是什么属性,我就不逐一介绍了,更详细的参考附件的文档,在用户层我们进行以下配置就可以获取加速度和角速度的数据,代码如下
  1.     //配置sysfs文件系统的启动参数
  2.     system("echo 1 > /sys/bus/iio/devices/iio:device0/accl_enable ");
  3.     system("echo 1 > /sys/bus/iio/devices/iio:device0/gyro_enable ");
  4.     system("echo 1 > /sys/bus/iio/devices/iio:device0/scan_elements/in_accel_x_en ");
  5.     system("echo 1 > /sys/bus/iio/devices/iio:device0/scan_elements/in_accel_y_en ");
  6.     system("echo 1 > /sys/bus/iio/devices/iio:device0/scan_elements/in_accel_z_en");
  7.     system("echo 1 > /sys/bus/iio/devices/iio:device0/scan_elements/in_anglvel_x_en ");
  8.     system("echo 1 > /sys/bus/iio/devices/iio:device0/scan_elements/in_anglvel_y_en");
  9.     system("echo 1 > /sys/bus/iio/devices/iio:device0/scan_elements/in_anglvel_z_en");
  10.     system("echo 0 > /sys/bus/iio/devices/iio:device0/scan_elements/in_timestamp_en");
  11.     system("echo 12 > /sys/bus/iio/devices/iio:device0/buffer/length");
  12.     system("echo 1 > /sys/bus/iio/devices/iio:device0/buffer/enable");
复制代码

启动参数配置好,我们就可以read读取传感器的数据了
  1.         ret=poll(&fp,1,-1);
  2.         if(ret==-1)
  3.         {
  4.             printf("poll failed\n");
  5.             exit(-1);
  6.         }
  7.         ret=read(fp.fd,buff,512);
复制代码

根据获取的数据buff进行解析成相应的加速度和角速度
以x轴加速度为例,其他轴的详细的源码参考附件。
  1.         //accel x
  2.         x=buff[1]*256+buff[0];
  3.         if(x>32767)
  4.         {
  5.             ax=(65535-x)/16384.0;
  6.             ax=-ax;
  7.         }else
  8.         {
  9.             ax=x/16384.0;
  10.         }
  11.         printf("ax:%.2lfg\n",ax);
复制代码
4.demo测试  

经过上面的步骤后,我们就可以在用户层获取源源不断的设备数据了。数据效果如下:

demo测试.png

mpu6050_sensor.tar.gz

7.6 KB, 下载次数: 33, 下载积分: 灯泡 -1 , 经验 -1

回复

使用道具 举报

17

积分

0

威望

0

贡献

技术小白

积分
17
发表于 2019-3-7 10:16:36     
谢谢楼主分享
回复

使用道具 举报

7

积分

0

威望

0

贡献

技术小白

积分
7
发表于 2019-3-21 09:20:02     
thanks for sharing!
回复

使用道具 举报

11

积分

0

威望

0

贡献

技术小白

积分
11
发表于 2019-3-29 10:44:19     
感谢分享
回复

使用道具 举报

5

积分

0

威望

0

贡献

吃瓜的群众

积分
5
发表于 2019-3-31 20:36:07     
请问 mpu6050的模块 在哪里购买
回复

使用道具 举报

166

积分

1

威望

0

贡献

技术小白

积分
166
发表于 2019-4-2 10:12:27     
xdlaomian 发表于 2019-3-31 20:36
请问 mpu6050的模块 在哪里购买

这个购买问题应该不难吧,淘宝一搜就很多啊。
回复

使用道具 举报

5

积分

0

威望

0

贡献

吃瓜的群众

积分
5
发表于 2019-4-8 19:44:05     
飞神 发表于 2019-4-2 10:12
这个购买问题应该不难吧,淘宝一搜就很多啊。

谢谢,设备树文件 在哪里写的 啊    还是 内核里 已经有了
回复

使用道具 举报

6

积分

0

威望

0

贡献

技术小白

积分
6
发表于 2019-4-9 11:50:36     
感谢分享
回复

使用道具 举报

166

积分

1

威望

0

贡献

技术小白

积分
166
发表于 2019-4-9 14:14:48     
xdlaomian 发表于 2019-4-8 19:44
谢谢,设备树文件 在哪里写的 啊    还是 内核里 已经有了

设备树的配置需要自行写,驱动就内核已经有了
回复

使用道具 举报

4

积分

0

威望

0

贡献

吃瓜的群众

积分
4
发表于 2019-5-17 22:15:02     
厉害了!!!
回复

使用道具 举报

返回列表
12
*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

友情链接 : 爱板网 电子发烧友论坛 云汉电子社区 粤ICP备14022046号-2
快速回复 返回顶部 返回列表