文档章节

Arduino 与 MPU6050 姿态解算+ PROCESSING

quanwei9958
 quanwei9958
发布于 2015/07/18 16:58
字数 753
阅读 3959
收藏 7

    买的MPU6050自带姿态解算大大减轻了上层处理器所做的工作。 通过熟悉了一下processing之后做了一个小例子更是感觉这个传感器的奇妙。

Arduino部分

  主要是读取MPU6050数据并将采集到的欧拉角通过串口打印到上位机,采集数据很简单,MPU6050接到arduino mega2560的serial1上便可接收数据,然后通过serial传输到电脑上。MPU6050自带了卡尔曼滤波,所以上层更是直接使用了数据,观测得误差确实很少,很实用的传感器。

   注: MPU6050使用的是串口模式,配置时掉电保存的,波特率为9600

   

#include <Wire.h>
byte A[11];

void setup()
{
	Serial.begin(115200);
	Serial1.begin(9600);
	Serial.println("initial ...");
	Serial1.write(0xff);
	Serial1.write(0xaa);
	Serial1.write(0x52);
	Serial1.flush();
	Serial.println("end");
}

static int counter=0;
char buffer[20];
void loop()
{
	if(counter==0&&A[0]==0x55)
	{
		int index=2;
		switch(A[1])
		{
			case 0x53:
			{
				
				float xa=(A[index]|(A[index+1]<<8))/32768.0*180;
				float ya=(A[index+2]|(A[index+3]<<8))/32768.0*180;
				float za=(A[index+4]|(A[index+5]<<8))/32768.0*180;
				//if(abs(temp-97.77)<3) break;
				//sprintf(buffer,"%lf,",xa);
				Serial.print("x=");
				Serial.println(xa);
				//sprintf(buffer,"%lf,",ya);
				Serial.print("y=");
				Serial.println(ya);
				//sprintf(buffer,"%lf",za);
				Serial.print("z=");
				Serial.println(za);
				A[0]=0;
				delay(50);
			}
				break;
			default:
			break;
		}
	}
}

void serialEvent1()
{
	while(Serial1.available())
	{
		A[counter]=Serial1.read();
		if(counter==0&&A[counter]!=0x55) return;
		counter=(counter+1)%11;
	}
}
void serialEvent()
{
	char buf[255];
	int i=0;
	while(Serial.available()) buf[i++]=Serial.read();
	buf[i]=0;
	if(strcmp("stop",buf)==0) Serial1.end();
	else if(strcmp("run",buf)==0) Serial1.begin(115200);
}



   

  MPU6050的四根线连到arduino后便可源源不断地接收到数据,上传到电脑上的格式为:
 x=12.44

 y=56.01

 z=67.34

  下面的processing程序会根据这个来解析收到的数据并且调整姿态。

  Processing部分

   processing这个程序昨天第一次听说,看到国外视频里有人做的模型看着实在舒服,所以也想尝试一下。虽然官网上称Processing为一门语言,不过个人感觉语法就是java+opengl+p3d+c++混合而成。传送门

   通过arduino串口发送出来的消息,在processing接收处理,没有太多可说的,大致感觉下

 processing

 

import processing.serial.*;
import processing.opengl.*;

Serial myserial;
float value[]=new float[4];
String rf[]=new String[4];
PGraphics graphics1;
PGraphics graphics2;
PGraphics graphics3;
PGraphics graphics4;
void setup()
{
  size(600,600,P2D);
  String name="COM5";
  myserial=new Serial(this,name,115200);
  smooth();
  for(int i=0;i<4;++i) value[i]=0;
  
   
   graphics1=createGraphics(298,298,OPENGL);
   graphics2=createGraphics(298,298,OPENGL);
   graphics3=createGraphics(298,298,OPENGL);
   graphics4=createGraphics(298,298,OPENGL);
   textMode(MODEL);
   textSize(32);
}
long lasttime=0;

void draw() 
{
  frameRate(60);
  drawRect(graphics1,0,0,1,0); //FONT
  drawRect(graphics2,90,0,1,0);//lLEFT
  drawRect(graphics3,-90,1,0,0);//TOP
  drawRect(graphics4,90,1,1,0);//RANDOM
  
  image(graphics1,0,0);
  image(graphics2,300,0);
  image(graphics3,0,300);
  image(graphics4,300,300);
  fill(248,147,147);
  text("FONT VIEW",10,50);
  text("LEFT VIEW",310,50);
  text("TOP VIEW",10,350);
  text("RANDOM VIEW",310,350);
  lasttime=millis();
}

