Mục lục:

MPU 6050 Gyro, Giao tiếp gia tốc kế với Arduino (Atmega328p): 5 bước
MPU 6050 Gyro, Giao tiếp gia tốc kế với Arduino (Atmega328p): 5 bước

Video: MPU 6050 Gyro, Giao tiếp gia tốc kế với Arduino (Atmega328p): 5 bước

Video: MPU 6050 Gyro, Giao tiếp gia tốc kế với Arduino (Atmega328p): 5 bước
Video: Module cảm biến gia tốc GY-521 6DOF IMU MPU6050 | How to use GY-521 6DOF IMU MPU6050 2024, Tháng bảy
Anonim
MPU 6050 Gyro, Giao tiếp gia tốc kế với Arduino (Atmega328p)
MPU 6050 Gyro, Giao tiếp gia tốc kế với Arduino (Atmega328p)
MPU 6050 Gyro, Giao tiếp gia tốc kế với Arduino (Atmega328p)
MPU 6050 Gyro, Giao tiếp gia tốc kế với Arduino (Atmega328p)
MPU 6050 Gyro, Giao tiếp gia tốc kế với Arduino (Atmega328p)
MPU 6050 Gyro, Giao tiếp gia tốc kế với Arduino (Atmega328p)

MPU6050 IMU có cả gia tốc kế 3 trục và con quay hồi chuyển 3 trục được tích hợp trên một chip duy nhất.

Con quay hồi chuyển đo vận tốc quay hoặc tốc độ thay đổi của vị trí góc theo thời gian, dọc theo trục X, Y và Z.

Đầu ra của con quay hồi chuyển là độ trên giây, vì vậy để có được vị trí góc, chúng ta chỉ cần tích hợp vận tốc góc.

Mặt khác, gia tốc kế MPU6050 đo gia tốc bằng cách đo gia tốc trọng trường dọc theo 3 trục và sử dụng một số phép toán lượng giác, chúng ta có thể tính toán góc tại đó cảm biến được định vị. Vì vậy, nếu chúng ta hợp nhất hoặc kết hợp dữ liệu gia tốc kế và con quay hồi chuyển, chúng ta có thể nhận được thông tin rất chính xác về hướng cảm biến.

Con quay hồi chuyển 3 trục MPU-6050 bao gồm một con quay hồi chuyển 3 trục có thể phát hiện vận tốc quay dọc theo trục x, y, z với công nghệ hệ thống cơ điện vi mô (MEMS). Khi cảm biến được xoay dọc theo bất kỳ trục nào, rung động được tạo ra do hiệu ứng Coriolis được phát hiện bởi MEMS. 16-bit ADC được sử dụng để số hóa điện áp để lấy mẫu từng trục. + / - 250, +/- 500, +/- 1000, +/- 2000 là phạm vi đầu ra đầy đủ. Vận tốc truyền động được đo dọc theo mỗi trục theo đơn vị độ trên giây.

Liên kết hữu ích: …………….

Bảng Arduino:. ……….

MPU6050 IMU ……………

Bước 1: Mô-đun MPU-6050

Mô-đun MPU-6050
Mô-đun MPU-6050

Mô-đun MPU-6050 có 8 chân,

INT: Chân đầu ra kỹ thuật số ngắt.

AD0: I2C Slave Address LSB pin. Đây là bit thứ 0 trong địa chỉ nô lệ 7 bit của thiết bị. Nếu được kết nối với VCC thì nó được đọc dưới dạng logic một và địa chỉ phụ sẽ thay đổi.

XCL: Chân đồng hồ nối tiếp phụ. Chân này được sử dụng để kết nối các cảm biến hỗ trợ giao diện I2C khác Chân SCL với MPU-6050.

XDA: Chân dữ liệu nối tiếp phụ. Chân này được sử dụng để kết nối các cảm biến hỗ trợ giao diện I2C khác Chân SDA với MPU-6050.

SCL: Chân đồng hồ nối tiếp. Kết nối chân này với chân SCL của vi điều khiển. SDA: chân Dữ liệu nối tiếp. Kết nối chân này với chân SDA của vi điều khiển.

