Bài 21: Cảm biến gia tốc góc nghiêng MPU6050

Các bạn sử dụng điện thoại đã từng chơi qua những game như đua xe, lắc banh … Thường khi chơi những game đó các bạn phải nghiêng, xoay điện thoại đúng chứ. Vậy thì làm sao một chiếc điện thoại lại biết bạn nghiêng hay xoay? Hôm nay, bài viết này sẽ giải đáp cho bạn điều đó, cảm biến gia tốc, góc nghiêng là chủ đề của bài viết hôm nay.


IMU và DOF

Đầu tiên, ta sẽ nói đến hai khái niệm IMU và DOF. IMU (Inertial Measurement Unit) là một con chip để đo những chuyển động như trên. một module IMU thường gồm có 2 loại cảm biến: cảm biến gia tốc (accelerometer) và cảm biến quay (gyroscope).

  • Accelerometer (gọi tắt là accel): như tên gọi của nó, accel đơn giản là một cảm biến đo gia tốc của bản thân module và thường sẽ có 3 trục xyz ứng với 3 chiều không gian (loại 1 và 2 trục ít dùng). Lưu ý là accel đo cả gia tốc của trọng lực nên giá trị thực khi đo sẽ bao gồm cả trọng lực.
  • Gyroscope (gọi tắt là gyro): là một loại cảm biến đo tốc độ quay của nó quanh một trục. Tương tự với accel, gyro cũng thường có 3 trục xyz.

Một ví dụ đơn giản, khi bạn đặt một con chip IMU thẳng đứng như trên và để im không chuyển động, giá trị trả về sẽ là accel = [0.0, -9.8, 0.0]gyro = [0.0, 0.0, 0.0] do chỉ có trọng lực trái đất tác dụng lực và không có bất cứ chuyển động quay nào cả. Lưu ý rằng gyro chỉ đo tốc độ quay chứ không đo trực tiếp góc quay, nên khi bạn quay module một góc nào đó rồi dừng, giá trị của gyro sẽ tăng lên rồi hạ xuống về 0.

Vậy còn DOF ? Một module IMU đầy đủ sẽ được gọi là 6-DOF (6 Degrees Of Freedom) tức là 6 trục độc lập (3 của accel và 3 của gyro). Tuy vậy đôi khi như thế vẫn là không đủ, những dự án phức tạp hơn như là điều hướng máy bay hoặc robot có thể sẽ cần đến 9-DOF (thêm một cảm biến từ trường 3 trục - magnetometer - hoạt động gần giống một la bàn để định hướng), hoặc 10-DOF (thêm một áp kế - barometer - dùng để đo độ cao) hoặc thậm chí 11-DOF (thêm module GPS để xác định vị trí). Phù, quá nhiều trục phải không? Đừng lo, phần lớn các ứng dụng có thể làm tại nhà chỉ cần một IMU 6-DOF là đủ.

Với chip IMU này các bạn có thể làm được nhiều món đồ "chơi" như:

  • Robot 2 bánh tự cân bằng 
  • Máy bay điều khiển từ xa (drone)
  • Chuột máy tính trên không
  • Tay cầm chơi game
  • Hệ thống giữ thăng bằng cho camera/máy ảnh.
  • Các ứng dụng: đếm số bước chân, cảm biến rơi, cảm biến rung/lắc...

Các vấn đề thường gặp

IMU - cũng như nhiều cảm biến khác - cần được hiệu chỉnh trước khi sử dụng nếu muôn có một kết quả đáng tin cậy. Sau đây là những vấn đề cần lưu tâm khi sử dụng một module IMU:

  • Accelerometer: accel luôn có offset trên mỗi trục làm cho giá trị đo được thường lệch đi so với thực tế một chút. Ngoài ra, giá trị đó được theo accel thường khá nhiễu khiến cho việc đọc trở nên khó khăn.
  • Gyroscope: cũng như accel, gyro cũng có offset (hay còn gọi là bias) làm lệch các giá trị đo. Một vấn đề khác nữa có thể gặp phải của gyro là drift, có nghĩa là bias thay cũng thay đổi chậm theo thời gian. Dù vậy, điểm cộng là gyro lại ít bị nhiễu hơn accel. 

