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_MPU6050

Adafruit_Sensor

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 a, g, temp;

  mpu.getEvent(&a, &g, &temp);

  //列出加速度值

  Serial.print("Accelerometer ");

  Serial.print("X: ");

  Serial.print(a.acceleration.x, 1);

  Serial.print(" m/s^2, ");

  Serial.print("Y: ");

  Serial.print(a.acceleration.y, 1);

  Serial.print(" m/s^2, ");

  Serial.print("Z: ");

  Serial.print(a.acceleration.z, 1);

  Serial.println(" m/s^2");

  //列出陀螺儀值

  Serial.print("Gyroscope ");

  Serial.print("X: ");

  Serial.print(g.gyro.x, 1);

  Serial.print(" rps, ");

  Serial.print("Y: ");

  Serial.print(g.gyro.y, 1);

  Serial.print(" rps, ");

  Serial.print("Z: ");

  Serial.print(g.gyro.z, 1);

  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_WIDTH, SCREEN_HEIGHT, &Wire, OLED_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_SWITCHCAPVCC, 0x3C)) { // 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 a, g, temp;

  mpu.getEvent(&a, &g, &temp);

  //初始化後清屏

  display.clearDisplay();

  //將顯示光標設置為 (0,0)

  display.setCursor(0, 0);

  

  //列出加速度值

  Serial.print("Accelerometer ");

  Serial.print("X: ");

  Serial.print(a.acceleration.x, 1);

  Serial.print(" m/s^2, ");

  Serial.print("Y: ");

  Serial.print(a.acceleration.y, 1);

  Serial.print(" m/s^2, ");

  Serial.print("Z: ");

  Serial.print(a.acceleration.z, 1);

  Serial.println(" m/s^2");

  

  //OLED上顯示加速度

  display.println("Accelerometer - m/s^2");

  display.print(a.acceleration.x, 1);

  display.print(", ");

  display.print(a.acceleration.y, 1);

  display.print(", ");

  display.print(a.acceleration.z, 1);

  display.println("");

  

  //列出陀螺儀值

  Serial.print("Gyroscope ");

  Serial.print("X: ");

  Serial.print(g.gyro.x, 1);

  Serial.print(" rps, ");

  Serial.print("Y: ");

  Serial.print(g.gyro.y, 1);

  Serial.print(" rps, ");

  Serial.print("Z: ");

  Serial.print(g.gyro.z, 1);

  Serial.println(" rps");

  

  //OLED上顯示陀螺儀

  display.println("Gyroscope - rps");

  display.print(g.gyro.x, 1);

  display.print(", ");

  display.print(g.gyro.y, 1);

  display.print(", ");

  display.print(g.gyro.z, 1);

  display.println("");

  

  display.display();

  //列出溫度值

  Serial.print("Temperture ");

  Serial.print(temp.temperature);

  Serial.println(" degC");

  delay(500);

}

結果2


文章作者: blairan
版權聲明: 本博客所有文章除特別聲明外,均採用 CC BY 4.0 許可協議。轉載請註明來源 blairan !
评论
  目錄