Hướng dẫn sử dụng cảm biến gia tốc MPU6050 với Arduino
Cảm biến gia tốc MPU6050 là một trong những module phổ biến được sử dụng để đo gia tốc trong các ứng dụng. Với khả năng đo chính xác và tích hợp các cảm biến gia tốc và con quay hồi chuyển trong cùng một chip, MPU6050 Arduino đã trở thành một lựa chọn hàng đầu cho các dự án liên quan đến điều khiển chuyển động, robot học tập, hệ thống định vị và nhiều ứng dụng khác.
Trong bài viết này, mình sẽ hướng dẫn cách sử dụng cảm biến gia tốc MPU6050 với Arduino. Và sẽ làm quen với việc kết nối module MPU6050 với Arduino thông qua giao tiếp I2C, đọc các giá trị gia tốc và quay từ cảm biến, và hiển thị trên Serial Monitor.
Các linh kiện cần thiết cho dự án
TÊN LINH KIỆN | SỐ LƯỢNG | NƠI BÁN |
Arduino Uno R3 | 1 | Shopee | Cytron |
Cảm biến gia tốc MPU6050 | 1 | Shopee | Cytron |
Breadboard | 1 | Shopee | Cytron |
Dây cắm (Đực – Đực) | 10 – 20 | Shopee | Cytron |
Tổng quan về Module Cảm Biến gia tốc GY-521 6DOF IMU MPU6050
Cảm biến gia tốc MPU6050 là một module cảm biến tích hợp, kết hợp cảm biến gia tốc kế và con quay hồi chuyển (gyroscope). Nó được sử dụng để đo và theo dõi chuyển động, gia tốc và góc quay của một đối tượng.
MPU6050 có sáu bậc tự do (DOF), bao gồm ba bậc tự do cho gia tốc kế và ba bậc tự do cho con quay hồi chuyển. Điều này cho phép nó đo chính xác các thông số chuyển động trên ba trục không gian: trục X, trục Y và trục Z.
Thông qua giao tiếp I2C, MPU6050 có thể truyền dữ liệu số đến vi xử lý hoặc vi điều khiển chính của hệ thống. Nó cung cấp các giá trị đo như gia tốc, góc quay, nhiệt độ và các thông số liên quan khác.
MPU6050 cũng hỗ trợ các chế độ lấy mẫu và cấu hình tùy chỉnh, cho phép điều chỉnh độ nhạy và tần số lấy mẫu phù hợp với yêu cầu ứng dụng.
Với kích thước nhỏ gọn, tiêu thụ năng lượng thấp và tích hợp sẵn các chức năng đo chuyển động quan trọng, MPU6050 Arduino là một lựa chọn phổ biến trong nhiều ứng dụng như robot, thiết bị định vị và điều khiển chuyển động, trò chơi điện tử, thiết bị đeo tay thông minh và nhiều ứng dụng khác liên quan đến đo đạc và theo dõi chuyển động.
Đo giá trị gia tốc
Gia tốc được đo bằng đơn vị m/s^2 và đại diện cho tốc độ thay đổi của vận tốc trong một đơn vị thời gian.
Cảm biến gia tốc MPU6050 có khả năng đo các giá trị gia tốc trên 3 trục (x, y và z) và trả về kết quả dưới dạng giá trị số thực. Qua việc đọc giá trị gia tốc từ cảm biến, ta có thể biết được mức độ tăng tốc, giảm tốc hoặc giữ vận tốc của đối tượng mà cảm biến đang theo dõi.
Đo góc quay
Cảm biến gia tốc MPU6050 có khả năng đo góc quay hoặc vận tốc góc trên các trục quay (quay xung quanh các trục X, Y và Z). Thông qua bộ cảm biến gia tốc tích hợp trên chip, MPU6050 có thể đo và cung cấp thông tin về gia tốc góc của thiết bị trong các đơn vị đo phù hợp như radian/giây hoặc độ/giây.
Dữ liệu về góc quay hoặc vận tốc góc được cung cấp bởi cảm biến MPU6050 thông qua các đầu ra số hoặc thông qua giao tiếp số như I2C hoặc SPI. Bằng cách đọc và xử lý các giá trị từ các trục gia tốc, ta có thể tính toán được góc quay hoặc vận tốc góc của thiết bị trong không gian 3D. Điều này cho phép ứng dụng sử dụng MPU6050 có khả năng theo dõi và đo lường chính xác các chuyển động quay của thiết bị trong thời gian thực.
Đo nhiệt độ
GY-521 MPU6050 có phạm vi đo nhiệt độ từ -40°C đến +85°C, với độ chính xác đo nhiệt độ là ±1°C. Độ phân giải của cảm biến nhiệt độ MPU6050 là 16 bit, cho phép phân biệt giữa 2^16 = 65536 mức đo khác nhau.
Dữ liệu nhiệt độ được biểu thị bằng giá trị số và được chuyển đổi thành đơn vị đo nhiệt độ, thường là độ Celsius (°C) hoặc độ Fahrenheit (°F).
Giao tiếp I2C
Cảm biến gia tốc MPU6050 hỗ trợ địa chỉ I2C là 0x68. Đây là địa chỉ mặc định và có thể được sử dụng cho việc truyền và nhận dữ liệu thông qua giao tiếp I2C.
Tuy nhiên, có thể thay đổi địa chỉ I2C của GY-521 MPU6050 bằng cách kết nối chân AD0 của MPU6050 Arduino với mức logic thích hợp (GND hoặc VCC). Khi chân AD0 được kết nối với GND, địa chỉ I2C của MPU6050 sẽ trở thành 0x68. Nếu chân AD0 được kết nối với VCC, địa chỉ I2C sẽ là 0x69. Việc thay đổi địa chỉ I2C cho phép kết nối nhiều cảm biến MPU6050 trên cùng một dây I2C.
Giao tiếp các cảm biến bên ngoài
Bạn có thể nâng cao độ chính xác của module cảm biến MPU6050 bằng cách kết nối các cảm biến bên ngoài với nó. Kết nối này được thực hiện thông qua một bus I2C thứ hai, hoàn toàn độc lập với bus I2C chính của MPU6050 (XDA và XCL).
Thông thường, các bạn có thể kết nối một cảm biến từ để đo từ trường và hướng cảm ứng từ trường. Kết hợp cảm biến từ với MPU6050 Arduino giúp tạo ra hệ thống cảm biến 9 DOF (Degree of Freedom) cho đo đạc chính xác hơn về hướng và chuyển động.
Thông số kỹ thuật
Operating Voltage | 5V (typical) |
Accelerometer Range | ±2g, ±4g, ±8g, ±16g |
Gyroscope Range | ±250°/s, ±500°/s, ±1000°/s, ±2000°/s |
Temperature Range | -40 to +85°C |
Absolute Maximum Acceleration | Up to 10,000g |
Sơ đồ chân cảm biến gia tốc MPU6050
- VCC: Nguồn cấp (3.3V hoặc 5V)
- SDA: Chân dữ liệu (Data) trong giao tiếp I2C
- SCL: Chân xung Clock trong giao tiếp I2C
- AD0: Chân địa chỉ định danh I2C (nếu được sử dụng)
- INT: Chân ngắt (Interrupt) cho MPU6050
- GND: Chân đất (Ground)
- XDA: Chân dữ liệu (Data) cho bus giao tiếp I2C thứ hai
- XCL: Chân xung Clock cho giao tiếp I2C thứ hai
Sơ đồ đấu nối cảm biến gia tốc MPU6050 với Arduino
SCL | SDA | |
Arduino Uno | A5 | A4 |
Arduino Nano | A5 | A4 |
Arduino Mega | 21 | 20 |
Leonardo/Micro | 3 | 2 |
Cài đặt thư viện
Để bắt đầu lập trình và sử dụng các câu lệnh của cảm biến gia tốc MPU6050, và biên dịch bị lỗi các bạn cần thêm thư viện ‘mpu6050’. Truy cập theo đường link bên dưới: Sketch > Include Library > Manage Libraries…
Tiếp theo, tại cửa sổ Library Manager các bạn, gõ vào ô tìm kiếm từ khóa ‘mpu6050’, chọn giúp mình thư viện của Adafruit MPU6050. Sau đó chọn phiên bản mới nhất và tiến hành cài đặt.
Cuối cùng cài tiếp cho mình 2 thư viện sau: Adafruit Unified Sensor Driver và Adafruit Bus IO Library
Code ví dụ
#include <Adafruit_MPU6050.h> #include <Adafruit_Sensor.h> #include <Wire.h> Adafruit_MPU6050 mpu; void setup(void) { Serial.begin(115200); // Try to initialize! if (!mpu.begin()) { Serial.println("Failed to find MPU6050 chip"); while (1) { delay(10); } } Serial.println("MPU6050 Found!"); // set accelerometer range to +-8G mpu.setAccelerometerRange(MPU6050_RANGE_8_G); // set gyro range to +- 500 deg/s mpu.setGyroRange(MPU6050_RANGE_500_DEG); // set filter bandwidth to 21 Hz mpu.setFilterBandwidth(MPU6050_BAND_21_HZ); 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); }
Sau khi nạp code các bạn có thể xem các thông số của cảm biến gia tốc MPU6050 Arduino qua Serial Monitor.
Giải thích Code
#include <Adafruit_MPU6050.h> #include <Adafruit_Sensor.h> #include <Wire.h>
Khai báo các thư viện cần thiết để sử dụng cảm biến MPU6050 và giao tiếp qua I2C.
Adafruit_MPU6050 mpu;
Khởi tạo một đối tượng Adafruit_MPU6050 có tên là mpu để tương tác với cảm biến. Điều này sẽ cho phép sử dụng các phương thức và chức năng có sẵn trong thư viện.
Serial.begin(115200); // Try to initialize! if (!mpu.begin()) { Serial.println("Failed to find MPU6050 chip"); while (1) { delay(10); } }
Serial.begin(115200);
khởi tạo giao tiếp Serial với tốc độ truyền dữ liệu (baud rate) là 115200 bit/giây. Câu lệnh này sẽ thiết lập giao tiếp thông qua cổng Serial để chúng ta có thể gửi và nhận dữ liệu từ Arduino đến máy tính qua Serial Monitor.
if (!mpu.begin()) { … } kiểm tra xem cảm biến MPU6050 có sẵn hay không. Phương thức begin() của đối tượng mpu được gọi để khởi tạo cảm biến. Nếu cảm biến không được tìm thấy, điều kiện !mpu.begin() sẽ trả về giá trị true, tức là không thành công. Trong trường hợp này, chúng ta in ra thông báo “Failed to find MPU6050 chip” và tiếp tục trong vòng lặp vô hạn.
mpu.setAccelerometerRange(MPU6050_RANGE_8_G); mpu.setGyroRange(MPU6050_RANGE_500_DEG); mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);
mpu.setAccelerometerRange(MPU6050_RANGE_8_G); Đây là câu lệnh để cài đặt phạm vi đo gia tốc của cảm biến. Trong trường hợp này, phạm vi đo là ±8G, tức là cảm biến có thể đo gia tốc từ -8G đến +8G.
mpu.setGyroRange(MPU6050_RANGE_500_DEG); Đây là câu lệnh để cài đặt phạm vi đo quay của cảm biến. Trong trường hợp này, phạm vi đo là ±500°/s, tức là cảm biến có thể đo quay từ -500°/s đến +500°/s.
mpu.setFilterBandwidth(MPU6050_BAND_21_HZ); Đây là câu lệnh để cài đặt băng thông bộ lọc của cảm biến. Trong trường hợp này, chúng ta đặt băng thông là 21 Hz, tức là bộ lọc của cảm biến sẽ loại bỏ các tần số cao hơn 21 Hz để giảm nhiễu và cải thiện độ chính xác.
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); }
Trong hàm loop() sau khi hàm setup() đã hoàn thành. Hàm này sẽ sử dụng phương thức getEvent() của đối tượng mpu để đọc các giá trị gia tốc, tốc độ quay và nhiệt độ từ cảm biến. Các giá trị này được lưu trong các biến a, g, temp kiểu sensors_event_t. Sau đó, chúng ta in ra các giá trị này qua Serial Monitor bằng cách sử dụng các câu lệnh Serial.print() và Serial.println().
Để tránh việc đọc dữ liệu quá nhanh, chúng ta sử dụng câu lệnh delay(500) để chờ 500 milliseconds (0.5 giây) trước khi lặp lại quá trình đọc dữ liệu.
code arduino trên phần mềm nào cũng đc ạ, trên này là viết code bằng gì vậy ạ