徐華軍
摘? ?要:文章基于CC2541及運動處理傳感器MPU6050設計了一種無線旋轉(zhuǎn)魔方,在轉(zhuǎn)動魔方時,MPU6050傳感器能夠通過自帶的DMP實時輸出四元數(shù),CC2541獲取數(shù)據(jù)后計算出姿態(tài)角,并通過藍牙傳遞給手機,從而在手機APP端能夠?qū)崟r顯示旋轉(zhuǎn)角度,并實現(xiàn)動態(tài)演示的效果。
關(guān)鍵詞:無線旋轉(zhuǎn)魔方;運動處理傳感器;藍牙
1? ? 歐拉角計算原理
在三維空間中的歐拉角旋轉(zhuǎn)要轉(zhuǎn)3次,描述一次旋轉(zhuǎn)方向,可用余弦矩陣來表示:
使用歐拉角微分方程來解算歐拉角:
左側(cè)是本次更新后的歐拉角,對應row,pit,yaw;右側(cè)是上個周期測算出來的角度;求解這個微分方程就能解算出當前的歐拉角。歐拉角微分方程解算姿態(tài)關(guān)系簡單、明了,概念直觀、容易理解,但是歐拉角微分方程中包含了大量的三角運算,給實時解算帶來了一定的困難。當俯仰角為90°時,方程式會出現(xiàn)萬向節(jié)死鎖“Gimbal Lock”,所以歐拉角方法只適用于水平姿態(tài)變化不大的情況,而不適用于全姿態(tài)飛行器的姿態(tài)確定。
四元數(shù)法只求解4個未知量的線性微分方程組,計算量小、易于操作,是比較實用的工程方法。在平面(x,y)中的旋轉(zhuǎn)可以用復數(shù)來表示,同樣三維空間中的旋轉(zhuǎn)可以用單位四元數(shù)來描述。定義一個四元數(shù):
用歐拉角描述的方向余弦矩陣用四元數(shù)描述則為:
使用一階龍哥庫塔求解四元數(shù)微分方程:
式中,gx,gy,gz為傳感器所測出的值,T為測量周期。從MPU6050獲得6個數(shù)據(jù),分別是三軸加速度值和三軸角速度值ax,ay,az,gx,gy,gz??梢愿鶕?jù)6個原始數(shù)據(jù)計算出姿勢(歐拉角):俯仰角、偏航角、滾動角。最終由四元數(shù)方向余弦矩陣與歐拉角的換算關(guān)系,可以很方便地將四元數(shù)轉(zhuǎn)換成歐拉角。
本設計使用四元數(shù)法求解,降低了CC2541的運算能力需求,簡化了設計。
2? ? 硬件系統(tǒng)設計
本系統(tǒng)設計基于CC2541及運動處理傳感器MPU6050,可在手機端實時顯示物體的旋轉(zhuǎn)姿態(tài)角。
2.1? MPU6050接口電路設計
MPU6050內(nèi)部集成了3軸MEMS陀螺儀、3軸MEMS加速度計以及一個可擴展的數(shù)字運動處理器(Digital Motion Processor,DMP),可用兩線式串行總線(Inter-Integrated Circuit,I2C)接口連接一個第三方的數(shù)字傳感器,比如磁力計。擴展之后可以通過其I2C輸出一個9軸的信號。MPU6050與CC2541接口電路設計如圖1所示。
VCC接3.3 V,GND接地,SCL I2C的時鐘接CC2541 P1_5引腳,SDA I2C數(shù)據(jù)口接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端穩(wěn)壓芯片AMS1117,為系統(tǒng)提供3.3 V的工作電壓。C1,C2,C3,C4為退耦電容。
3? ? 軟件設計
3.1? CC2541藍牙程序
本設計采用MPU6050內(nèi)部自帶的DMP,通過加載MPU6050的嵌入式運動驅(qū)動庫,方便獲取歐拉角。通過I2C接口讀取到MPU6050的6個數(shù)據(jù),經(jīng)過姿態(tài)融合后就可以得到 Pitch,Roll,Yaw角。
在藍牙協(xié)議棧的KFD_ACCEL_MPU6050_READ_EVT任務事件時,調(diào)用KeyFobDemo_mpu6050Read()函數(shù)直接讀取數(shù)據(jù)。每隔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};//四元數(shù)存放數(shù)組
3.2? Android? APP設計
啟動APP,通過藍牙連接CC2541后,將執(zhí)行函數(shù):
Constans.mBluetoothLeService.readCharacteristic(characteristic) 。啟動一個讀取操作,觸發(fā)回調(diào)函數(shù):
private final BroadcastReceiver mGattUpdateReceiver = new BroadcastReceiver()
該函數(shù)處理讀取到的 20 個字節(jié)數(shù)據(jù),并顯示圖形。
getblePacket(byte[]packet)中的packet數(shù)組共20個字節(jié),其中都是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輸出的四元數(shù)
計算出歐拉角: float []data = new float[3];
調(diào)用函數(shù)實現(xiàn)立方體顯示:
mGLSurfaceView.onMpu6050Sensor(data[2], data[1], data[0]); 參數(shù)為歐拉角。APP端顯示界面如4圖所示,
4? ? 結(jié)語
本設計基于CC2541及MPU6050,實現(xiàn)了藍牙魔方設計。提出的歐拉角獲取方法簡單、實用,并能夠以圖形方式顯示在手機端,有一定實用價值。