链接线缆;
Vcc=3.3V;
GND;
SCL=5;
SDA=23;
查询MPU地址:
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <Wire.h>
void setup() {
Wire.begin(23, 5); // SDA, SCL
Serial.begin(115200);
}
void loop() {
byte error, address;
for(address=0x01; address<0x7F; address++) {
Wire.beginTransmission(address);
error = Wire.endTransmission();
if(error==0) Serial.printf("找到设备:0x%02X\n", address);
}
delay(5000);
}
A00悬空或者链接GND=地址是默认地址0x68;
A00链接VCC=地址未0x69;
读取MPU内部数据:
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <Wire.h>
Adafruit_MPU6050 mpu;
void setup() {
Wire.begin(23, 5); // SDA, SCL
Serial.begin(115200);
if(mpu.begin(0x68,&Wire,0)){
Serial.println("weifaxxian\r\n");
while(1);
// 配置传感器参数
mpu.setAccelerometerRange(MPU6050_RANGE_8_G); // ±8g
Serial.println("加速度计量程: ±8G");
mpu.setGyroRange(MPU6050_RANGE_500_DEG); // ±500°/s
Serial.println("陀螺仪量程: ±500°/s");
mpu.setFilterBandwidth(MPU6050_BAND_21_HZ); // 21Hz
Serial.println("滤波器带宽: 21Hz");
delay(500); // 稳定时间
}
}
void loop() {
// 获取传感器数据
sensors_event_t a, g, temp;
mpu.getEvent(&a, &g, &temp);
// 打印加速度数据
Serial.print("加速度(m/s²) | X:");
Serial.print(a.acceleration.x, 2); // 保留2位小数
Serial.print("\tY:");
Serial.print(a.acceleration.y, 2);
Serial.print("\tZ:");
Serial.print(a.acceleration.z, 2);
Serial.println("");
// 打印陀螺仪数据
Serial.print("陀螺仪(rad/s)| X:");
Serial.print(g.gyro.x, 2);
Serial.print("\tY:");
Serial.print(g.gyro.y, 2);
Serial.print("\tZ:");
Serial.print(g.gyro.z, 2);
Serial.println("");
// 打印温度数据
Serial.print("温度: ");
Serial.print(temp.temperature, 1);
Serial.println(" °C");
Serial.println("----------------------------------");
delay(200); // 每200ms更新一次
}
另外访问MPU6050;
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <Wire.h>
Adafruit_MPU6050 mpu;
float i;//计算偏移量时的循环次数
float ax_offset = 0, ay_offset = 0; //x,y轴的加速度偏移量
float gx_offset = 0, gy_offset = 0; //x,y轴的角速度偏移量
float rad2deg = 57.29578;
float roll, pitch; //储存角度
void setup(void) {
//定义I2C的接口
Wire.begin(23, 5);
//打开串口
Serial.begin(115200);
delay(100); // will pause Zero, Leonardo, etc until serial console opens
//初始化mpu6050
if(!mpu.begin()) {//此处不可使用while在此处等待;mpu.begin(0x68,&Wire,0)的括号内部不用写,库函数已经将形参全部填写完毕
Serial.println("Failed to find MPU6050 chip");
}
Serial.println("MPU6050 Found!");
mpu.setAccelerometerRange(MPU6050_RANGE_2_G);//加速度量程±2G
mpu.setGyroRange(MPU6050_RANGE_250_DEG);//角速度量程±250°/s
mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);//采样频率21Hz
//计算偏移量
for (i = 1; i <= 2000; i++) {
sensors_event_t a, g, temp;
mpu.getEvent(&a, &g, &temp);//获取加速度、角速度、温度
ax_offset = ax_offset + a.acceleration.x;//计算x轴加速度的偏移总量
ay_offset = ay_offset + a.acceleration.y;//计算y轴加速度的偏移总量
}
ax_offset = ax_offset / 2000; //计算x轴加速度的偏移量
ay_offset = ay_offset / 2000; //计算y轴加速度的偏移量
delay(100);
}
void loop() {
/* Get new sensor events with the readings */
sensors_event_t a, g, temp;
mpu.getEvent(&a, &g, &temp);//获取加速度、角速度、温度
/*减去偏移量并根据加速度计算角度*/
//roll角度
roll = atan((a.acceleration.y - ay_offset) / (a.acceleration.z)) * rad2deg;
//pitch角度
pitch = atan((a.acceleration.x - ax_offset) / sqrt(sq(a.acceleration.y - ay_offset) + sq(a.acceleration.z))) * rad2deg;
//打印角度
Serial.print("roll: ");
Serial.print(roll);
Serial.print(",");
Serial.print("pitch: ");
Serial.println(pitch);
delay(33);
}