聚丰项目 > 基于RT-Thread的GY-91开发

基于RT-Thread的GY-91开发

随着物联网应用越来越广泛,涌现各种各样的传感器,如温度、气压、重力、陀螺仪、光照传感器等等,这类传感器接口形式、控制方式、数据精度,因为不同厂商而存在一定差异。另一方面,用户在实时调整传感器功耗、灵敏度、数据速率等会因为传感器差异导致大量重复编码工作,降低开发效率。因此将传感器进行集成化不仅会节省硬件电路的需求,减少了开发人员的工作难度。本项目则是进行GY-91的传感器开发,它集成了三轴陀螺仪+三轴加速度+三轴磁场+气压,不仅可以测量各个轴的角度,还可以测量外界环境的温度、气压,从而弥补因环境产生的的误差。此外,该传感器模块采用极其紧凑的封装。得益于小尺寸和低功耗特性,这种器件可应用于多个场景。例如:GPS的导航、室内导航、户外步态分析等等。最后通过实验,成功读取到9轴数据和大气压以及温度,并通过卡尔曼滤波解析出俯仰角度。

999哲 999哲

分享
0 喜欢这个项目
团队介绍

999哲 999哲

团队成员

张铭哲 学生

分享
项目简介
随着物联网应用越来越广泛,涌现各种各样的传感器,如温度、气压、重力、陀螺仪、光照传感器等等,这类传感器接口形式、控制方式、数据精度,因为不同厂商而存在一定差异。另一方面,用户在实时调整传感器功耗、灵敏度、数据速率等会因为传感器差异导致大量重复编码工作,降低开发效率。因此将传感器进行集成化不仅会节省硬件电路的需求,减少了开发人员的工作难度。本项目则是进行GY-91的传感器开发,它集成了三轴陀螺仪+三轴加速度+三轴磁场+气压,不仅可以测量各个轴的角度,还可以测量外界环境的温度、气压,从而弥补因环境产生的的误差。此外,该传感器模块采用极其紧凑的封装。得益于小尺寸和低功耗特性,这种器件可应用于多个场景。例如:GPS的导航、室内导航、户外步态分析等等。最后通过实验,成功读取到9轴数据和大气压以及温度,并通过卡尔曼滤波解析出俯仰角度。
硬件说明

本项目核心模块时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等

系统框图如下所示:

 

硬件.png


软件说明

总体方案逻辑明确,通过开启传感器线程进行20hz频率的数据采集,通过主函数来不断刷新传感器采集的数据以供显示,其中再开发过程中用到了UART1和MSH指令进行调试。使用组件包I2C可以快速的配置所需要的I2C引脚号以及初始化,给开发人员带来了极大的便利。

流程图如下所示:

软件.png

主要代码如下:

    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

演示效果


解释.png


正因为这个比赛,使我从一开始的对RT-Thread一无所知,慢慢的喜欢上它。在完成项目的过程中,学习到了很多的关于RT-Thread的知识,再次锻炼了自己的动手实践能力,在比赛中和志同道合的朋友相互交流,相互请教,相互学习是一件非常快乐的事情。非常感谢各位金主提供的这次机会,也非常感谢幕后每位工作人员的付出,耐心的帮助我们解答问题!


评论区(1 )
  • dianzi_0101: 为老哥点赞

    回复