使用 Arduino 从振动传感器获取数据

arduinoarduino boardsarduino idearduino programming language

在本教程中,我们将 Arduino 与 MPU6050 振动传感器连接起来。

电路图

如您所见,我们将 Vcc 连接到 3.3V,将 GND 连接到 GND,将 SDA 连接到 A4,将 SCL 连接到 A5。A4 和 A5 还用作 Arduino Uno 上的 SDA 和 SCL。

代码演练

代码如下 −

#include<Wire.h>

const int MPU_ADDR = 0x68; // MPU-6050 的 I2C 地址
int16_t AcX, AcY, AcZ, Tmp, GyX, GyY, GyZ;

void setup() {
   Serial.begin(9600);
   Wire.begin();
   Wire.beginTransmission(MPU_ADDR);
   Wire.write(0x6B); // PWR_MGMT_1 寄存器
   Wire.write(0); // 设置为零(唤醒 MPU-6050)
   Wire.endTransmission(true);
   Serial.println("Setup complete");
}

void loop() {
   Wire.beginTransmission(MPU_ADDR);
   Wire.write(0x3B); // 从寄存器 0x​​3B (ACCEL_XOUT_H) 开始
   Wire.endTransmission(true);
   Wire.beginTransmission(MPU_ADDR);
   Wire.requestFrom(MPU_ADDR, 14, true); // 总共请求 14 个寄存器
   AcX = Wire.read() << 8 | Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
   AcY = Wire.read() << 8 | Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
   AcZ = Wire.read() << 8 | Wire.read(); // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
   Tmp = Wire.read() << 8 | Wire.read(); // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
   GyX = Wire.read() << 8 | Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
   GyY = Wire.read() << 8 | Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
   GyZ = Wire.read() << 8 | Wire.read(); // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)

   Serial.print(AcX); Serial.print(" , ");
   Serial.print(AcY); Serial.print(" , ");
   Serial.print(AcZ); Serial.print(" , ");
   Serial.print(GyX); Serial.print(" , ");
   Serial.print(GyY); Serial.print(" , ");
   Serial.print(GyZ); Serial.print("
"); }

我们首先包含 Wire.h

#include<Wire.h>

接下来,我们定义 MPU6050 芯片的 I2C 地址 (0x68) 和用于存储 3 个加速度和 3 个陀螺仪值的变量,以及用于存储中间值的临时变量。

const int MPU_ADDR = 0x68; // MPU-6050 的 I2C 地址
int16_t AcX, AcY, AcZ, Tmp, GyX, GyY, GyZ;

在设置中,我们初始化 Serial,然后初始化 Wire,然后通过将 0 写入 0x6B(电源管理)寄存器来唤醒 MPU6050。

void setup() {
   Serial.begin(9600);
   Wire.begin();
   Wire.beginTransmission(MPU_ADDR);
   Wire.write(0x6B); // PWR_MGMT_1 寄存器
   Wire.write(0); // 设置为零(唤醒 MPU-6050)
   Wire.endTransmission(true);
   Serial.println("Setup complete");
}

在循环中,我们开始从 0x3B 寄存器读取 14 个字节。正如 MPU6050 的数据表中所述,从 0x3B 寄存器开始,我们有 X 轴加速度的高字节和低字节、Y 轴加速度的高字节和低字节以及 Z 轴加速度的两个字节。接下来是两个温度字节,然后是 X、Y 和 Z 方向陀螺仪读数各两个字节(高字节和低字节)。因此,我们读取这些值并相应地存储它们,然后打印它们。X 和 Y 方向在 MPU6050 上指示,Z 方向垂直于电路板。

void loop() {
   Wire.beginTransmission(MPU_ADDR);
   Wire.write(0x3B); // 从寄存器 0x​​3B (ACCEL_XOUT_H) 开始
   Wire.endTransmission(true);
   Wire.beginTransmission(MPU_ADDR);
   Wire.requestFrom(MPU_ADDR, 14, true); // 总共请求 14 个寄存器
   AcX = Wire.read() << 8 | Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
   AcY = Wire.read() << 8 | Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
   AcZ = Wire.read() << 8 | Wire.read(); // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
   Tmp = Wire.read() << 8 | Wire.read(); // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
   GyX = Wire.read() << 8 | Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
   GyY = Wire.read() << 8 | Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
   GyZ = Wire.read() << 8 | Wire.read(); // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)

   Serial.print(AcX); Serial.print(" , ");
   Serial.print(AcY); Serial.print(" , ");
   Serial.print(AcZ); Serial.print(" , ");
   Serial.print(GyX); Serial.print(" , ");
   Serial.print(GyY); Serial.print(" , ");
   Serial.print(GyZ); Serial.print("
"); }

输出

串行监视器输出将类似于下面显示的输出 −


相关文章