徐华军
摘 要:文章基于CC2541及运动处理传感器MPU6050设计了一种无线旋转魔方,在转动魔方时,MPU6050传感器能够通过自带的DMP实时输出四元数,CC2541获取数据后计算出姿态角,并通过蓝牙传递给手机,从而在手机APP端能够实时显示旋转角度,并实现动态演示的效果。
关键词:无线旋转魔方;运动处理传感器;蓝牙
1 欧拉角计算原理
在三维空间中的欧拉角旋转要转3次,描述一次旋转方向,可用余弦矩阵来表示:
使用欧拉角微分方程来解算欧拉角:
左侧是本次更新后的欧拉角,对应row,pit,yaw;右侧是上个周期测算出来的角度;求解这个微分方程就能解算出当前的欧拉角。欧拉角微分方程解算姿态关系简单、明了,概念直观、容易理解,但是欧拉角微分方程中包含了大量的三角运算,给实时解算带来了一定的困难。当俯仰角为90°时,方程式会出现万向节死锁“Gimbal Lock”,所以欧拉角方法只适用于水平姿态变化不大的情况,而不适用于全姿态飞行器的姿态确定。
四元数法只求解4个未知量的线性微分方程组,计算量小、易于操作,是比较实用的工程方法。在平面(x,y)中的旋转可以用复数来表示,同样三维空间中的旋转可以用单位四元数来描述。定义一个四元数:
用欧拉角描述的方向余弦矩阵用四元数描述则为:
使用一阶龙哥库塔求解四元数微分方程:
式中,gx,gy,gz为传感器所测出的值,T为测量周期。从MPU6050获得6个数据,分别是三轴加速度值和三轴角速度值ax,ay,az,gx,gy,gz。可以根据6个原始数据计算出姿势(欧拉角):俯仰角、偏航角、滚动角。最终由四元数方向余弦矩阵与欧拉角的换算关系,可以很方便地将四元数转换成欧拉角。
本设计使用四元数法求解,降低了CC2541的运算能力需求,简化了设计。
2 硬件系统设计
本系统设计基于CC2541及运动处理传感器MPU6050,可在手机端实时显示物体的旋转姿态角。
2.1 MPU6050接口电路设计
MPU6050内部集成了3轴MEMS陀螺仪、3轴MEMS加速度计以及一个可扩展的数字运动处理器(Digital Motion Processor,DMP),可用两线式串行总线(Inter-Integrated Circuit,I2C)接口连接一个第三方的数字传感器,比如磁力计。扩展之后可以通过其I2C输出一个9轴的信号。MPU6050与CC2541接口电路设计如图1所示。
VCC接3.3 V,GND接地,SCL I2C的时钟接CC2541 P1_5引脚,SDA I2C数据口接P1_6引脚。XDA,XCL可不接,AD0 MPU6050地址选择接地,INT mpu6050中断脚接P0_0。
2.2 CC2541控制电路设计
CC2541主控电路如图2所示,32,33脚外接32.768 KHz低频手表晶振,22,23脚接32 MHz的高频晶振。10,39,21,24,27,28,29,31为电源引脚,25,26脚通过滤波匹配电路接射频天线。
2.3 电源电路
电源电路(见图3)采用3端稳压芯片AMS1117,为系统提供3.3 V的工作电压。C1,C2,C3,C4为退耦电容。
3 软件设计
3.1 CC2541蓝牙程序
本设计采用MPU6050内部自带的DMP,通过加载MPU6050的嵌入式运动驱动库,方便获取欧拉角。通过I2C接口读取到MPU6050的6个数据,经过姿态融合后就可以得到 Pitch,Roll,Yaw角。
在蓝牙协议栈的KFD_ACCEL_MPU6050_READ_EVT任务事件时,调用KeyFobDemo_mpu6050Read()函数直接读取数据。每隔10 ms读取一次MPU6050的DMP输出,并保存到全局变量中:
static short mpu6050_gyro[3] ={0,0,0}; static short mpu6050_accel[3]= {0,0,0};
static short mpu6050_quat[4] = {0,0,0,0};//四元数存放数组
3.2 Android APP设计
启动APP,通过蓝牙连接CC2541后,将执行函数:
Constans.mBluetoothLeService.readCharacteristic(characteristic) 。启动一个读取操作,触发回调函数:
private final BroadcastReceiver mGattUpdateReceiver = new BroadcastReceiver()
该函数处理读取到的 20 个字节数据,并显示图形。
getblePacket(byte[]packet)中的packet数组共20个字节,其中都是16位表示,高位在后:
packet[0]~packet[1]是加速度的ax
packet[2]~packet[3]是加速度的ay
packet[4]~packet[5]是加速度的az
packet[6]~packet[7]是陀螺仪的gx
packet[8]~packet[9]是陀螺仪的gy packet[10]~packet[11]是陀螺儀的gz packet[12]~packet[19]是mpu6050的dmp输出的四元数
计算出欧拉角: float []data = new float[3];
调用函数实现立方体显示:
mGLSurfaceView.onMpu6050Sensor(data[2], data[1], data[0]); 参数为欧拉角。APP端显示界面如4图所示,
4 结语
本设计基于CC2541及MPU6050,实现了蓝牙魔方设计。提出的欧拉角获取方法简单、实用,并能够以图形方式显示在手机端,有一定实用价值。