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 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);
}
留言
張貼留言