聚丰项目 > 基于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: 为老哥点赞
回复