使用 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); // 从寄存器 0x3B (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); // 从寄存器 0x3B (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("
"); }
输出
串行监视器输出将类似于下面显示的输出 −