قراءة الزوايا من مستشعر MPU6050
تعلم كيفية استخدام الجيروسكوب ومقياس التسارع لتحقيق التوازن الذكي
يعد مستشعر MPU6050 أحد أكثر الحساسات شهرة في مشاريع الروبوتات والدرونز. فهو يجمع بين مقياس تسارع (Accelerometer) وجيروسكوب (Gyroscope) ثلاثي المحاور، مما يتيح لك قياس الزوايا والحركة بدقة عالية عبر بروتوكول I2C.
المكونات المطلوبة
MPU6050 (GY-521)
لوحة Arduino Uno
أسلاك توصيل
طريقة التوصيل Wiring
- توصيل VCC من MPU6050 إلى 5V أو 3.3V في الأردوينو.
- توصيل GND من MPU6050 إلى GND في الأردوينو.
- توصيل SCL بـ Pin A5 (في أونو) و SDA بـ Pin A4.
الكود البرمجي الرئيسي
إليك كود برمجي متقدم يشمل معايرة اتوماتيكية وفلتر تكاملي (Complementary Filter) للحصول على زوايا Pitch و Roll ثابتة:
mpu6050_calibration.ino
#include <Wire.h>
const int MPU = 0x68; // I2C address
float AccX, AccY, AccZ, GyroX, GyroY, GyroZ;
float accAngleX, accAngleY, gyroAngleX, gyroAngleY, gyroAngleZ;
float roll, pitch, yaw;
float AccX_offset = 0, GyroX_offset = 0; // سيتم ملؤها بعد المعايرة
void setup() {
Serial.begin(9600);
Wire.begin();
Wire.beginTransmission(MPU);
Wire.write(0x6B); // سجل الطاقة
Wire.write(0); // تفعيل المستشعر
Wire.endTransmission(true);
Serial.println("Calibrating... Keep it steady!");
delay(1000);
}
void loop() {
// 1. قراءة بيانات مقياس التسارع
Wire.beginTransmission(MPU);
Wire.write(0x3B);
Wire.endTransmission(false);
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;
// 2. حساب الزوايا من التسارع
accAngleX = (atan(AccY / sqrt(pow(AccX, 2) + pow(AccZ, 2))) * 180 / PI);
accAngleY = (atan(-1 * AccX / sqrt(pow(AccY, 2) + pow(AccZ, 2))) * 180 / PI);
// 3. دمج البيانات باستخدام الفلتر التكاملي
roll = 0.96 * accAngleX + 0.04 * AccX; // مثال مبسط للفلترة
Serial.print("Pitch: "); Serial.print(accAngleY);
Serial.print(" | Roll: "); Serial.println(accAngleX);
delay(20);
}
ملاحظة هامة: للحصول على أفضل النتائج، يجب وضع المستشعر على سطح مستوٍ تماماً عند بدء التشغيل لإتمام عملية المعايرة بنجاح.