极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 32570|回复: 11

暴走小方块 陀螺仪mpu6050加oled,已添加视频

[复制链接]
发表于 2016-9-17 12:07:22 | 显示全部楼层 |阅读模式
本帖最后由 暴走魔方 于 2016-11-7 16:49 编辑

视频地址
http://www.miaopai.com/show/~zf74T4W-4xtQY2n6H9ExQ__.htm

6050和oled屏都是I2C。
scl 连a5 ,sda 连a4。led连线 8,9,10,11。
当然,用1.3寸屏的,也给加进去了,用的spi,用的话再改一下led的io口。
用料:nano*1,MPU6050*1,0.96寸oled*1,led灯*4。

显示动画部分有能力的小伙伴可以自己编辑一个,立体的跟随陀螺仪动也是很酷炫的。


  1. #include <I2Cdev.h>
  2. #include <MPU6050.h>
  3. #include <Wire.h>
  4. #include "math.h"
  5. #include "U8glib.h"

  6. U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);       
  7. //U8GLIB_SH1106_128X64 u8g(13, 11, 10, 9);
  8. //U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_NO_ACK|U8G_I2C_OPT_FAST);        // Fast I2C / TWI [/size][/font][/align]

  9. // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are  SCK = 13 and MOSI = 11)

  10. //====set offset of x,y,z===========
  11. #define Gx_offset -3.06
  12. #define Gy_offset 1.01
  13. #define Gz_offset -0.88

  14. #define LED0 8
  15. #define LED1 9
  16. #define LED2 10
  17. #define LED3 11

  18. //====================
  19. MPU6050 accelgyro;

  20. int16_t ax,ay,az;

  21. int16_t gx,gy,gz;//Storing original data
  22. float aax,aay,aaz,ggx,ggy,ggz;//The quantized data is stored
  23. float Ax,Ay,Az;// g(9.8m/s^2)
  24. float Gx,Gy,Gz;// °/s
  25. int left,right,head,back;
  26. int Mx,My,Mz,Nx,Ny,Nz;

  27. float Angel_accX,Angel_accY,Angel_accZ,A,B,C;//Storing the calculated angle by acceleration

  28. long LastTime,NowTime,TimeSpan;//Integral to the angular velocity


  29. void setup()
  30. {
  31.   Wire.begin();

  32.   Serial.begin(115200);

  33.   Serial.println("Initializing I2C device.....");
  34.   accelgyro.initialize();

  35.   Serial.println("Testing device connections...");
  36.   Serial.println(accelgyro.testConnection() ? "MPU6050 connection successful":"MPU6050 connection failure");

  37.   pinMode(LED0,OUTPUT);
  38.   pinMode(LED1,OUTPUT);
  39.   pinMode(LED2,OUTPUT);
  40.   pinMode(LED3,OUTPUT);
  41. }
  42. void u8g_prepare(void) {
  43.   u8g.setFont(u8g_font_6x10);
  44.   u8g.setFontRefHeightExtendedText();
  45.   u8g.setDefaultForegroundColor();
  46.   u8g.setFontPosTop();
  47. }

  48. void u8g_box_frame() {
  49.   //u8g.drawLine(90,35,Mz,Nz);//z
  50.   //u8g.drawLine(90,35,My,Ny);//y
  51.   //u8g.drawLine(90,35,80,50);//x
  52.   B = -Angel_accX+32;
  53.   A = -Angel_accY+64;
  54.   u8g.drawFrame(A, B, 20, 20);
  55. }


  56. void Rotate() {
  57. if((-90<=Angel_accY)&&(Angel_accY<=0)&&(0<=Angel_accZ)&&(Angel_accZ<=90))
  58. {
  59. My=90+30*cos(Angel_accY);
  60. Ny=35-30*sin(Angel_accY);
  61. Mz=90+30*cos(Angel_accZ);
  62. Nz=35-30*sin(Angel_accZ);
  63. }
  64. else if((-90<=Angel_accY)&&(Angel_accY<=0)&&(-90<=Angel_accZ)&&(Angel_accZ<=0))
  65. {
  66. My=90+30*cos(Angel_accY);
  67. Ny=35-30*sin(Angel_accY);
  68. Mz=90+30*cos(Angel_accZ);
  69. Nz=35-30*sin(Angel_accZ);
  70. }
  71. else if((0<=Angel_accY)&&(Angel_accY<=90)&&(-90<=Angel_accZ)&&(Angel_accZ<=0))
  72. {
  73. My=90-30*cos(Angel_accY);
  74. Ny=35-30*sin(Angel_accY);
  75. Mz=90+30*cos(Angel_accZ);
  76. Nz=35-30*sin(Angel_accZ);
  77. }
  78. else if((0<=Angel_accY)&&(Angel_accY<=90)&&(0<=Angel_accZ)&&(Angel_accZ<=90))
  79. {
  80. My=90+30*cos(Angel_accY);
  81. Ny=35-30*sin(Angel_accY);
  82. Mz=90-30*cos(Angel_accZ);
  83. Nz=35-30*sin(Angel_accZ);
  84. }
  85. }
  86. void draw(void) {
  87.   u8g_prepare();
  88.   u8g_box_frame();
  89.   Rotate();
  90.   u8g.setFont(u8g_font_6x10);
  91.   u8g.setPrintPos(0, 16);
  92.   u8g.print("X:");
  93.   u8g.print(Angel_accX);
  94.   u8g.setPrintPos(0, 32);
  95.   u8g.print("Y:");
  96.   u8g.print(Angel_accY);
  97.   u8g.setPrintPos(0, 48);
  98.   u8g.print("Z:");
  99.   u8g.print(Angel_accZ);

  100.   u8g.setPrintPos(0, 0);
  101.   u8g.print(right);
  102.   u8g.setPrintPos(8, 0);
  103.   u8g.print("--");
  104.   u8g.print(left);
  105.   u8g.setPrintPos(24, 0);
  106.    u8g.print("--");
  107.   u8g.print(head);
  108.   u8g.setPrintPos(40, 0);
  109.   u8g.print("--");
  110.   u8g.print(back);
  111. }
  112. void loop()
  113. {
  114.   accelgyro.getMotion6(&ax,&ay,&az,&gx,&gy,&gz);//Being three-axis acceleration and angular velocity

  115. //======get Acceleration values of x,y,z
  116.    Ax=ax/16384.00;
  117.    Ay=ay/16384.00;
  118.    Az=az/16384.00;
  119.    //==========there are calculated angle between thethree axes of coordinate system by acceleration
  120.    Angel_accX=atan(Ax/sqrt(Az*Az+Ay*Ay))*180/3.14;
  121.    Angel_accY=atan(Ay/sqrt(Ax*Ax+Az*Az))*180/3.14;
  122.    Angel_accZ=atan(Az/sqrt(Ax*Ax+Ay*Ay))*180/3.14;

  123.   //==============================


  124.   delay(10);//This is used to control the sampling rate
  125.   //stop
  126.   if((-5<=Angel_accX)&&(Angel_accX<=5)&&(-5<=Angel_accY)&&(Angel_accY<=5)&&(85<=Angel_accZ)&&(Angel_accZ<=90))
  127.   {
  128. right=0;left=0;head=0;back=0;
  129.   }
  130.   //right
  131.   else if((-15<=Angel_accX)&&(Angel_accX<=15)&&(-90<=Angel_accY)&&(Angel_accY<=-5)&&(-5<=Angel_accZ)&&(Angel_accZ<=84))
  132.   {
  133. right=1;left=0;head=0;back=0;
  134.   }
  135.     //left
  136.   else if((-15<=Angel_accX)&&(Angel_accX<=15)&&(-5<=Angel_accY)&&(Angel_accY<=84)&&(-5<=Angel_accZ)&&(Angel_accZ<=90))
  137.   {
  138. right=0;left=1;head=0;back=0;
  139.   }
  140.     //head
  141.   else if((-5<=Angel_accX)&&(Angel_accX<=90)&&(-15<=Angel_accY)&&(Angel_accY<=15)&&(-5<=Angel_accZ)&&(Angel_accZ<=84))
  142.   {
  143. right=0;left=0;head=1;back=0;
  144.   }
  145.     //back
  146.   else if((-90<=Angel_accX)&&(Angel_accX<=-5)&&(-15<=Angel_accY)&&(Angel_accY<=15)&&(-5<=Angel_accZ)&&(Angel_accZ<=84))
  147.   {
  148. right=0;left=0;head=0;back=1;
  149.   }

  150.   digitalWrite(LED0, right);
  151.   digitalWrite(LED1, left);
  152.   digitalWrite(LED2, head);
  153.   digitalWrite(LED3, back);


  154.     u8g.firstPage();  
  155.   do {
  156.     draw();
  157.   } while( u8g.nextPage() );
  158. }
