Ví dụ cách dùng ESP32 MPU6050 trên Arduino IDE

Trong bài này, IoTZone sẽ hướng dẫn bạn cách sử dụng ESP32 MPU6050 – module gia tốc kế và con quay hồi chuyển. MPU6050 IMU (đơn vị đo quán tính) là một cảm biến gia tốc kế 3 trục (đo gia tốc trọng trường) và con quay hồi chuyển 3 trục (đo vận tốc quay). Ngoài ra, cảm biến này cũng hỗ trợ đo nhiệt độ.

Nhìn chung, MPU6050 thường dùng để xác định hướng của một vật thể đang chuyển động. Trong bài này, mình sẽ hướng dẫn bạn 2 nội dung:

  • Đọc giá trị của con quay hồi chuyển, gia tốc kế và nhiệt độ
  • Hiển thị các giá trị này trên màn hình OLED

Vì chúng ta dùng Arduino IDE, nên bạn cần cài đặt phần mềm này và cài tiện ích ESP32 bên trong sẵn, trước khi đọc hướng dẫn bên dưới nhé!

Giới thiệu MPU6050

MPU6050 là một module gia tốc kế 3 trục và con quay hồi chuyển 3 trục:

  • Con quay hồi chuyển đo vận tốc quay theo đơn vị rad/s, giúp xác định sự thay đổi của vị trí góc theo thời gian dựa trên 3 trục hình học là trục X, trục Y và trục Z. Qua đó, chúng ta có thể xác định hướng của một đối tượng.
Giới thiệu con quay hồi chuyển trong cảm biến MPU6050
  • Gia tốc kế đo gia tốc (tốc độ thay đổi vận tốc) của một vật thể. Chúng đo trọng lực hoặc lực rung, sự chuyển động. Tương tự con quay hồi chuyển, gia tốc kế của cảm biến MPU6050 đo 3 trục X, Y và Z. Dựa vào các giá trị này, chúng ta có thể tính toán góc nghiêng và góc xoay. Tuy nhiên, chúng ta không thể tính được độ lệch.

Trong các dự án ESP32 MPU6050, chúng ta thường kết hợp thông tin từ cả 2 gia tốc kế và con quay hồi chuyển để tính toán chính xác hơn về hướng của cảm biến.

Dưới đây là sơ đồ Pinout của cảm biến MPU6050:

  • VCC: Cấp nguồn ở mức 3,3V hoặc 5V
  • GND: Chân GND chung
  • SCL: Chân giao tiếp với I2C (GPIO 22)
  • SDA: Chân giao tiếp với I2C (GPIO 21)
  • XDA: Dùng để kết nối với các cảm biến I2C khác bên ngoài không phải MPU 6050
  • XCL: Tương tự XDA
  • AD0: Được dùng để thay đổi địa chỉ I2C
  • INT: Pin ngắt (Interrupt pin), dùng để chỉ ra các dữ liệu đo mới đang có sẵn

Cài đặt thư viện

Có nhiều cách khác nhau để đọc thông tin từ cảm biến MPU6050. Trong hướng dẫn này, mình sẽ sử dụng thư viện Adafruit MPU6050. Để dùng nó, bạn cũng cần phải cài đặt kèm theo thư viện Adafruit Unified Sensor và Adafruit Bus IO.

Để cài đặt, bạn mở Arduino IDE, đi theo hướng dẫn: Sketch >> Include Library >> Manage Libraries >> Tìm kiếm tên thư viện (cụ thể là “Adafruit MPU6050”) và cài đặt thư viện.

Với 2 thư viện còn lại, bạn thực hiện tương tự.

Sau khi cài đặt xong 3 thư viện, bạn khởi động lại Arduino IDE.

Dự án ESP32 MPU6050 cơ bản: In giá trị lên Serial Monitor

Chuẩn bị

  • Cảm biến MPU6050
  • Mạch ESP32
  • Dây Jumper
  • Breadboard

Kết nối phần cứng

Kết nối SCL với GPIO 22 và SDA đến GPIO21 như hình:

Kết nối ESP32 MPU6050
Kết nối ESP32 MPU6050

Chương trình lập trình

Trong thư viện Adafruit vừa cài đã có sẵn code mẫu để làm việc với cảm biến MPU6050. Chúng ta hãy mở một code mẫu cơ bản: In giá trị đọc được từ cảm biến lên màn hình Serial.

Bạn đi theo đường dẫn: File >> Examples >> Adafruit MPU6050 >> basic_readings, đoạn code sau sẽ xuất hiện. Code này có thể đo vận tóc góc, gia tốc trên 3 trục và nhiệt độ:

#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <Wire.h>

Adafruit_MPU6050 mpu;

