基于CC2541+MPU6050的蓝牙旋转魔方设计

2019-02-07 05:37徐华军
无线互联科技 2019年22期
关键词:蓝牙

徐华军

摘   要:文章基于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,实现了蓝牙魔方设计。提出的欧拉角获取方法简单、实用,并能够以图形方式显示在手机端,有一定实用价值。

猜你喜欢
蓝牙
蓝牙音箱的直线之美
简单、易用,可玩性强Q AcousticsBT3蓝牙音箱
适合自己的才是最好的 德生(TECSUN) BT-50蓝牙耳机放大器
真无线木质蓝牙音响
基于手机蓝牙控制的智能电风扇
终于等到你 Shure舒尔蓝牙耳机
紧急:蓝牙指尖陀螺自燃!安全隐患频出
多彩的极简设计——OLI蓝牙音响
年度蓝牙应用创新奖入围产品公布
蓝牙技术联盟公布年度蓝牙应用创新奖入围产品