复制代码

图片如下

gps小盒子,这里先不写了,用的是1.3的屏,锂电,neomv2模块


库文件








本帖子中包含更多资源

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

x
回复

使用道具 举报

 楼主| 发表于 2016-9-18 15:43:27 | 显示全部楼层

加上了视频,可以看一看。
回复 支持 反对

使用道具 举报

发表于 2016-9-19 20:39:17 | 显示全部楼层
gps小盒子,屏幕布局设计的非常不错,希望能放出代码借鉴下了!
回复 支持 反对

使用道具 举报

发表于 2016-9-20 23:14:03 | 显示全部楼层
是基于老潘兄的代码吗?GPS,加油!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-9-21 13:00:53 | 显示全部楼层
本帖最后由 暴走魔方 于 2016-9-21 17:07 编辑
wetnt 发表于 2016-9-19 20:39
gps小盒子,屏幕布局设计的非常不错,希望能放出代码借鉴下了!


好的,有时间上写上,gps能搜到的,可以看看楼下的大神的帖子哦
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-9-21 17:04:45 | 显示全部楼层
本帖最后由 暴走魔方 于 2016-9-21 17:07 编辑
沧海笑1122 发表于 2016-9-20 23:14
是基于老潘兄的代码吗?GPS,加油!


我看的是你的帖子,希望通过学习,做点自己的作品
回复 支持 反对

