一起玩转树莓派(18)——MPU6050陀螺仪加速度传感器模块应用
一起玩转树莓派(18)——MPU6050陀螺仪加速度传感器模块应用
一. 引言
现在智能手机的功能已经非常强大,除了基础的通信功能外,测位测速,空间角度等数据的测量也非常方便,这在线路导航,地图,体感游戏等应用中十分重要。不知你是否想过,智能设备是如何获取到其所在的空间状态与加速度等数据的呢?MPU6050就是提供这类数据测量的一种传感器模块。
首先,通过树莓派来读取MPU6050传感器模块的数据并不复杂,MPU60X0是一款扩展性极强的数字运动处理器,我们本次实验使用的是封装好的功能模块,如下图所示:
MPU6050芯片本身有24个引脚,每边有6个引脚,功能较多,引脚功能与定位如下图所示:
关于MPU6050的高级用法,可以通过查看芯片手册获取,本篇博客我们着重与在树莓派上对其进行应用。我们只需要关注所使用的模块的8个引脚即可。
二. 连线与准备工作
本次实验我们使用的模块有8个引脚,只需要使用其中4个引脚即可实现功能。对于树莓派I2C协议总线的应用,本系列博客之前已经有非常多的实验有过应用。首先连接传感器模块与树莓派如下表:
传感器模块 | 树莓派 |
---|---|
VCC | +5V |
GND | GND |
SCL | SCL |
SDA | SDA |
开始使用I2C总线前,莫忘了开启树莓派的I2C功能,对I2C总线用法如果不太了解,可以阅读以下博客:
https://my.oschina.net/u/2340880/blog/5142788
连线完成后,在树莓派的终端输入如下指令可以查看已经连接的I2C设备:
1 | sudo i2cdetect -y 1 |
如果连接无误,终端输出结果将如下图所示:
可以看到,图中显示的68即为我们所连接的传感器的地址。
下面,是时候了解下MPU6050传感器该如何使用了,我们知道,通过I2C总线,我们可以方便的读取设备中某个寄存器的数据,也可以向设备的某个寄存器写入数据,因此,使用MPU6050传感器的核心是了解其中寄存器的使用方法。我们将以使用到的几个寄存器为例做介绍,完整的寄存器用法可以从芯片手册上得到。
1. 电源管理寄存器
电源管理寄存器的地址为107,对应十六进制数0x6b,它是一个8位的寄存器,其中第4位为保留位不能使用,功能如下:
DECIVE_RESET: 这一位的作用是重置传感器,将传感器内部所有寄存器复位为初始状态,复位完成后,这一位会清零。
SLEEP: 睡眠控制位,当此位为1时,传感器将处于睡眠模式。需要注意,传感器启动时默认是睡眠模式,我们需要手动将其唤醒。
CYCLE:当设备设置为非睡眠模式时,即SLEEP位不为1,此为如果设置为1,传感器将处于循环模式,会按照寄存器108设置的速度进行数据循环采样。
TEMP_DIS:是否禁用温度传感器,设置为1时,禁用温度传感器。
CLKSEL:3位无符号数值,用来指令时钟源。
对于CLKSEL选项,其设置方式如下:
CLKSEL值 | 意义 |
---|---|
0 | 使用内部的8MHz的振荡器 |
1 | 使用陀螺仪X轴的频率 |
2 | 使用陀螺仪Y轴的频率 |
3 | 使用陀螺仪X轴的频率 |
4 | 使用外部的32.768kHz频率 |
5 | 使用外部19.2MHz频率 |
6 | 保留值 |
7 | 停止时钟并使振荡器保持复位状态 |
2. 陀螺仪数据寄存器
陀螺仪数据寄存器的地址为67到72,共48个二进制位,如下:
这些寄存器都是只读的,不能写入。
67和68寄存器存储16位数据,为陀螺仪X轴的测量数据。其中68寄存器存储低8位,67寄存器存储高8位。
69和70寄存器存储16位数据,为陀螺仪Y轴的测量数据。其中70寄存器存储低8位,69寄存器存储高8位。
71和72寄存器存储16位数据,为陀螺仪Z轴的测量数据。其中72寄存器存储低8位,71寄存器存储高8位。
需要注意,从这些寄存器取出的数据都是原始数据,要得到真正的陀螺仪测量的旋转角度,需要进行转换,其转换的单位与总量程有关,量程在寄存器27进行配置。
3. 陀螺仪配置寄存器
陀螺仪配置寄存器的地址为27,是一个可读可写的寄存器,如下:
XG_ST,YG_ST与ZG_ST这3位用来设置陀螺仪执行自检。FS_SEL用来设置陀螺仪的量程范围,低3位为保留位,无需使用。FS_SEL可设置的量程范围如下:
FS_SEL | 量程范围 | 灵敏度参数 |
---|---|---|
0 | ±250 °/s | 131 |
1 | ±500 °/s | 65.5 |
2 | ±1000 °/s | 32.8 |
3 | ±2000 °/s | 16.4 |
对于不同的量程范围,我们获取到原始数据后,需要除以对应的灵敏度参数才能得到最终的陀螺仪数据。
4. 加速计数据寄存器
加速计数据寄存器的地址为59到64,共48个二进制位,如下:
其使用方法与陀螺仪数据寄存器类似,同样需要在寄存器28来对加速计进行配置与设置量程,通过量程对应的灵敏度来计算得到真实的加速度值。
5. 加速计配置寄存器
陀螺仪配置寄存器的地址为28,是一个可读可写的寄存器,如下:
XA_ST,YA_ST,ZA_ST都是自检执行控制位,AFS_SEL用来设置量程,其与灵敏度对应关系如下:
AFS_SEL | 量程范围 | 灵敏度参数 |
---|---|---|
0 | ±2 | 16384 |
1 | ±4g | 8192 |
2 | ±8g | 4096 |
3 | ±16g | 2048 |
6. 温度数据寄存器
温度数据寄存器的地址为65到66,共16个二进制位,如下:
对于测量到的温度数据为有符号数,需要采用如下的计算公式得到真实的摄氏度数据:
摄氏温度 = TEMP_OUT / 340 + 36.53
除此之外,还有许多功能传感器,如采样率配置等,有需要可以从芯片手册查到。
三. 编写代码
完成了前面的基础准备工作,编写代码获取传感器模块的数据则非常容易,示例代码如下:
1 | #coding:utf-8 |
在树莓派上运行上面代码,效果如下图所示:
专注技术,懂的热爱,愿意分享,做个朋友
QQ:316045346