微型四轴设计之通过arduino读取MPU6050原始数据

概述


  • 打算自己选型配件、画PCB以及焊元件,制作一个微型四轴飞行器。
  • 主控板打算使用stm32,此处使用arduino来读取mpu6050只是为了便于开发和调试(arduino的串口监视器用起来很方便,便于打印输出调试信息到电脑),同时熟悉一下mpu6050的使用流程。

开发环境


  • 操作系统:windows 10
  • IDE:arduino 1.8.3
  • 开发板:Arduino/Genuino Uno(seeedstudio与Arduino LLC为中国爱好者定制的中文版的开发板,与市面常见的Arduino Uno R3基本没什么区别)
  • 六轴传感器模块:MPU6050

接线说明


  • 具体接线如表所示。arduino开发板需要通过usb线与电脑相连。mpu6050的AD0引脚暂时不需要考虑接线(实际测试过,这个引脚拉低或不接对结果无影响)。

    arduino引脚mpu6050引脚
    GNDGND
    3.3VVCC
    SCLSCL
    SDASDA
  • 此处附上实物图
    mpu6050接线
    arduino接线1
    arduino接线2

程序流程


初始化I2C和串口

void setup() {
  Wire.begin();//默认作为master设备打开
  Serial.begin(9600);//串口通讯的波特率设置为9600
}

使MPU6050开始工作

  • 为了使MPU6050开始工作,需要向MPU6050的0x6B寄存器写入0数据(最开始照着别人的例程写的时候,把0x6b错看成0x68(大写的B和8好难分清),最后读取的结果要么是0要么是-1)
Wire.beginTransmission(0x68);//MPU6050对应的I2C slave设备地址是0x68
Wire.write(0x6b);//写入下一步要写的寄存器地址0x6b
Wire.write(0);//向0x6b寄存器写入0,使MPU6050开始工作
Wire.endTransmission(true);

读取数据

  • 一共需要读取7个寄存器的数据,每个寄存器均为16位的,所以一共是14个字节。
  • 7个寄存器分别保存的是x、y、z方向的加速度,温度,x、y、z方向的角速度。
  • 7个寄存器地址分别是0x3b、ox3d、0x3f、0x41、0x43、0x45和0x47(按照字节编址,每个寄存器两个字节,7个寄存器位于连续存储空间)。
  int x,y,z = 0;//用来保存加速度数据
  int t = 0;//用来保存温度数据
  int a,b,c = 0;//用来保存角速度数据
  Wire.beginTransmission(0x68);
  Wire.write(0x3B);//写入要读取的寄存器的起始地址0x3B
  Wire.requestFrom(0x68, 14, true);//以该地址为起始地址,依次读取14个字节的数据到缓冲区
  Wire.endTransmission(true);

源码


此处给出完整源码。

#include <Wire.h>

void setup() {
  // put your setup code here, to run once:
  Wire.begin();//默认作为master设备打开
  Serial.begin(9600);//串口通讯的波特率设置为9600
  Wire.beginTransmission(0x68);//MPU6050对应的I2C slave设备地址是0x68
  Wire.write(0x6B);//写入下一步要写的寄存器地址0x6b
  Wire.write(0);//向0x6b寄存器写入0,使MPU6050开始工作
  Wire.endTransmission(true);
}

void loop() {
  int x,y,z = 0;//用来保存加速度数据
  int t = 0;//用来保存温度数据
  int a,b,c = 0;//用来保存角速度数据
  Wire.beginTransmission(0x68);
  Wire.write(0x3B);//写入要读取的寄存器的起始地址0x3B
  Wire.requestFrom(0x68, 14, true);//以该地址为起始地址,依次读取14个字节的数据到缓冲区
  Wire.endTransmission(true);
  x = Wire.read() << 8 | Wire.read();//每次从缓冲区读取一个字节,先读高字节,再读低字节,高字节左移八位,低位补0,再与低字节作或运算,即可得到一个寄存器(长度为2个字节)的完整数据
  y = Wire.read() << 8 | Wire.read();
  z = Wire.read() << 8 | Wire.read();
  t = Wire.read() << 8 | Wire.read();
  a = Wire.read() << 8 | Wire.read();
  b = Wire.read() << 8 | Wire.read();
  c = Wire.read() << 8 | Wire.read();
  Serial.print("Ax = ");//向串口打印输出结果
  Serial.print(x);
  Serial.print('\t');
  Serial.print("Ay = ");
  Serial.print(y);
  Serial.print('\t');
  Serial.print("Az = ");
  Serial.print(z);
  Serial.print('\t');
  Serial.print("temperature = ");
  Serial.print(t);
  Serial.print('\t');
  Serial.print("Cx = ");
  Serial.print(a);
  Serial.print('\t');
  Serial.print("Cy = ");
  Serial.print(b);
  Serial.print('\t');
  Serial.print("Cz = ");
  Serial.println(c);
  delay(20);
}

结果截图


  • 打开arduino IDE的【工具】–>【串口监视器】(设置波特率为9600),编译并上传程序到开发板,可以查看读取的数据。
    串口监视器的输出结果
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页