MPU-6050加速度-陀螺儀-溫度傳感器-ESP32

 MPU-6050加速度-陀螺儀-溫度傳感器-ESP32



實驗目標:

MPU-6050 IMU(慣性測量單元)是一個 3 軸加速度計和 3 軸陀螺儀傳感器。加速度計測量重力加速度,陀螺儀測量旋轉速度。此外,該模塊還測量溫度。該傳感器非常適合確定移動物體的方向。

MPU-6050簡介

MPU-6050 是一個帶有 3 軸加速度計和 3 軸陀螺儀的模組。
螺儀-用於測量旋轉速度 (rad/s),這是角度位置沿 X、Y 和 Z 軸(滾動、俯仰和偏航)隨時間的變化。這使我們能夠確定物體的方向。
速度計-測量加速度它可以感應重力 (9.8m/s2) 等靜態力或振動或運動等動態力。 
MPU-6050 測量 X、Y 和 Z 軸上的加速度。理想情況下,在靜態物體中,Z 軸上的加速度等於重力,並且在 X 和 Y 軸上應為零。
速度計-可以使用三角法計算橫滾角和俯仰角。但無法計算偏航。

接線



須匯入的程式庫

Adafruit_SSD1306-後半段會用到

程式碼1

使用範例並上傳

#include <Arduino.h>
//包含 MPU-6050 傳感器所需的庫:Adafruit_MPU6050 和 Adafruit_Sensor。
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
//創建一個名為 mpu 的 Adafruit_MPU6050 對象來處理傳感器。
Adafruit_MPU6050 mpu;

void setup() {
  Serial.begin(115200);

  //初始化 MPU-6050 傳感器。
  if (!mpu.begin()) {
    Serial.println("Sensor init failed");
    while (1)
      yield();
  }
  Serial.println("Found a MPU-6050 sensor");

}

void loop() {
  //使用當前讀數獲取新的傳感器事件。
  sensors_event_t agtemp;
  mpu.getEvent(&a, &g, &temp);

  //列出加速度值
  Serial.print("Accelerometer ");
  Serial.print("X: ");
  Serial.print(a.acceleration.x1);
  Serial.print(" m/s^2, ");
  Serial.print("Y: ");
  Serial.print(a.acceleration.y1);
  Serial.print(" m/s^2, ");
  Serial.print("Z: ");
  Serial.print(a.acceleration.z1);
  Serial.println(" m/s^2");
  //列出陀螺儀值
  Serial.print("Gyroscope ");
  Serial.print("X: ");
  Serial.print(g.gyro.x1);
  Serial.print(" rps, ");
  Serial.print("Y: ");
  Serial.print(g.gyro.y1);
  Serial.print(" rps, ");
  Serial.print("Z: ");
  Serial.print(g.gyro.z1);
  Serial.println(" rps");
  //列出溫度值
  Serial.print("Temperture ");
  Serial.print(temp.temperature);
  Serial.println(" degC");

  delay(500);

}

結果1

移動傳感器可以得到一連串的數值

量測數值顯示於OLED

匯入Adafruit_SSD1306函式庫後

程式碼2

使用範例並上傳

#include <Arduino.h>
//包含 MPU-6050 傳感器所需的庫:Adafruit_MPU6050 和 Adafruit_Sensor。
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
//引進SSD1306所須使用的函式庫
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
//創建一個名為 mpu 的 Adafruit_MPU6050 對象來處理傳感器。
Adafruit_MPU6050 mpu;

//設定OLED的寛高
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTHSCREEN_HEIGHT, &WireOLED_RESET);

// SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally

void setup() {
  Serial.begin(115200);

  //初始化 MPU-6050 傳感器。
  if (!mpu.begin()) {
    Serial.println("Sensor init failed");
    while (1)
      yield();
  }
  Serial.println("Found a MPU-6050 sensor");
  if (!display.begin(SSD1306_SWITCHCAPVCC0x3C)) { // Address 0x3C for 128x32
  Serial.println(F("SSD1306 allocation failed"));
  for (;;)
    ; // Don't proceed, loop forever
  }
  display.display();
  //設置顯示的字體大小和顏色
  delay(500); // Pause for 2 seconds
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setRotation(0);
}

void loop() {
  //使用當前讀數獲取新的傳感器事件。
  sensors_event_t agtemp;
  mpu.getEvent(&a, &g, &temp);
  //初始化後清屏
  display.clearDisplay();
  //將顯示光標設置為 (0,0)
  display.setCursor(00);

  //列出加速度值
  Serial.print("Accelerometer ");
  Serial.print("X: ");
  Serial.print(a.acceleration.x1);
  Serial.print(" m/s^2, ");
  Serial.print("Y: ");
  Serial.print(a.acceleration.y1);
  Serial.print(" m/s^2, ");
  Serial.print("Z: ");
  Serial.print(a.acceleration.z1);
  Serial.println(" m/s^2");

  //OLED上顯示加速度
  display.println("Accelerometer - m/s^2");
  display.print(a.acceleration.x1);
  display.print(", ");
  display.print(a.acceleration.y1);
  display.print(", ");
  display.print(a.acceleration.z1);
  display.println("");

  //列出陀螺儀值
  Serial.print("Gyroscope ");
  Serial.print("X: ");
  Serial.print(g.gyro.x1);
  Serial.print(" rps, ");
  Serial.print("Y: ");
  Serial.print(g.gyro.y1);
  Serial.print(" rps, ");
  Serial.print("Z: ");
  Serial.print(g.gyro.z1);
  Serial.println(" rps");

  //OLED上顯示陀螺儀
  display.println("Gyroscope - rps");
  display.print(g.gyro.x1);
  display.print(", ");
  display.print(g.gyro.y1);
  display.print(", ");
  display.print(g.gyro.z1);
  display.println("");

  display.display();
  //列出溫度值
  Serial.print("Temperture ");
  Serial.print(temp.temperature);
  Serial.println(" degC");

  delay(500);
}

結果2

留言

這個網誌中的熱門文章