Vậy thì làm thế nào đối phó với những vấn đề này? Với offset là hằng số thì đơn giản chỉ là đo lại giá trị đó và trừ vào giá trị đo. Với việc tín hiệu bị nhiễu thì có thể dùng một bộ lọc điện tử tần số thấp (digital low-pass filter), các bạn có thể tham khảo library Filters trên diễn đàn Arduino (http://playground.arduino.cc/Code/Fi...). Vấn đề drift của gyro thì có thể dùng bộ lọc cao tần (digital high-pass filter) do gyro drift khá chậm.

Một cách chuyên nghiệp hơn, nếu các bạn muốn đo một cách chính xác góc quay thì có một số thuật toán dùng để tính toán như:

  • Complementary filter
  • Kalman filter
  • Mahony filter
  • Madgwick filter

Tất cả những filter trên hiện nay đều đã được viết dưới dạng library cho Arduino nên các bạn có thể update trực tiếp bằng IDE Arduino.

Cảm biến MPU6050 và thư viện

MPU-6050 là cảm biến của hãng InvenSense tích hợp 6 trục cảm biến bao gồm:

  • Con quay hồi chuyển 3 trục (Gyroscope).
  • Cảm biến gia tốc 3 chiều (Accelerometer).

MPU6050 có kèm sensor fusion sẵn trên chip (gọi là DMP - Digital Motion Processor), breakout board có thể tìm thấy: GY-521 breakout board (không rõ xuất xứ, nhưng rẻ), breakout board của Sparkfun (đắt hơn kha khá). MPU6050 sử dụng giao thức I2C. Các bạn có thể tìm hiểu thêm cùng với thư viện Wire (có sẵn trong Arduino IDE)

Khi tìm hiểu về MPU-6050, các bạn sẽ gặp phải thuật ngữ QUATERNION, YAW, PITCH, ROLL. Và theo mình, đây là cách giải thích đơn giản và dể hiểu nhất:

Quaternion: https://minhcly.wordpress.com/2014/01/30/quarternion-va-phep-quay-khong-gian-phan-1/

Yaw, Pitch, Roll: https://kienthucbay.wordpress.com/tag/ailerons/

Thư viện MPU6050: https://mechasolution.vn/source/library/MPU6050.rar

Thư viện I2Cdev: https://mechasolution.vn/source/library/I2Cdev.rar

Chuẩn bị

  • Arduino Uno
  • Dây cắm testboard
  • MPU6050

Lắp mạch

Lập trình (Simple code)

Code này sẽ giúp bạn đọc dữ liệu từ MPU6050 cách thô và đơn giản nhất.

Lập trình (TeaPOT)

Các bạn có thể tìm hiểu phần này cùng với phần mềm Processing ở bài viết này: Processing Bài 1: Arduino blink và giao diện cơ bản. TeaPOT là một chương trình để calibrate dùng để hiệu chỉnh sensor. Các bạn tải processing và nạp code này vào.

CODE ARDUINO:

CODE PROCESSING:

Code có thể tìm thấy trong thư viện C:\Users\...\Documents\Arduino\libraries\MPU6050\examples\MPU6050_DMP6\ có file .pde là file của processing và file .ino là của arduino.

Sau đó bỏ phần "//" trong code arduino (uncomment) dòng 117 để có thể chạy TEAPOT nhé.

Còn trong Processing thì chỉnh cổng COM lại cho phù hợp với COM của arduino tại dòng 71.

Kết quả

Nguồn: Arduino.vn

Chúc các bạn thành công !!!

Có thể bạn quan tâm ???