使用道具 举报

发表于 2016-9-27 11:49:38 | 显示全部楼层
用的是可以直接输出角度的吗
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-9-29 17:50:31 | 显示全部楼层
ILLUSION 发表于 2016-9-27 11:49
用的是可以直接输出角度的吗

是啊,直接输出角度的
回复 支持 反对

使用道具 举报

发表于 2016-10-12 11:02:15 | 显示全部楼层
暴走魔方 发表于 2016-9-29 17:50
是啊,直接输出角度的

为嘛我的OLED0.96的屏不亮。。。
回复 支持 反对

使用道具 举报

发表于 2016-10-25 12:13:04 | 显示全部楼层
暴走魔方 发表于 2016-9-18 15:43
加上了视频,可以看一看。

很棒!!!
回复 支持 反对

使用道具 举报

发表于 2016-10-26 09:43:09 | 显示全部楼层
本帖最后由 jjwy 于 2016-10-26 09:55 编辑
ILLUSION 发表于 2016-10-12 11:02
为嘛我的OLED0.96的屏不亮。。。


分i2c和spi,二者接线不一样。i2c是接a4,a5。spi接SCK = 13, MOSI = 11, CS = 10, A0 = 9,先看点亮液晶屏的帖子,再看这个会好点。i2c简单点,并不冲突。1.3的屏质量明显比0.96的好,具体原因不明。
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-9 16:14 , Processed in 0.041730 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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