news 2026/4/3 5:17:13

电科毕设 基于单片机的姿态检测与可视化系统(源码+硬件+论文)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
电科毕设 基于单片机的姿态检测与可视化系统(源码+硬件+论文)

文章目录

  • 1 前言
  • 2 设计方案
    • 2.1 MPU6050
    • 2.2 工作原理
    • 2.3 单片机与MPU6050通信
    • 2.4 mpu6050 数据格式
    • 2.5 倾角计算方法
  • 3 核心软件设计
  • 4 实现效果
  • 5 最后

1 前言

🔥
这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。

为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是

🚩毕业设计 基于单片机的姿态检测与可视化系统(源码+硬件+论文)

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:3分
  • 工作量:3分
  • 创新点:5分

🧿项目分享:见文末!

系统整体框架

本系统将由硬件系统和软件系统构成,其中硬件系统包含微控制器和IIC总线以及惯性传感器等硬件模块,软件系统则包含了下位机主控软件模块、数据采集软件模块、姿态解算软件模块以及上位机可视化软件模块等。其中惯性传感器模块选用MPU6050惯性传感器,软件模块方面,开发板IDE采用Arduino IDE,上位机使用processing平台完成可视化功能的实现。系统整体框架如图

2 设计方案

2.1 MPU6050

MPU6050是一种非常流行的空间运动传感器芯片,可以获取器件当前的三个加速度分量和三个旋转角速度。由于其体积小巧,功能强大,精度较高,不仅被广泛应用于工业,同时也是航模爱好者的神器,被安装在各类飞行器上驰骋蓝天。

随着Arduino开发板的普及,许多朋友希望能够自己制作基于MPU6050的控制系统,但由于缺乏专业知识而难以上手。此外,MPU6050的数据是有较大噪音的,若不进行滤波会对整个控制系统的精准确带来严重影响。

MPU6050芯片内自带了一个数据处理子模块DMP,已经内置了滤波算法,在许多应用中使用DMP输出的数据已经能够很好的满足要求。关于如何获取DMP的输出数据,我将在以后的文章中介绍。本文将直接面对原始测量数据,从连线、芯片通信开始一步一步教你如何利用Arduino获取MPU6050的数据并进行卡尔曼滤波,最终获得稳定的系统运动状态。

2.2 工作原理


加速度计采用压电效应的工作原理,就像上面的图片一样,在一个立方体的盒子里面有一个小球,盒子的四壁是用压电晶体材料,当盒子倾斜时,由于重力的作用,球就会向倾斜的方向移动,当小球碰到墙壁就会产生压电电流。盒子中有上下、左右、前后三对相对的墙壁,每一对墙对应于三维空间中的一个轴:X轴、Y轴、Z轴。根据压电壁产生的电流,我们就可以确定倾角的方向和大小。

2.3 单片机与MPU6050通信

这里以arduino单片机为例

为避免纠缠于电路细节,我们直接使用集成的MPU6050模块。MPU6050的数据接口用的是I2C总线协议,因此我们需要Wire程序库的帮助来实现Arduino与MPU6050之间的通信。请先确认你的Arduino编程环境中已安装Wire库。

Wire库的官方文档中指出:在UNO板子上,SDA接口对应的是A4引脚,SCL对应的是A5引脚。MPU6050需要5V的电源,可由UNO板直接供电。按照下图连线。

2.4 mpu6050 数据格式

我们感兴趣的数据位于0x3B到0x48这14个字节的寄存器中。这些数据会被动态更新,更新频率最高可达1000HZ。下面列出相关寄存器的地址,数据的名称。注意,每个数据都是2个字节。

  • 0x3B,加速度计的X轴分量ACC_X
  • 0x3D,加速度计的Y轴分量ACC_Y
  • 0x3F,加速度计的Z轴分量ACC_Z
  • 0x41,当前温度TEMP
  • 0x43,绕X轴旋转的角速度GYR_X
  • 0x45,绕Y轴旋转的角速度GYR_Y
  • 0x47,绕Z轴旋转的角速度GYR_Z

2.5 倾角计算方法

Roll-pitch-yaw模型与姿态计算

表示飞行器当前飞行姿态的一个通用模型就是建立下图所示坐标系,并用Roll表示绕X轴的旋转,Pitch表示绕Y轴的旋转,Yaw表示绕Z轴的旋转。



Yaw角的问题

因为没有参考量,所以无法求出当前的Yaw角的绝对角度,只能得到Yaw的变化量,也就是角速度GYR_Z。当然,我们可以通过对GYR_Z积分的方法来推算当前Yaw角(以初始值为准),但由于测量精度的问题,推算值会发生漂移,一段时间后就完全失去意义了。然而在大多数应用中,比如无人机,只需要获得GRY_Z就可以了。

