聚豐項(xiàng)目 > 基于RT-Thread的GY-91開發(fā)
隨著物聯(lián)網(wǎng)應(yīng)用越來越廣泛,涌現(xiàn)各種各樣的傳感器,如溫度、氣壓、重力、陀螺儀、光照傳感器等等,這類傳感器接口形式、控制方式、數(shù)據(jù)精度,因?yàn)椴煌瑥S商而存在一定差異。另一方面,用戶在實(shí)時調(diào)整傳感器功耗、靈敏度、數(shù)據(jù)速率等會因?yàn)閭鞲衅鞑町悓?dǎo)致大量重復(fù)編碼工作,降低開發(fā)效率。因此將傳感器進(jìn)行集成化不僅會節(jié)省硬件電路的需求,減少了開發(fā)人員的工作難度。本項(xiàng)目則是進(jìn)行GY-91的傳感器開發(fā),它集成了三軸陀螺儀+三軸加速度+三軸磁場+氣壓,不僅可以測量各個軸的角度,還可以測量外界環(huán)境的溫度、氣壓,從而彌補(bǔ)因環(huán)境產(chǎn)生的的誤差。此外,該傳感器模塊采用極其緊湊的封裝。得益于小尺寸和低功耗特性,這種器件可應(yīng)用于多個場景。例如:GPS的導(dǎo)航、室內(nèi)導(dǎo)航、戶外步態(tài)分析等等。最后通過實(shí)驗(yàn),成功讀取到9軸數(shù)據(jù)和大氣壓以及溫度,并通過卡爾曼濾波解析出俯仰角度。
999哲
分享999哲
團(tuán)隊成員
張銘哲 學(xué)生
本項(xiàng)目核心模塊時GY-91,它是由BMP280和MPU9250集成而來。其中BMP280 是博世公司開發(fā)的一款環(huán)境傳感器,支持氣壓和溫度測量。bmp180是一款上市比較久的傳感器,很多功能并未支持,如電源模式、數(shù)據(jù)輸出速率等不支持。
MPU9250可以通過集成電路總線接口和單片機(jī)進(jìn)行數(shù)據(jù)交互,傳輸速率可達(dá) 400 kHz /s。陀螺儀的角速度測量范圍最高達(dá)±2000(° /s),具有良好的動態(tài)響應(yīng)特性。加速度計的測量范圍最大為±16g( g 為重力加速度),靜態(tài)測量精度高。磁力計采用高靈度霍爾型傳感器進(jìn)行數(shù)據(jù)采集,磁感應(yīng)強(qiáng)度測量范圍為±4800μT,可用于對偏航角的輔助測量
兩種傳感器都可以使用IIC進(jìn)行驅(qū)動,按照標(biāo)準(zhǔn)的IIC協(xié)議進(jìn)行驅(qū)動即可。
RT-Thread使用情況概述:
本項(xiàng)目使用到了非常多方面的知識,其中包含但不僅限于RT-Thread操作系統(tǒng),sensor框架,RT-Thread-studio,硬件選型,,TFT屏幕的驅(qū)動原理,GY-91的驅(qū)動
內(nèi)核部分:主要使用了多線程
組件部分:使用了Sensor
軟件包:主要使用了sensor框架下的BMP280和MPU9250軟件包
設(shè)備驅(qū)動:GPIO/II/SP/UART/MSH等
系統(tǒng)框圖如下所示:
總體方案邏輯明確,通過開啟傳感器線程進(jìn)行20hz頻率的數(shù)據(jù)采集,通過主函數(shù)來不斷刷新傳感器采集的數(shù)據(jù)以供顯示,其中再開發(fā)過程中用到了UART1和MSH指令進(jìn)行調(diào)試。使用組件包I2C可以快速的配置所需要的I2C引腳號以及初始化,給開發(fā)人員帶來了極大的便利。
流程圖如下所示:
主要代碼如下:
while(1)
{
mpu6xxx_get_gyro(i2c_bus, &gyro);
mpu6xxx_get_accel(i2c_bus, &accel);
mpu6xxx_get_mag(i2c_bus,&magn);
rt_device_read(baro_dev, 0, &baro_data, 1);
rt_device_read(temp_dev, 0, &temp_data, 1);
Pitch = atan2(accel.x,accel.z)*180/PI;
gyro.y = gyro.y/16.4;
Pitch = Kalman_Filter(Pitch ,gyro.y);
}
float Kalman_Filter(float newAngle, float newGyro)//angleAx 和 gyroGy
{
//1 Update xhat
gyro_Ka = newGyro - bias;
angle += gyro_Ka*dt;
//2 Update estimation error covariance
P[0][0] += dt * (dt*P[1][1] - P[0][1] - P[1][0] + Q_angle);
P[0][1] -= dt * P[1][1];
P[1][0] -= dt * P[1][1];
P[1][1] += Q_bias * dt;
//3 Calculate Kalman gain - Compute the Kalman gain
float S = P[0][0] + R_measure; // Estimate error
float K[2]; // Kalman gain - This is a 2x1 vector
K[0] = P[0][0] / S;
K[1] = P[1][0] / S;
// Calculate angle and bias
float y = newAngle - angle;
angle += K[0] * y;
bias += K[1] * y;
// Calculate estimation error covariance - Update the error covariance
/* Step 7 */
float P00_temp = P[0][0];
float P01_temp = P[0][1];
P[0][0] -= K[0] * P00_temp;
P[0][1] -= K[0] * P01_temp;
P[1][0] -= K[1] * P00_temp;
P[1][1] -= K[1] * P01_temp;
return angle;
}
代碼地址:https://gitee.com/zhangzhe-2021/rt-thread
正因?yàn)檫@個比賽,使我從一開始的對RT-Thread一無所知,慢慢的喜歡上它。在完成項(xiàng)目的過程中,學(xué)習(xí)到了很多的關(guān)于RT-Thread的知識,再次鍛煉了自己的動手實(shí)踐能力,在比賽中和志同道合的朋友相互交流,相互請教,相互學(xué)習(xí)是一件非常快樂的事情。非常感謝各位金主提供的這次機(jī)會,也非常感謝幕后每位工作人員的付出,耐心的幫助我們解答問題!
dianzi_0101: 為老哥點(diǎn)贊
回復(fù)