暴走小方块 陀螺仪mpu6050加oled,已添加视频
本帖最后由 暴走魔方 于 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。
显示动画部分有能力的小伙伴可以自己编辑一个,立体的跟随陀螺仪动也是很酷炫的。
#include <I2Cdev.h>
#include <MPU6050.h>
#include <Wire.h>
#include "math.h"
#include "U8glib.h"
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);
//U8GLIB_SH1106_128X64 u8g(13, 11, 10, 9);
//U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_NO_ACK|U8G_I2C_OPT_FAST); // Fast I2C / TWI
// HW SPI Com: CS = 10, A0 = 9 (Hardware Pins areSCK = 13 and MOSI = 11)
//====set offset of x,y,z===========
#define Gx_offset -3.06
#define Gy_offset 1.01
#define Gz_offset -0.88
#define LED0 8
#define LED1 9
#define LED2 10
#define LED3 11
//====================
MPU6050 accelgyro;
int16_t ax,ay,az;
int16_t gx,gy,gz;//Storing original data
float aax,aay,aaz,ggx,ggy,ggz;//The quantized data is stored
float Ax,Ay,Az;// g(9.8m/s^2)
float Gx,Gy,Gz;// °/s
int left,right,head,back;
int Mx,My,Mz,Nx,Ny,Nz;
float Angel_accX,Angel_accY,Angel_accZ,A,B,C;//Storing the calculated angle by acceleration
long LastTime,NowTime,TimeSpan;//Integral to the angular velocity
void setup()
{
Wire.begin();
Serial.begin(115200);
Serial.println("Initializing I2C device.....");
accelgyro.initialize();
Serial.println("Testing device connections...");
Serial.println(accelgyro.testConnection() ? "MPU6050 connection successful":"MPU6050 connection failure");
pinMode(LED0,OUTPUT);
pinMode(LED1,OUTPUT);
pinMode(LED2,OUTPUT);
pinMode(LED3,OUTPUT);
}
void u8g_prepare(void) {
u8g.setFont(u8g_font_6x10);
u8g.setFontRefHeightExtendedText();
u8g.setDefaultForegroundColor();
u8g.setFontPosTop();
}
void u8g_box_frame() {
//u8g.drawLine(90,35,Mz,Nz);//z
//u8g.drawLine(90,35,My,Ny);//y
//u8g.drawLine(90,35,80,50);//x
B = -Angel_accX+32;
A = -Angel_accY+64;
u8g.drawFrame(A, B, 20, 20);
}
void Rotate() {
if((-90<=Angel_accY)&&(Angel_accY<=0)&&(0<=Angel_accZ)&&(Angel_accZ<=90))
{
My=90+30*cos(Angel_accY);
Ny=35-30*sin(Angel_accY);
Mz=90+30*cos(Angel_accZ);
Nz=35-30*sin(Angel_accZ);
}
else if((-90<=Angel_accY)&&(Angel_accY<=0)&&(-90<=Angel_accZ)&&(Angel_accZ<=0))
{
My=90+30*cos(Angel_accY);
Ny=35-30*sin(Angel_accY);
Mz=90+30*cos(Angel_accZ);
Nz=35-30*sin(Angel_accZ);
}
else if((0<=Angel_accY)&&(Angel_accY<=90)&&(-90<=Angel_accZ)&&(Angel_accZ<=0))
{
My=90-30*cos(Angel_accY);
Ny=35-30*sin(Angel_accY);
Mz=90+30*cos(Angel_accZ);
Nz=35-30*sin(Angel_accZ);
}
else if((0<=Angel_accY)&&(Angel_accY<=90)&&(0<=Angel_accZ)&&(Angel_accZ<=90))
{
My=90+30*cos(Angel_accY);
Ny=35-30*sin(Angel_accY);
Mz=90-30*cos(Angel_accZ);
Nz=35-30*sin(Angel_accZ);
}
}
void draw(void) {
u8g_prepare();
u8g_box_frame();
Rotate();
u8g.setFont(u8g_font_6x10);
u8g.setPrintPos(0, 16);
u8g.print("X:");
u8g.print(Angel_accX);
u8g.setPrintPos(0, 32);
u8g.print("Y:");
u8g.print(Angel_accY);
u8g.setPrintPos(0, 48);
u8g.print("Z:");
u8g.print(Angel_accZ);
u8g.setPrintPos(0, 0);
u8g.print(right);
u8g.setPrintPos(8, 0);
u8g.print("--");
u8g.print(left);
u8g.setPrintPos(24, 0);
u8g.print("--");
u8g.print(head);
u8g.setPrintPos(40, 0);
u8g.print("--");
u8g.print(back);
}
void loop()
{
accelgyro.getMotion6(&ax,&ay,&az,&gx,&gy,&gz);//Being three-axis acceleration and angular velocity
//======get Acceleration values of x,y,z
Ax=ax/16384.00;
Ay=ay/16384.00;
Az=az/16384.00;
//==========there are calculated angle between thethree axes of coordinate system by acceleration
Angel_accX=atan(Ax/sqrt(Az*Az+Ay*Ay))*180/3.14;
Angel_accY=atan(Ay/sqrt(Ax*Ax+Az*Az))*180/3.14;
Angel_accZ=atan(Az/sqrt(Ax*Ax+Ay*Ay))*180/3.14;
//==============================
delay(10);//This is used to control the sampling rate
//stop
if((-5<=Angel_accX)&&(Angel_accX<=5)&&(-5<=Angel_accY)&&(Angel_accY<=5)&&(85<=Angel_accZ)&&(Angel_accZ<=90))
{
right=0;left=0;head=0;back=0;
}
//right
else if((-15<=Angel_accX)&&(Angel_accX<=15)&&(-90<=Angel_accY)&&(Angel_accY<=-5)&&(-5<=Angel_accZ)&&(Angel_accZ<=84))
{
right=1;left=0;head=0;back=0;
}
//left
else if((-15<=Angel_accX)&&(Angel_accX<=15)&&(-5<=Angel_accY)&&(Angel_accY<=84)&&(-5<=Angel_accZ)&&(Angel_accZ<=90))
{
right=0;left=1;head=0;back=0;
}
//head
else if((-5<=Angel_accX)&&(Angel_accX<=90)&&(-15<=Angel_accY)&&(Angel_accY<=15)&&(-5<=Angel_accZ)&&(Angel_accZ<=84))
{
right=0;left=0;head=1;back=0;
}
//back
else if((-90<=Angel_accX)&&(Angel_accX<=-5)&&(-15<=Angel_accY)&&(Angel_accY<=15)&&(-5<=Angel_accZ)&&(Angel_accZ<=84))
{
right=0;left=0;head=0;back=1;
}
digitalWrite(LED0, right);
digitalWrite(LED1, left);
digitalWrite(LED2, head);
digitalWrite(LED3, back);
u8g.firstPage();
do {
draw();
} while( u8g.nextPage() );
}
图片如下
gps小盒子,这里先不写了,用的是1.3的屏,锂电,neomv2模块
库文件
效果图呢? Cambridge 发表于 2016-9-17 12:45
效果图呢?
加上了视频,可以看一看。 gps小盒子,屏幕布局设计的非常不错,希望能放出代码借鉴下了! 是基于老潘兄的代码吗?GPS,加油! 本帖最后由 暴走魔方 于 2016-9-21 17:07 编辑
wetnt 发表于 2016-9-19 20:39
gps小盒子,屏幕布局设计的非常不错,希望能放出代码借鉴下了!
好的,有时间上写上,gps能搜到的,可以看看楼下的大神的帖子哦 本帖最后由 暴走魔方 于 2016-9-21 17:07 编辑
沧海笑1122 发表于 2016-9-20 23:14
是基于老潘兄的代码吗?GPS,加油!
我看的是你的帖子,希望通过学习,做点自己的作品 用的是可以直接输出角度的吗 ILLUSION 发表于 2016-9-27 11:49
用的是可以直接输出角度的吗
是啊,直接输出角度的 暴走魔方 发表于 2016-9-29 17:50
是啊,直接输出角度的
为嘛我的OLED0.96的屏不亮。。。 暴走魔方 发表于 2016-9-18 15:43
加上了视频,可以看一看。
很棒!!! 本帖最后由 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的好,具体原因不明。
页:
[1]