void setup(void) {
  Serial.begin(115200);
  while (!Serial)
    delay(10); // will pause Zero, Leonardo, etc until serial console opens

  Serial.println("Adafruit MPU6050 test!");

  // Try to initialize!
  if (!mpu.begin()) {
    Serial.println("Failed to find MPU6050 chip");
    while (1) {
      delay(10);
    }
  }
  Serial.println("MPU6050 Found!");

  mpu.setAccelerometerRange(MPU6050_RANGE_8_G);
  Serial.print("Accelerometer range set to: ");
  switch (mpu.getAccelerometerRange()) {
  case MPU6050_RANGE_2_G:
    Serial.println("+-2G");
    break;
  case MPU6050_RANGE_4_G:
    Serial.println("+-4G");
    break;
  case MPU6050_RANGE_8_G:
    Serial.println("+-8G");
    break;
  case MPU6050_RANGE_16_G:
    Serial.println("+-16G");
    break;
  }
  mpu.setGyroRange(MPU6050_RANGE_500_DEG);
  Serial.print("Gyro range set to: ");
  switch (mpu.getGyroRange()) {
  case MPU6050_RANGE_250_DEG:
    Serial.println("+- 250 deg/s");
    break;
  case MPU6050_RANGE_500_DEG:
    Serial.println("+- 500 deg/s");
    break;
  case MPU6050_RANGE_1000_DEG:
    Serial.println("+- 1000 deg/s");
    break;
  case MPU6050_RANGE_2000_DEG:
    Serial.println("+- 2000 deg/s");
    break;
  }

  mpu.setFilterBandwidth(MPU6050_BAND_5_HZ);
  Serial.print("Filter bandwidth set to: ");
  switch (mpu.getFilterBandwidth()) {
  case MPU6050_BAND_260_HZ:
    Serial.println("260 Hz");
    break;
  case MPU6050_BAND_184_HZ:
    Serial.println("184 Hz");
    break;
  case MPU6050_BAND_94_HZ:
    Serial.println("94 Hz");
    break;
  case MPU6050_BAND_44_HZ:
    Serial.println("44 Hz");
    break;
  case MPU6050_BAND_21_HZ:
    Serial.println("21 Hz");
    break;
  case MPU6050_BAND_10_HZ:
    Serial.println("10 Hz");
    break;
  case MPU6050_BAND_5_HZ:
    Serial.println("5 Hz");
    break;
  }

  Serial.println("");
  delay(100);
}

void loop() {
  /* Get new sensor events with the readings */
  sensors_event_t a, g, temp;
  mpu.getEvent(&a, &g, &temp);

  /* Print out the values */
  Serial.print("Acceleration X: ");
  Serial.print(a.acceleration.x);
  Serial.print(", Y: ");
  Serial.print(a.acceleration.y);
  Serial.print(", Z: ");
  Serial.print(a.acceleration.z);
  Serial.println(" m/s^2");

  Serial.print("Rotation X: ");
  Serial.print(g.gyro.x);
  Serial.print(", Y: ");
  Serial.print(g.gyro.y);
  Serial.print(", Z: ");
  Serial.print(g.gyro.z);
  Serial.println(" rad/s");

  Serial.print("Temperature: ");
  Serial.print(temp.temperature);
  Serial.println(" degC");

  Serial.println("");
  delay(500);
}

Demo

Upload code vào mạch ESP32, sau đó mở Serial Monitor ở tốc độ 115200. Nhấn nút RSST trên mạch, các giá trị đo được từ cảm biến sẽ hiển thị trên màn hình Serial.

Bạn hãy di chuyển, xoay cảm biến MPU6050 và quan sát các giá trị thay đổi như thế nào nhé!

Dự án ESP32 MPU6050 nâng cao: Hiển thị giá trị lên màn hình OLED

Trong phần này, chúng ta sẽ tìm hiểu cách hiển thị các giá trị đo được từ cảm biến lên màn hình OLED trực quan, ví dụ như hình dưới:

Dự án ESP32 MPU6050 nâng cao: Hiển thị giá trị lên màn hình OLED

Chuẩn bị

  • Module MPU6050
  • Mạch ESp32
  • Màn hình OLED 0,96 inch SSD1306
  • Dây Jumper
  • Breadboard

>> Bài viết liên quan: Breadboard là gì? Cách sử dụng breadboard

Kết nối phần cứng

Vì màn hình OLED và module MPU 6050 sử dụng các địa chỉ I2C khác nhau, nên chúng ta có thể kết nối cả 2 chung vào 1 bus I2C (cùng các chân trên ESP32) như hình dưới:

Kết nối phần cứng ESP32 MPU6050 với OLED

Chương trình lập trình

Lưu ý: Trước khi dùng code mẫu dưới đây, bạn hãy đảm bảo là Arduino IDE của bạn đã cài đặt thư viện Adafbean SSD1306 nhé! Để tải, bạn đi theo đường dẫn Sketch Library > Manage Libraries và tìm kiếm SSD1306, tiến hành cài đặt thư viện.

Sau đó, bạn mở File Examples Adafruit MPU6050 MPU6050_oled để có code mẫu sau:

#include <Adafruit_MPU6050.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_Sensor.h>

Adafruit_MPU6050 mpu;
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire);

void setup() {
  Serial.begin(115200);
  // while (!Serial);
  Serial.println("MPU6050 OLED demo");

  if (!mpu.begin()) {
    Serial.println("Sensor init failed");
    while (1)
      yield();
  }
  Serial.println("Found a MPU-6050 sensor");

  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x64
    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();
  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");

  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");

  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();
  delay(100);
}

Demo

Sau khi nạp code trên vào ESP32, bạn mở Serial Monitor ở tốc độ 115200, nhấn nút RST. Trên màn hình OLED sẽ hiển thị các giá trị đo được từ ESP32 MPU6050:

Dự án ESP32 MPU6050 nâng cao: Hiển thị giá trị lên màn hình OLED

Đồng thời, trên màn hình Serial cũng hiển thị các giá trị này.

Lời kết

Trên đây là hướng dẫn chi tiết về cách dùng ESP32 MPU6050, cả dự án cơ bản (hiển thị lên Serial Monitor) lẫn nâng cao (hiển thị lên OLED). Chúc bạn thành công! Bạn có thể xem thêm nhiều dự án thú vị khác với ESP32 trên Web IoTZone:

IoTZone – Chuyên cung cấp thiết bị điện tử & tài liệu cho Makers

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *