极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 56358|回复: 18

教你利用labview制作 mpu6050角度示波器 arduino采样

[复制链接]
发表于 2014-3-4 17:59:50 | 显示全部楼层 |阅读模式
本帖最后由 哈哈顺 于 2014-3-4 17:59 编辑

       这段时间研究平衡小车,对mpu6050的数据进行分析时,感觉串口一连串的数据看的头痛,下载的示波器又不能用,被逼无奈,就用labview自己制作了一个虚拟示波器,感觉数据变成曲线后更直观,着实觉得labview和arduino功能的强大!

%5Bmedia=x,500,375%5Dhttp://v.youku.com/v_show/id_XNjgwNjc2NjY4.html[/media]




      首先,角度的输出我没有用卡尔曼滤波(其实我不会),直接用的是mpu6050自带的dmp,直接得到角度值,这样在下位机方面就很轻松了(其实上位机编程也不难)
  1. #include "Wire.h"
  2. #include "I2Cdev.h"
  3. #include "MPU6050_6Axis_MotionApps20.h"
  4. MPU6050 mpu(0x68);

  5. bool dmpReady = false;  // set true if DMP init was successful
  6. uint8_t mpuIntStatus;   // holds actual interrupt status byte from MPU
  7. uint8_t devStatus;      // return status after each device operation (0 = success, !0 = error)
  8. uint16_t packetSize;    // expected DMP packet size (default is 42 bytes)
  9. uint16_t fifoCount;     // count of all bytes currently in FIFO
  10. uint8_t fifoBuffer[64]; // FIFO storage buffer

  11. Quaternion q;           // [w, x, y, z]         quaternion container
  12. VectorFloat gravity;    // [x, y, z]            gravity vector
  13. float ypr[3];           // [yaw, pitch, roll]   yaw/pitch/roll container and gravity vector

  14. volatile bool mpuInterrupt = false;     // indicates whether MPU interrupt pin has gone high
  15. void dmpDataReady() {
  16.   mpuInterrupt = true;
  17. }

  18. void setup()
  19. {
  20.   Serial.begin(115200);
  21.   Wire.begin();
  22.   mpu.initialize();
  23.   delay(2);
  24.   devStatus=mpu.dmpInitialize();
  25.   if(devStatus==0)
  26.   {
  27.     mpu.setDMPEnabled(true);
  28.     attachInterrupt(0, dmpDataReady, RISING);
  29.     mpuIntStatus = mpu.getIntStatus();
  30.     dmpReady=true;
  31.     packetSize = mpu.dmpGetFIFOPacketSize();
  32.   }
  33. }

  34. void loop()
  35. {
  36. float x,y,z;
  37.   if(!dmpReady)
  38.      return;
  39.   if (!mpuInterrupt && fifoCount < packetSize)
  40.      return;
  41.   mpuInterrupt = false;
  42.   mpuIntStatus = mpu.getIntStatus();
  43.   fifoCount = mpu.getFIFOCount();
  44.   if ((mpuIntStatus & 0x10) || fifoCount == 1024)
  45.   {
  46.    mpu.resetFIFO();
  47.   }
  48.   else if (mpuIntStatus & 0x02)
  49.   {
  50.      while (fifoCount < packetSize) fifoCount = mpu.getFIFOCount();
  51.      mpu.getFIFOBytes(fifoBuffer, packetSize);
  52.      fifoCount -= packetSize;
  53.      mpu.dmpGetQuaternion(&q, fifoBuffer);
  54.      mpu.dmpGetGravity(&gravity, &q);
  55.      mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);  //从DMP中取出Yaw、Pitch、Roll三个轴的角度,放入数组ypr。单位:弧度
  56.    
  57.      x=(-ypr[2] * 180/M_PI+90)/100.0;
  58.      y=(-ypr[1] * 180/M_PI+90)/100.0;
  59.      z=(-ypr[0] * 180/M_PI+90)/100.0;

  60.      Serial.print(x,4);
  61.      Serial.print(y,4);
  62.     // Serial.print(z,4);
  63.     delay(50);
  64.   }
  65. }
复制代码


       代码中我为什么要将得出的角度值还要加90,然后还除100呢,这个我们可以参考 宜昌城老张大哥的博客(在这要谢谢张大哥,他的博客写的很好):http://www.eefocus.com/zhang700309/blog/11-11/233946_363bf.html
他的采样的是0~5v的电压值,数值位数是固定的(比如1.23V,4位,不要忘了小数点),而我的采样值不仅有负号,而且整数位1~3位,在串口发送之前,我们要怎样处理这样的变动位呢?去掉负号的方法很简单,将角度值加90就可以了,关键是整数位的控制,有以下两方法
       方法一:在下位机程序里将接收到mpu6050的数据由数值变成字符,如果整数位为1位,则前加两个00,如果整数位为两位,则前加一个0,然后再传给pc,这样显然很繁琐,给下位机程序编写增加负担,而且由于不同的传感器还要大幅度改下位机的程序,导致没有推广性;
       方法二:经过一上午的冥思苦想和实验,我发现:要使整数位数固定,不够前端加0的方法,以我现在的知识很难实现,但是是小数位后的位数的固定就很容易了,用Serial.print(x,4)就可以实现了,所以我把下位机采集的数据除以100,这样就变成张大哥博客里的类型的么,例如:陀螺仪获得x轴的角度为-25.36°,y轴角度为56.35°,加90后除以100后分变为0.6464和1.4635,通过串口发送的形式为0.64641.4635(前6位关于x轴,后6为关于y轴),发送的位数成功固定,接下来就是上位机的事了!

labview程序图:


       Labview将字符串的前6位和后6位分离,然后变成数值,跟下位机(arduino)处里数据的顺序相反,你懂得!
       最后感谢弘毅老师以及其他访客的无私的分享和教导,开源才能撑起中国梦!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2014-3-4 18:45:44 | 显示全部楼层
推荐用serialChart
回复 支持 反对

使用道具 举报

发表于 2014-3-5 09:02:45 | 显示全部楼层
感谢楼主的分享。
回复 支持 反对

使用道具 举报

发表于 2014-3-5 10:47:37 | 显示全部楼层
楼主,你{:soso_e179:}
回复 支持 反对

使用道具 举报

发表于 2014-3-5 10:49:03 | 显示全部楼层
在Labview做成姿态识别就更牛了{:soso_e179:}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-5 16:13:38 | 显示全部楼层
palm 发表于 2014-3-5 09:02
感谢楼主的分享。

不用客气,互相学习的!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-5 16:17:09 | 显示全部楼层
savagego 发表于 2014-3-4 18:45
推荐用serialChart

关于arduino 串口编程的讲解有木?
回复 支持 反对

使用道具 举报

发表于 2014-3-6 14:17:46 | 显示全部楼层
哈哈顺 发表于 2014-3-5 16:17
关于arduino 串口编程的讲解有木?

http://www.geek-workshop.com/thread-554-1-1.html
回复 支持 反对

使用道具 举报

发表于 2014-3-7 08:43:46 | 显示全部楼层
labview是不错的语言,但在图形绘制方面还是不很方便。这点Processing还是好点!但可能瓣版Labview会好些!楼主可以加[email protected]
回复 支持 反对

使用道具 举报

发表于 2014-3-7 19:17:14 | 显示全部楼层
好帖子~~~~~~
回复 支持 反对

使用道具 举报

发表于 2014-3-19 09:33:51 | 显示全部楼层
你用的DMP是arduino库的,慢慢看看,虚拟示波器不错,应该叫串口示波器
回复 支持 反对

使用道具 举报

发表于 2014-3-29 00:11:43 | 显示全部楼层
处理浮点数的方式不错!!!{:soso_e179:}
回复 支持 反对

使用道具 举报

发表于 2014-4-15 16:19:05 | 显示全部楼层
不错,学习了
回复 支持 反对

使用道具 举报

发表于 2014-5-7 10:59:48 | 显示全部楼层
好帖子~~~~~~
回复 支持 反对

使用道具 举报

发表于 2014-7-30 15:01:27 | 显示全部楼层
可以請問怎麼測出 Z的角度嗎 ? 哪位大大知道 小弟在做專題卡住了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 05:58 , Processed in 0.052042 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表