如果必须要获得绝对的Yaw角,那么应当选用MPU9250这款九轴运动跟踪芯片,它可以提供额外的三轴罗盘数据,这样我们就可以根据地球磁场方向来计算Yaw角了,具体方法此处不再赘述。

3 核心软件设计

篇幅有限,不过多复述详细设计细节,详细的设计分享在论文中。。。

关键代码

// 本代码版权归Devymex所有,以GNU GENERAL PUBLIC LICENSE V3.0发布// http://www.gnu.org/licenses/gpl-3.0.en.html// 相关文档参见作者于知乎专栏发表的原创文章:// http://zhuanlan.zhihu.com/devymex/20082486//连线方法//MPU-UNO//VCC-VCC//GND-GND//SCL-A5//SDA-A4//INT-2 (Optional)#include<Kalman.h>#include<Wire.h>#include<Math.h>floatfRad2Deg=57.295779513f;//将弧度转为角度的乘数constintMPU=0x68;//MPU-6050的I2C地址constintnValCnt=7;//一次读取寄存器的数量constintnCalibTimes=1000;//校准时读数的次数intcalibData[nValCnt];//校准数据unsignedlongnLastTime=0;//上一次读数的时间floatfLastRoll=0.0f;//上一次滤波得到的Roll角floatfLastPitch=0.0f;//上一次滤波得到的Pitch角Kalman kalmanRoll;//Roll角滤波器Kalman kalmanPitch;//Pitch角滤波器voidsetup(){Serial.begin(9600);//初始化串口,指定波特率Wire.begin();//初始化Wire库WriteMPUReg(0x6B,0);//启动MPU6050设备Calibration();//执行校准nLastTime=micros();//记录当前时间}voidloop(){intreadouts[nValCnt];ReadAccGyr(readouts);//读出测量值floatrealVals[7];Rectify(readouts,realVals);//根据校准的偏移量进行纠正//计算加速度向量的模长,均以g为单位floatfNorm=sqrt(realVals[0]*realVals[0]+realVals[1]*realVals[1]+realVals[2]*realVals[2]);floatfRoll=GetRoll(realVals,fNorm);//计算Roll角if(realVals[1]>0){fRoll=-fRoll;}floatfPitch=GetPitch(realVals,fNorm);//计算Pitch角if(realVals[0]<0){fPitch=-fPitch;}//计算两次测量的时间间隔dt,以秒为单位unsignedlongnCurTime=micros();floatdt=(double)(nCurTime-nLastTime)/1000000.0;//对Roll角和Pitch角进行卡尔曼滤波floatfNewRoll=kalmanRoll.getAngle(fRoll,realVals[4],dt);floatfNewPitch=kalmanPitch.getAngle(fPitch,realVals[5],dt);//跟据滤波值计算角度速floatfRollRate=(fNewRoll-fLastRoll)/dt;floatfPitchRate=(fNewPitch-fLastPitch)/dt;//更新Roll角和Pitch角fLastRoll=fNewRoll;fLastPitch=fNewPitch;//更新本次测的时间nLastTime=nCurTime;//向串口打印输出Roll角和Pitch角,运行时在Arduino的串口监视器中查看Serial.print("Roll:");Serial.print(fNewRoll);Serial.print('(');Serial.print(fRollRate);Serial.print("),\tPitch:");Serial.print(fNewPitch);Serial.print('(');Serial.print(fPitchRate);Serial.print(")\n");delay(10);}//向MPU6050写入一个字节的数据//指定寄存器地址与一个字节的值voidWriteMPUReg(intnReg,unsignedcharnVal){Wire.beginTransmission(MPU);Wire.write(nReg);Wire.write(nVal);Wire.endTransmission(true);}//从MPU6050读出一个字节的数据//指定寄存器地址,返回读出的值unsignedcharReadMPUReg(intnReg){Wire.beginTransmission(MPU);Wire.write(nReg);Wire.requestFrom(MPU,1,true);Wire.endTransmission(true);returnWire.read();}//从MPU6050读出加速度计三个分量、温度和三个角速度计//保存在指定的数组中voidReadAccGyr(int*pVals){Wire.beginTransmission(MPU);Wire.write(0x3B);Wire.requestFrom(MPU,nValCnt*2,true);Wire.endTransmission(true);for(longi=0;i<nValCnt;++i){pVals[i]=Wire.read()<<8|Wire.read();}}//对大量读数进行统计,校准平均偏移量voidCalibration(){floatvalSums[7]={0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0};//先求和for(inti=0;i<nCalibTimes;++i){intmpuVals[nValCnt];ReadAccGyr(mpuVals);for(intj=0;j<nValCnt;++j){valSums[j]+=mpuVals[j];}}//再求平均for(inti=0;i<nValCnt;++i){calibData[i]=int(valSums[i]/nCalibTimes);}calibData[2]+=16384;//设芯片Z轴竖直向下,设定静态工作点。}//算得Roll角。算法见文档。floatGetRoll(float*pRealVals,floatfNorm){floatfNormXZ=sqrt(pRealVals[0]*pRealVals[0]+pRealVals[2]*pRealVals[2]);floatfCos=fNormXZ/fNorm;returnacos(fCos)*fRad2Deg;}//算得Pitch角。算法见文档。floatGetPitch(float*pRealVals,floatfNorm){floatfNormYZ=sqrt(pRealVals[1]*pRealVals[1]+pRealVals[2]*pRealVals[2]);floatfCos=fNormYZ/fNorm;returnacos(fCos)*fRad2Deg;}//对读数进行纠正,消除偏移,并转换为物理量。公式见文档。voidRectify(int*pReadout,float*pRealVals){for(inti=0;i<3;++i){pRealVals[i]=(float)(pReadout[i]-calibData[i])/16384.0f;}pRealVals[3]=pReadout[3]/340.0f+36.53;for(inti=4;i<7;++i){pRealVals[i]=(float)(pReadout[i]-calibData[i])/131.0f;}}