GND: Chân nối đất. Kết nối chân này với kết nối đất.

VCC: Chân cấp nguồn. Kết nối chân này với nguồn + 5V DC. Mô-đun MPU-6050 có địa chỉ Slave (Khi AD0 = 0, tức là nó không được kết nối với Vcc) như, Địa chỉ ghi Slave (SLA + W): 0xD0

Địa chỉ đọc nô lệ (SLA + R): 0xD1

Bước 2: Tính toán

Tính toán
Tính toán

Dữ liệu cảm biến con quay hồi chuyển và gia tốc kế của mô-đun MPU6050 bao gồm dữ liệu thô 16 bit ở dạng bổ sung 2.

Dữ liệu cảm biến nhiệt độ của mô-đun MPU6050 bao gồm dữ liệu 16 bit (không phải ở dạng bổ sung 2).

Bây giờ, giả sử chúng ta đã chọn,

  • - Gia tốc kế toàn dải +/- 2g với Hệ số thang đo độ nhạy 16, 384 LSB (Đếm) / g.
  • - Con quay hồi chuyển toàn dải thang đo +/- 250 ° / s với Hệ số thang đo độ nhạy 131 LSB (Đếm) / ° / s. sau đó,

Để nhận dữ liệu thô của cảm biến, trước tiên chúng ta cần thực hiện bổ sung 2 đối với dữ liệu cảm biến của Gia tốc kế và con quay hồi chuyển. Sau khi nhận được dữ liệu thô của cảm biến, chúng tôi có thể tính toán gia tốc và vận tốc góc bằng cách chia dữ liệu thô của cảm biến với hệ số thang đo độ nhạy của chúng như sau--

Giá trị gia tốc kế tính bằng g (lực g)

  • Gia tốc dọc theo trục X = (Dữ liệu thô của gia tốc kế trục X / 16384) g.
  • Gia tốc dọc theo trục Y = (Dữ liệu thô của gia tốc kế trục Y / 16384) g.
  • Gia tốc dọc theo trục Z = (Dữ liệu thô trục Z của gia tốc kế / 16384) g.

Giá trị con quay hồi chuyển tính bằng ° / s (độ trên giây)

  • Vận tốc góc dọc theo trục X = (Dữ liệu thô của con quay hồi chuyển X trục / 131) ° / s.
  • Vận tốc góc dọc theo trục Y = (Dữ liệu thô của con quay hồi chuyển Y / 131) ° / s.
  • Vận tốc góc dọc theo trục Z = (Dữ liệu thô của con quay hồi chuyển Z trục / 131) ° / s.

Giá trị nhiệt độ tính bằng ° / c (độ trên độ C)

Nhiệt độ tính bằng độ C = ((dữ liệu cảm biến nhiệt độ) / 340 + 36,53) ° / c.

Ví dụ, Giả sử, sau 2’bổ sung, chúng ta nhận được giá trị thô của trục gia tốc X = +15454

Khi đó Ax = +15454 / 16384 = 0,94 g.

Hơn,

Vì vậy, chúng tôi biết chúng tôi đang chạy ở độ nhạy +/- 2G và +/- 250deg / s nhưng làm thế nào để các giá trị của chúng tôi tương ứng với các gia tốc / góc đó.

Đây là cả hai đồ thị đường thẳng và chúng ta có thể tìm ra từ chúng rằng đối với 1G, chúng ta sẽ đọc 16384 và đối với 1độ / giây, chúng ta sẽ đọc 131,07 (Mặc dù.07 sẽ bị bỏ qua do nhị phân) những giá trị này chỉ được tính bằng cách vẽ đồ thị đường thẳng với 2G tại 32767 và -2G tại -32768 và 250 / -250 tại cùng các giá trị.

Vì vậy, bây giờ chúng tôi biết các giá trị độ nhạy của mình (16384 và 131,07), chúng tôi chỉ cần trừ đi các hiệu số từ các giá trị của chúng tôi và sau đó phân bổ theo độ nhạy.

