Arduino提高篇18—MPU6050数据3D展示

对MPU6050姿态解算得到欧拉角后,就可以应用于四轴等对姿态进行控制了。为了更直观的理解三个欧拉角,本篇我们使用Processing软件与Arduino进行交互,将MPU6050数据进行3D建模展示。

1. Processing介绍

Processing是一种文本编程语言,主要用于处理可视化数据,并可以将数据呈现为2D或3D模型 。它以Java语言为基础,并且做了扩展和延伸,将计算机编程和艺术创作完美结合,将代码转换成千变万化的图像。

Processing

对于电子爱好者来说,我们以单片机、Arduino等MCU为主的嵌入式应用很难将数据进行直观的展示,通过C#、QT等来开发PC机上的可视化软件又比较复杂,而通过Processing这一开源平台可简单方便的实现互动。

在这里我们不对Processing进行展开讲解,如读者对其感兴趣可关注后续系列教程笔记。

2. Prosessing软件及其库安装

我们可以登录Processing官网进行软件下载,本文写作时,最新版本为3.5.4。

软件下载

本文使用Windows-64bit版本,另外还需要安装"toxiclibs"库。为方便大家使用,已经将资源进行了整理,可在文末获取。

将下载的Processing压缩包进行解压,双击可执行文件即可运行软件。

安装Processing

在软件运行后,会在"C:\Users\Tony\Documents"目录下生成Processing文件夹,其中"Tony"为电脑用户名。将下载的库文件"toxiclibs-complete-0020.zip"进行解压,将解压文件拷贝到该目录下的libraries文件夹,即可完成库安装。

安装库文件

3. 实验材料

  • Uno R3开发板
  • 配套USB数据线
  • 面包板及配套连接线
  • MPU6050传感器模块

4. 实验步骤

  1. 根据原理图搭建电路图。

MPU6050传感器模块的VCC、GND分别连接开发板的3.3V、GND,传感器的SDA、SCL引脚连接开发板A4、A5引脚。

实验原理图如下图所示:

实验原理图

实物连接图如下图所示:

实物连接图

  1. 启动Arduino IDE,点击「文件」—「示例」,在示例中找到上一篇安装的MPU6050驱动库示例「MPU6050_DMP6」。

打开示例文件

  1. 对代码进行简单修改,将代码103行屏蔽掉,打开120行宏定义。选择开发板及端口号,上传程序。

修改代码

程序下载

  1. 启动Processing,点击「文件」—「打开」,打开MPU6050驱动库MPUTeapot文件夹下MPUTeapot.pde。文件路径为"C:\Users\Tony\Documents\Arduino\libraries\MPU6050\examples\MPU6050_DMP6\Processing\MPUTeapot",其中"Tony"为电脑用户名。

打开Processing程序

  1. 屏蔽代码71行,然后在74行修改添加当前Arduino开发板端口号,例如我的是COM18,然后点击运行。

运行Processing

5. 实验现象

运行Processing后,会出现小飞机模型,晃动MPU6050,小飞机会在3D坐标中运动。

实验现象


关注公众号「TonyCode」,后台回复“3D”,获取文中资源。
TonyCode

  • 4
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
以下是 Arduino Mega2560 获取 MPU6050 角度值的示例代码: ``` #include<Wire.h> const int MPU_addr=0x68; // I2C地址 int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ; void setup(){ Wire.begin(); Wire.beginTransmission(MPU_addr); Wire.write(0x6B); // PWR_MGMT_1寄存器地址 Wire.write(0); // 唤醒MPU-6050 Wire.endTransmission(true); Serial.begin(9600); } void loop(){ Wire.beginTransmission(MPU_addr); Wire.write(0x3B); // 从ACCEL_XOUT_H地址开始读取14个字节 Wire.endTransmission(false); Wire.requestFrom(MPU_addr,14,true); AcX=Wire.read()<<8|Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L) AcY=Wire.read()<<8|Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L) AcZ=Wire.read()<<8|Wire.read(); // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L) Tmp=Wire.read()<<8|Wire.read(); // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L) GyX=Wire.read()<<8|Wire.read(); // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L) GyY=Wire.read()<<8|Wire.read(); // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L) GyZ=Wire.read()<<8|Wire.read(); // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L) float AccX=(float)AcX/16384.0; // 根据灵敏度计算加速度值 float AccY=(float)AcY/16384.0; float AccZ=(float)AcZ/16384.0; float GyroX=(float)GyX/131.0; // 根据灵敏度计算角速度值 float GyroY=(float)GyY/131.0; float GyroZ=(float)GyZ/131.0; float AccAngleX=atan(AccY/sqrt(pow(AccX,2)+pow(AccZ,2)))*180/3.14159265359; // 计算俯仰角 float AccAngleY=atan(-1*AccX/sqrt(pow(AccY,2)+pow(AccZ,2)))*180/3.14159265359; // 计算横滚角 float GyroAngleX=GyroX*0.01; // 根据采样时间计算角度增量 float GyroAngleY=GyroY*0.01; float KalAngleX=0.98*(KalAngleX+GyroAngleX)+0.02*AccAngleX; // 综合加速度计和陀螺仪数据得到最终角度值 float KalAngleY=0.98*(KalAngleY+GyroAngleY)+0.02*AccAngleY; Serial.print("AccX: "); Serial.print(AccX); Serial.print(" AccY: "); Serial.print(AccY); Serial.print(" AccZ: "); Serial.print(AccZ); Serial.print(" GyroX: "); Serial.print(GyroX); Serial.print(" GyroY: "); Serial.print(GyroY); Serial.print(" GyroZ: "); Serial.print(GyroZ); Serial.print(" Temperature: "); Serial.print(Tmp/340.00+36.53); // 计算温度值 Serial.print(" AccAngleX: "); Serial.print(AccAngleX); Serial.print(" AccAngleY: "); Serial.print(AccAngleY); Serial.print(" GyroAngleX: "); Serial.print(GyroAngleX); Serial.print(" GyroAngleY: "); Serial.print(GyroAngleY); Serial.print(" KalAngleX: "); Serial.print(KalAngleX); Serial.print(" KalAngleY: "); Serial.println(KalAngleY); } ``` 这个代码会通过 I2C 通信协议获取 MPU6050 的加速度计和陀螺仪数据,然后使用加速度计和陀螺仪数据计算 MPU6050 的俯仰角和横滚角,并使用卡尔曼滤波算法得到最终的角度值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值