void drawRect(PGraphics pg,float rot,int x,int y,int z)
{
  pg.beginDraw();
  pg.lights();
  pg.background(126);
  pg.textSize(20);
  pg.fill(3,60,244);
  long framerate=1000/(millis()-lasttime);
  pg.text("fps:"+framerate,200,20);
  
  pg.fill(246,225,65);
  pg.translate(100,100,-100);
  pg.rotate(rot*PI/180,x,y,z);
  pg.rotateY(value[2]*PI/180);
  pg.rotateZ(-value[1]*PI/180);
  pg.rotateX(value[0]*PI/180);
  pg.box(50,50,100);
  pg.endDraw();
}
String st;
void serialEvent(Serial p)
{
    st=p.readStringUntil(10);
    if(st==null) return;
    if(st.indexOf("x=")!=-1)
    {
      value[0]=float(st.substring(2));
    }
    else if(st.indexOf("y=")!=-1)
    {
      value[1]=float(st.substring(2));
    }
    else if(st.indexOf("z=")!=-1)
    {
      value[2]=float(st.substring(2));
    }
}

  另外做了一个演示视频 click

       



© 著作权归作者所有

quanwei9958

quanwei9958

粉丝 29
博文 79
码字总数 36250
作品 0
程序员
私信 提问
加载中

评论(1)

开源X
开源X
刚刚买了这个MPU6050 想搜点资料,来到开源中国了……
四旋翼姿态解算--互补滤波和拓展卡尔曼

小记一下做的四旋翼姿态解算。 关于利用互补滤波进行姿态解算的文章随便一搜就有很多,就不列出来了。关于卡尔曼的理解和原理,觉得这篇挺通俗易懂的,(二)中还附有matlab代码: 卡尔曼滤波...

hxudhdjuf
2018/03/17
0
0
[芯片][MPU6050] MPU60X0的DMP相关链接

标题:发个自己做的UD分解+强跟踪卡尔曼滤波做的双轴姿态测量 链接:http://www.amobbs.com/thread-5511854-1-1.html 关键词:UD分解+强跟踪卡尔曼滤波,采用陀螺+加速度传感器的数据融合,惯...

史迪奇2号
2017/01/25
0
0
快要插爆了。。。。

最近忙着做个小车,其实是机器人,但别人说不象,无所谓,我就权且说它是小车,哈。自己给自己挖个坑,给小朋友搞活动没器材,机器人厂家不给力,我要的指标没有货,索性自己玩了。测试用的开...

中山野鬼
2015/10/31
1K
15
[stm32] MPU6050 HMC5883 Kalman 融合算法移植

一、卡尔曼滤波九轴融合算法stm32尝试 1、Kalman滤波文件[.h已经封装为结构体] Kalman.h 2、I2C总线代码[这里把MPU和HMC挂接到上面,通过改变SlaveAddress的值来和不同的设备通信] I2C.c 3、...

史迪奇2号
2017/05/28
0
0
MPU6050开发 -- 在 C52 单片机上测试

用了三篇文章,从 MPU6050的初识,相关基本概念,到 I2C/SPI通信协议都讲了一下。现在可以上手来测试了。 手头没有什么Arduino的开发板,只有两款,一个是郭天祥的STC89C52单片机,另一个S5P...

qq_29350001
2017/11/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

3_数组

3_数组

行者终成事
今天
7
0
经典系统设计面试题解析:如何设计TinyURL(二)

原文链接:https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR 编者注:本文以一道经典的系统设计面试题:《如何设计TinyURL》的参考答案和解析为例,帮助...

APEMESH
今天
7
0
使用logstash同步MySQL数据到ES

概述   在生成业务常有将MySQL数据同步到ES的需求,如果需要很高的定制化,往往需要开发同步程序用于处理数据。但没有特殊业务需求,官方提供的logstash就很有优势了。   在使用logstas...

zxiaofan666
今天
10
0
X-MSG-IM-分布式信令跟踪能力

经过一周多的鏖战, X-MSG-IM的分布式信令跟踪能力已基本具备, 特点是: 实时. 只有要RX/TX就会实时产生信令跟踪事件, 先入kafka, 再入influxdb待查. 同时提供实时sub/pub接口. 完备. 可以完整...

dev5
今天
7
0
OpenJDK之CyclicBarrier

OpenJDK8,本人看的是openJDK。以前就看过,只是经常忘记,所以记录下 图1 CyclicBarrier是Doug Lea在JDK1.5中引入的,作用就不详细描述了,主要有如下俩个方法使用: await()方法,如果当前线...

克虏伯
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部