Các giá trị này sẽ hoạt động tốt đối với các giá trị X và Y nhưng vì Z được ghi ở 1G chứ không phải 0, chúng tôi sẽ cần phải trừ đi 1G (16384) trước khi chúng tôi chia cho độ nhạy của chúng tôi.

Bước 3: Kết nối MPU6050-Atmega328p

Kết nối MPU6050-Atmega328p
Kết nối MPU6050-Atmega328p
Kết nối MPU6050-Atmega328p
Kết nối MPU6050-Atmega328p
Kết nối MPU6050-Atmega328p
Kết nối MPU6050-Atmega328p

Chỉ cần Kết nối mọi thứ như được đưa ra trong sơ đồ…

Các kết nối được đưa ra như sau: -

MPU6050 Arduino Nano

Chân ra VCC 5v

GND chân đất

Pin SDA A4 // dữ liệu nối tiếp

SCL A5 pin // đồng hồ nối tiếp

Tính toán cao độ và cuộn: Cuộn là chuyển động quay quanh trục x và cao độ là chuyển động quay dọc theo trục y.

Kết quả tính bằng radian. (chuyển đổi sang độ bằng cách nhân với 180 và chia cho số pi)

Bước 4: Mã và giải thích

Mã và giải thích
Mã và giải thích