4 实现效果

硬件装置展示


姿态检测系统测试

将硬件通过数据线接入电脑usb口后,启动上位机并运行可视化文件。装置位置和上位机三维演示如图所示。

演示视频:

毕业设计 基于单片机的姿态检测与可视化系统 - 嵌入式 物联网

5 最后

包含内容


包含完整详细的设计论文

🧿项目分享:见文末!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/25 22:42:32

Sonic模型部署到GPU云服务器,享受高性能算力加成

Sonic模型部署到GPU云服务器&#xff0c;享受高性能算力加成 在短视频内容爆炸式增长的今天&#xff0c;企业对高效、低成本的内容生产工具需求愈发迫切。想象一下&#xff1a;只需一张人物照片和一段录音&#xff0c;几秒钟内就能生成一个唇形精准同步、表情自然生动的“数字…

作者头像 李华
网站建设 2026/3/18 7:40:02

秘鲁文化遗产部门用Sonic复原古印加语发音样本

Sonic赋能文化传承&#xff1a;让古印加语“开口说话” 在秘鲁安第斯山脉的古老遗址旁&#xff0c;一座博物馆正播放一段令人动容的视频——一位身着传统服饰、面容庄重的印加祭司缓缓开口&#xff0c;用一种从未有人听过的语言讲述着太阳神的传说。这不是电影特效&#xff0c;…

作者头像 李华
网站建设 2026/3/31 12:17:15

挪威公共图书馆部署Sonic帮助老人学习数字技能

挪威公共图书馆部署Sonic帮助老人学习数字技能&#xff1a;基于轻量级数字人模型的技术实践 在挪威奥斯陆的一间社区图书馆里&#xff0c;一位72岁的退休教师正盯着平板屏幕&#xff0c;听一位“虚拟馆员”讲解如何使用政府在线服务平台预约医生。这位讲师说话温和、口音亲切&…

作者头像 李华
网站建设 2026/3/30 16:05:50

知乎专栏深度解读Sonic背后的语音驱动技术原理

Sonic语音驱动数字人技术深度解析 在虚拟主播24小时不间断直播、在线课程批量生成讲解视频的今天&#xff0c;人们越来越期待一种“低成本、高质量、易操作”的数字人内容生产方式。传统依赖3D建模和动画师手动调参的方式早已无法满足这种爆发式的内容需求。而就在过去一年间&a…

作者头像 李华
网站建设 2026/3/31 10:45:42

STM32与LCD12864数据传输稳定性优化指南

STM32驱动LCD12864&#xff1a;从时序失配到稳定显示的实战优化你有没有遇到过这样的情况&#xff1f;STM32代码写得一丝不苟&#xff0c;初始化流程也完全照着手册来&#xff0c;可LCD12864就是不亮、乱码、花屏&#xff0c;甚至偶尔才正常一下——这种“薛定谔式”显示问题&a…

作者头像 李华
网站建设 2026/4/3 2:48:22

视频详情页右键另存为xxx.mp4,保存本地高清资源

视频详情页右键另存为xxx.mp4&#xff0c;保存本地高清资源 在短视频与AI内容爆发的今天&#xff0c;你是否曾遇到这样的场景&#xff1a;看到一段由AI生成的数字人讲解视频&#xff0c;口型精准、表情自然&#xff0c;仿佛真人出镜——而你只想轻轻一点&#xff0c;“右键另存…

作者头像 李华