一起玩转树莓派(18)——MPU6050陀螺仪加速度传感器模块应用

简介: 现在智能手机的功能已经非常强大,除了基础的通信功能外,测位测速,空间角度等数据的测量也非常方便,这在线路导航,地图,体感游戏等应用中十分重要。不知你是否想过,智能设备是如何获取到其所在的空间状态与加速度等数据的呢?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设备:

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

除此之外,还有许多功能传感器,如采样率配置等,有需要可以从芯片手册查到。

三. 编写代码

完成了前面的基础准备工作,编写代码获取传感器模块的数据则非常容易,示例代码如下:

#coding:utf-8

import smbus
import math
import time

# 电源控制寄存器地址
power_regist = 0x6b

# I2C模块初始化
bus = smbus.SMBus(1)
# 外接I2C设备的地址
address = 0x68

# 封装一些读取数据的功能函数

# 读取一个字长度的数据(16位)
def readWord(adr):
    high = bus.read_byte_data(address, adr)
    low = bus.read_byte_data(address, adr+1)
    val = (high << 8) + low
    return val

# 将读取到的数据转换为原码 (有符号数本身是采用补码方式存储的)
def readWordReal(adr):
    val = readWord(adr)
    x = 0xffff
    # 首位为1 表示是负数
    if (val >= 0x8000):
        # 求原码
        return -((x - val)+1)
    else:
        return val

# 已知加速度求角度值
def dist(a, b):
    return math.sqrt((a*a)+(b*b))

def getRotationX(x, y, z):
    radians = math.atan2(y, dist(x,z))
    return math.degrees(radians)

def getRotationY(x, y, z):
    radians = math.atan2(x, dist(y,z))
    return math.degrees(radians)

# 设置电源模式
bus.write_byte_data(address, power_regist, 0)


while True:
    time.sleep(0.5)
    print("螺旋仪数据-----------")
    gyroX = readWordReal(0x43)
    gyroY = readWordReal(0x45)
    gyroZ = readWordReal(0x47)

    print("X轴陀螺仪原始数据:", gyroX, "X轴每秒旋转度数:", gyroX/131)
    print("Y轴陀螺仪原始数据:", gyroY, "Y轴每秒旋转度数:", gyroY/131)
    print("Z轴陀螺仪原始数据:", gyroZ, "Z轴每秒旋转度数:", gyroZ/131)

    print("加速度数据----------")
    accelX = readWordReal(0x3b)
    accelY = readWordReal(0x3d)
    accelZ = readWordReal(0x3f)

    print("X轴加速度原始数据:", accelX, "X轴加速度:", accelX/16384)
    print("Y轴加速度原始数据:", accelY, "Y轴加速度:", accelY/16384)
    print("Z轴加速度原始数据:", accelZ, "Z轴加速度:", accelZ/16384)

    print("摄氏温度数据--------")
    temp = readWordReal(0x41)
    print("温度原始数据:", temp, "摄氏度:", temp/340 + 36.53)

    print("旋转家角度数据-------")
    print("X轴旋转度数:", getRotationX(accelX/16384, accelY/16384, accelZ/16384))
    print("Y轴旋转度数:", getRotationX(accelX/16384, accelY/16384, accelZ/16384))



在树莓派上运行上面代码,效果如下图所示:

专注技术,懂的热爱,愿意分享,做个朋友

QQ:316045346

目录
相关文章
|
4月前
|
人工智能 前端开发 JavaScript
AI Agent(智能体)的输出格式应该从 Markdown 转向 HTML吗?
Anthropic工程师提出AI输出应从Markdown转向HTML,强调其高信息密度、交互性与易分享优势;但HTML存在Token消耗大、Diff困难等短板。未来更可能是“分工协作”:HTML主导前端交互(UI/Artifact),Markdown坚守后端通信(Prompt/知识结构),二者共存演进。
353 0
|
传感器 机器人 芯片
实例4:树莓派GPIO控制舵机转动
本文是关于使用树莓派GPIO控制舵机转动的实验教程,涵盖了舵机的基本概念、结构、工作原理以及PWM信号控制方法。实验目的是通过Python编程,实现树莓派控制舵机在0°~180°范围内周期性转动。文中提供了详细的实验步骤、代码示例以及舵机调零和校准的方法。
2109 1
实例4:树莓派GPIO控制舵机转动
|
网络安全 开发工具 git
Git仓库创建与代码上传指南
本教程介绍了将本地项目推送到远程Git仓库的完整流程,包括初始化本地仓库、添加和提交文件、创建远程仓库、关联远程地址及推送代码。同时,还提供了`.gitignore`配置、分支管理等可选步骤,并针对常见问题(如认证失败、分支不匹配、大文件处理及推送冲突)给出了解决方案。适合初学者快速上手Git版本控制。
|
资源调度 数据挖掘
六西格玛的核心工具与方法:质量管理模型
六西格玛是一种基于数据的质量管理方法,旨在减少缺陷和变异,提高产品和服务质量。其核心是DMAIC模型:定义、测量、分析、改进和控制。
1898 0
六西格玛的核心工具与方法:质量管理模型
|
算法 数据可视化 API
使用Yolov5实现智能垃圾分类系统
使用Yolov5实现智能垃圾分类系统
2678 0
|
网络安全 网络架构 数据安全/隐私保护
树莓派通过网线连接电脑(校园网也能连接),实现SSH连接
树莓派通过网线连接电脑(校园网也能连接),实现SSH连接
|
编译器 C语言
【C语言】宏定义在 a.c 中定义,如何在 b.c 中使用?
通过将宏定义放在头文件 `macros.h` 中,并在多个源文件中包含该头文件,我们能够在多个文件中共享宏定义。这种方法不仅提高了代码的重用性和一致性,还简化了维护和管理工作。本文通过具体示例展示了如何定义和使用宏定义,帮助读者更好地理解和应用宏定义的机制。
901 2
|
存储 Unix Linux
哪些工具可以烧录树莓派的操作系统镜像
除了常见的烧录工具,树莓派操作系统镜像还可以通过以下工具烧录: 1. **Etcher**:树莓派官方推荐的图形界面工具,支持多操作系统,使用简单,具备严格的设备验证和校验机制。 2. **dd 命令**:适用于 Linux 和类 Unix 系统,功能强大但需谨慎使用,适合熟悉命令行的用户。 3. **BalenaEtcher**:与 Etcher 类似,跨平台且操作简单,确保烧录过程的准确性和安全性。 初学者建议使用 Etcher 或 BalenaEtcher,熟悉命令行的用户可以选择 dd 命令。
1945 6
|
Linux 网络安全 数据安全/隐私保护
【最新教程】树莓派安装系统及VNC远程桌面连接
【最新教程】树莓派安装系统及VNC远程桌面连接

热门文章

最新文章