/*

Hướng dẫn sử dụng cảm biến gia tốc và con quay hồi chuyển Arduino và MPU6050 của Dejan, https://howtomechatronics.com * / #include const int MPU = 0x68; // Địa chỉ MPU6050 I2C float AccX, AccY, AccZ; float GyroX, GyroY, GyroZ; float accAngleX, accAngleY, gyroAngleX, gyroAngleY, gyroAngleZ; cuộn phao, cao độ, yaw; float AccErrorX, AccErrorY, GyroErrorX, GyroErrorY, GyroErrorZ; float elapsedTime, currentTime, trước đó; int c = 0; void setup () {Serial.begin (19200); Wire.begin (); // Khởi tạo giao tiếp Wire.beginTransmission (MPU); // Bắt đầu giao tiếp với MPU6050 // MPU = 0x68 Wire.write (0x6B); // Nói chuyện với thanh ghi 6B Wire.write (0x00); // Thực hiện đặt lại - đặt số 0 vào thanh ghi 6B Wire.endTransmission (true); // kết thúc quá trình truyền / * // Cấu hình độ nhạy của máy đo gia tốc - Dải thang đo đầy đủ (mặc định +/- 2g) Wire.beginTransmission (MPU); Wire.write (0x1C); // Nói chuyện với thanh ghi ACCEL_CONFIG (1C hex) Wire.write (0x10); // Đặt các bit thanh ghi là 00010000 (+/- 8g toàn dải) Wire.endTransmission (true); // Cấu hình độ nhạy con quay hồi chuyển - Dải thang đo đầy đủ (mặc định +/- 250deg / s) Wire.beginTransmission (MPU); Wire.write (0x1B); // Nói chuyện với thanh ghi GYRO_CONFIG (1B hex) Wire.write (0x10); // Đặt các bit thanh ghi là 00010000 (1000deg / s đầy đủ) Wire.endTransmission (true); chậm trễ (20); * / // Gọi hàm này nếu bạn cần lấy các giá trị lỗi IMU cho mô-đun của mình allow_IMU_error (); chậm trễ (20); } void loop () {// === Đọc dữ liệu tăng tốc === // Wire.beginTransmission (MPU); Wire.write (0x3B); // Bắt đầu với thanh ghi 0x3B (ACCEL_XOUT_H) Wire.endTransmission (false); Wire.requestFrom (MPU, 6, true); // Đọc tổng cộng 6 thanh ghi, mỗi giá trị trục được lưu trong 2 thanh ghi // Đối với phạm vi + -2g, chúng ta cần chia các giá trị thô cho 16384, theo biểu dữ liệu AccX = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Giá trị trục X AccY = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Giá trị trục Y AccZ = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Giá trị trục Z // Tính toán Roll và Pitch từ dữ liệu gia tốc kế accAngleX = (atan (AccY / sqrt (pow (AccX, 2) + pow (AccZ, 2))) * 180 / PI) - 0,58; // AccErrorX ~ (0.58) Xem hàm tùy chỉnh tính toán_IMU_error () để biết thêm chi tiết accAngleY = (atan (-1 * AccX / sqrt (pow (AccY, 2) + pow (AccZ, 2))) * 180 / PI) + 1,58; // AccErrorY ~ (-1,58) // === Đọc dữ liệu con quay hồi chuyển === // beforeTime = currentTime; // Thời gian trước đó được lưu trữ trước thời gian thực đọc currentTime = millis (); // Thời gian hiện tại thời gian thực đọc elapsedTime = (currentTime - beforeTime) / 1000; // Chia cho 1000 để được giây Wire.beginTransmission (MPU); Wire.write (0x43); // Địa chỉ thanh ghi đầu tiên của dữ liệu con quay hồi chuyển 0x43 Wire.endTransmission (false); Wire.requestFrom (MPU, 6, true); // Đọc tổng cộng 4 thanh ghi, mỗi giá trị trục được lưu trong 2 thanh ghi GyroX = (Wire.read () << 8 | Wire.read ()) / 131.0; // Đối với phạm vi 250deg / s, chúng ta phải chia giá trị thô đầu tiên cho 131.0, theo biểu dữ liệu GyroY = (Wire.read () << 8 | Wire.read ()) / 131.0; GyroZ = (Wire.read () << 8 | Wire.read ()) / 131.0; // Sửa các kết quả đầu ra với các giá trị lỗi được tính toán GyroX = GyroX + 0.56; // GyroErrorX ~ (-0.56) GyroY = GyroY - 2; // GyroErrorY ~ (2) GyroZ = GyroZ + 0.79; // GyroErrorZ ~ (-0,8) // Hiện tại các giá trị thô tính bằng độ trên giây, deg / s, vì vậy chúng ta cần nhân với số giây để có được góc theo độ gyroAngleX = gyroAngleX + GyroX * elapsedTime; // deg / s * s = deg gyroAngleY = gyroAngleY + GyroY * elapsedTime; yaw = yaw + GyroZ * elapsedTime; // Bộ lọc bổ sung - kết hợp các giá trị góc của bộ gia tốc và con quay hồi chuyển roll = 0,96 * gyroAngleX + 0,04 * accAngleX; sân = 0,96 * gyroAngleY + 0,04 * accAngleY; // In các giá trị trên màn hình nối tiếp Serial.print (roll); Serial.print ("/"); Serial.print (cao độ); Serial.print ("/"); Serial.println (yaw); } void allow_IMU_error () {// Chúng ta có thể gọi đây là funtion trong phần thiết lập để tính toán gia tốc kế và lỗi dữ liệu con quay hồi chuyển. Từ đây, chúng ta sẽ nhận được các giá trị lỗi được sử dụng trong các phương trình trên được in trên Serial Monitor. // Lưu ý rằng chúng ta nên đặt IMU bằng phẳng để có được các giá trị thích hợp, để sau đó chúng ta có thể có các giá trị chính xác // Đọc các giá trị của gia tốc kế 200 lần while (c <200) {Wire.beginTransmission (MPU); Wire.write (0x3B); Wire.endTransmission (sai); Wire.requestFrom (MPU, 6, true); AccX = (Wire.read () << 8 | Wire.read ()) / 16384.0; AccY = (Wire.read () << 8 | Wire.read ()) / 16384.0; AccZ = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Tính tổng tất cả các lần đọc AccErrorX = AccErrorX + ((atan ((AccY) / sqrt (pow ((AccX), 2) + pow ((AccZ), 2))) * 180 / PI)); AccErrorY = AccErrorY + ((atan (-1 * (AccX) / sqrt (pow ((AccY), 2) + pow ((AccZ), 2))) * 180 / PI)); c ++; } // Chia tổng cho 200 để nhận giá trị lỗi AccErrorX = AccErrorX / 200; AccErrorY = AccErrorY / 200; c = 0; // Đọc giá trị con quay hồi chuyển 200 lần while (c <200) {Wire.beginTransmission (MPU); Wire.write (0x43); Wire.endTransmission (sai); Wire.requestFrom (MPU, 6, true); GyroX = Wire.read () << 8 | Wire.read (); GyroY = Wire.read () << 8 | Wire.read (); GyroZ = Wire.read () << 8 | Wire.read (); // Tính tổng tất cả các lần đọc GyroErrorX = GyroErrorX + (GyroX / 131.0); GyroErrorY = GyroErrorY + (GyroY / 131.0); GyroErrorZ = GyroErrorZ + (GyroZ / 131.0); c ++; } // Chia tổng cho 200 để nhận giá trị lỗi GyroErrorX = GyroErrorX / 200; GyroErrorY = Con quay hồi chuyểnY / 200; GyroErrorZ = GyroErrorZ / 200; // In các giá trị lỗi trên Serial Monitor Serial.print ("AccErrorX:"); Serial.println (AccErrorX); Serial.print ("AccErrorY:"); Serial.println (AccErrorY); Serial.print ("GyroErrorX:"); Serial.println (GyroErrorX); Serial.print ("GyroErrorY:"); Serial.println (GyroErrorY); Serial.print ("GyroErrorZ:"); Serial.println (GyroErrorZ); } ------------------------------------------------- ---------------------------------------------- Kết quả: - X = Y = Z = --------------------------------------------- ----------------------------------------------- Lưu ý quan trọng: - ----------------

Trong phần vòng lặp, chúng tôi bắt đầu bằng cách đọc dữ liệu gia tốc kế. Dữ liệu cho mỗi trục được lưu trữ trong 2 byte hoặc thanh ghi và chúng ta có thể thấy địa chỉ của các thanh ghi này từ biểu dữ liệu của cảm biến.

Để đọc tất cả chúng, chúng ta bắt đầu với thanh ghi đầu tiên và sử dụng hàm DemestFrom (), chúng ta yêu cầu đọc tất cả 6 thanh ghi cho các trục X, Y và Z. Sau đó, chúng tôi đọc dữ liệu từ mỗi thanh ghi, và vì các đầu ra là bổ sung hai phần, chúng tôi kết hợp chúng một cách thích hợp để có được các giá trị chính xác.

Bước 5: Tìm hiểu Góc nghiêng

Gia tốc kế

Trọng lực của trái đất là một gia tốc không đổi trong đó lực luôn hướng xuống tâm Trái đất.

Khi gia tốc kế song song với trọng lực, gia tốc đo được sẽ là 1G, khi gia tốc kế vuông góc với trọng lực, nó sẽ đo được 0G.

Góc nghiêng có thể được tính toán từ gia tốc đo được bằng cách sử dụng phương trình sau:

θ = sin-1 (Gia tốc đo được / Gia tốc trọng trường)

GyroGyro (cảm biến tốc độ a.k.a.) được sử dụng để đo vận tốc góc (ω).

Để có được góc nghiêng của robot, chúng ta cần tích hợp dữ liệu từ con quay hồi chuyển như trong phương trình dưới đây:

ω = dθ / dt, θ = ∫ ω dt

Con quay hồi chuyển và cảm biến gia tốc kết hợp Sau khi nghiên cứu các đặc điểm của cả con quay hồi chuyển và gia tốc kế, chúng tôi biết rằng chúng có điểm mạnh và điểm yếu riêng. Góc nghiêng được tính toán từ dữ liệu gia tốc kế có thời gian phản hồi chậm, trong khi góc nghiêng tích hợp từ dữ liệu con quay hồi chuyển có thể bị lệch trong một khoảng thời gian. Nói cách khác, chúng ta có thể nói rằng dữ liệu gia tốc kế hữu ích trong dài hạn trong khi dữ liệu con quay hồi chuyển hữu ích trong ngắn hạn.

Liên kết để hiểu rõ hơn: Bấm vào đây

Đề xuất: