聚豐項目 > 基于RT-Thread的GY-91開發
隨著物聯網應用越來越廣泛,涌現各種各樣的傳感器,如溫度、氣壓、重力、陀螺儀、光照傳感器等等,這類傳感器接口形式、控制方式、數據精度,因為不同廠商而存在一定差異。另一方面,用戶在實時調整傳感器功耗、靈敏度、數據速率等會因為傳感器差異導致大量重復編碼工作,降低開發效率。因此將傳感器進行集成化不僅會節省硬件電路的需求,減少了開發人員的工作難度。本項目則是進行GY-91的傳感器開發,它集成了三軸陀螺儀+三軸加速度+三軸磁場+氣壓,不僅可以測量各個軸的角度,還可以測量外界環境的溫度、氣壓,從而彌補因環境產生的的誤差。此外,該傳感器模塊采用極其緊湊的封裝。得益于小尺寸和低功耗特性,這種器件可應用于多個場景。例如:GPS的導航、室內導航、戶外步態分析等等。最后通過實驗,成功讀取到9軸數據和大氣壓以及溫度,并通過卡爾曼濾波解析出俯仰角度。
999哲
999哲
團隊成員
張銘哲 學生
本項目核心模塊時GY-91,它是由BMP280和MPU9250集成而來。其中BMP280 是博世公司開發的一款環境傳感器,支持氣壓和溫度測量。bmp180是一款上市比較久的傳感器,很多功能并未支持,如電源模式、數據輸出速率等不支持。
MPU9250可以通過集成電路總線接口和單片機進行數據交互,傳輸速率可達 400 kHz /s。陀螺儀的角速度測量范圍最高達±2000(° /s),具有良好的動態響應特性。加速度計的測量范圍最大為±16g( g 為重力加速度),靜態測量精度高。磁力計采用高靈度霍爾型傳感器進行數據采集,磁感應強度測量范圍為±4800μT,可用于對偏航角的輔助測量
兩種傳感器都可以使用IIC進行驅動,按照標準的IIC協議進行驅動即可。
RT-Thread使用情況概述:
本項目使用到了非常多方面的知識,其中包含但不僅限于RT-Thread操作系統,sensor框架,RT-Thread-studio,硬件選型,,TFT屏幕的驅動原理,GY-91的驅動
內核部分:主要使用了多線程
組件部分:使用了Sensor
軟件包:主要使用了sensor框架下的BMP280和MPU9250軟件包
設備驅動:GPIO/II/SP/UART/MSH等
系統框圖如下所示:
總體方案邏輯明確,通過開啟傳感器線程進行20hz頻率的數據采集,通過主函數來不斷刷新傳感器采集的數據以供顯示,其中再開發過程中用到了UART1和MSH指令進行調試。使用組件包I2C可以快速的配置所需要的I2C引腳號以及初始化,給開發人員帶來了極大的便利。
流程圖如下所示:
主要代碼如下:
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
正因為這個比賽,使我從一開始的對RT-Thread一無所知,慢慢的喜歡上它。在完成項目的過程中,學習到了很多的關于RT-Thread的知識,再次鍛煉了自己的動手實踐能力,在比賽中和志同道合的朋友相互交流,相互請教,相互學習是一件非??鞓返氖虑?。非常感謝各位金主提供的這次機會,也非常感謝幕后每位工作人員的付出,耐心的幫助我們解答問題!
dianzi_0101: 為老哥點贊
回復