تعلم الوحدات · الدرس 2.15
وحدة القياس بالقصور الذاتي (MPU-6050 Module)
العودة إلى الدروسالتعرف على الوحدة
ستتعلم استخدام MPU-6050، وهي وحدة قياس بالقصور الذاتي (IMU) متوافقة مع Arduino. تستخدم هذه الحساسات في الروبوتات المتوازنة ذاتيًا والطائرات غير المأهولة والهواتف الذكية وغيرها.
المكونات المطلوبة
- لوحة أردوينو (ELEGOO UNO R3).
- وحدة القياس بالقصور الذاتي (MPU-6050 Module).
- أربعة أسلاك أنثى إلى ذكر (F-M Wires).
الحساس
يجمع حساس InvenSense مقياس تسارع MEMS وجيروسكوب MEMS في شريحة واحدة. يحتوي محولًا من التناظري إلى الرقمي بدقة 16 بت لكل قناة، فيلتقط X و Y و Z معًا. يتصل بـ Arduino عبر I2C. تكلفته قليلة نسبيًا بالنظر إلى جمع الحساسين.
تستخدم IMU في الهواتف والأجهزة القابلة للارتداء ووحدات الألعاب. تساعد على تحديد وضعية جسم مثبت عليها في الفضاء ثلاثي الأبعاد، وغالبًا تمثل النتائج بزوايا. تستخدم الهواتف ذلك لتحديد اتجاهها، وأجهزة مثل Nike FuelBand و Fitbit لتتبع الحركة.

كيف تعمل IMU؟
تضم وحدات IMU عادة اثنين أو أكثر من: مقياس تسارع، جيروسكوب، مقياس مغناطيسية، ومقياس ارتفاع. MPU-6050 وحدة بست درجات حرية 6 DOF، أي ست قيم: ثلاث للتسارع وثلاث للجيروسكوب. تقوم على تقنية الأنظمة الكهروميكانيكية الدقيقة MEMS، ويتواصل الحساسان المدمجان عبر I2C، أي Inter Integrated Circuit.
مقياس التسارع (Accelerometer)
يمكن تقريب الفكرة بنموذج صندوق بداخله كرة صغيرة: عند إمالة الصندوق تتجه الكرة نحو أحد جدرانه بفعل الجاذبية. تقابل أزواج الجدران المحاور X و Y و Z، وتوضح كيف يتغير أثر الجاذبية مع الاتجاه. في مقياس التسارع (Accelerometer) MEMS تتحرك كتلة دقيقة تحت تأثير التسارع، ويُحوَّل تغير موضعها إلى إشارة كهربائية. تساعد قراءات المحاور الثلاثة على تقدير الميل عندما يكون الحساس ساكنًا.

الجيروسكوب (Gyroscope)
يقيس الجيروسكوب (Gyroscope) سرعة الدوران حول المحاور X و Y و Z. تهتز داخله بنية دقيقة، وعند دوران الحساس تؤثر فيها قوة كوريوليس، فتظهر حركة إضافية تتناسب مع سرعة الدوران. تلتقط دائرة القياس هذه الحركة وتحولها إلى قيم رقمية يقرأها المتحكم.

توصيل I2C


وصّل SDA إلى A4، و SCL إلى A5. يتكرر طرفا A4 و A5 على الجانب الآخر من اللوحة. بذلك تكتمل خطوط اتصال Arduino مع الوحدة.
المكتبة والبرنامج والنتائج
المكتبة المطلوبة هي MPU-6050. يعرض المثال القصير القيم الخام للتسارع والجيروسكوب (Gyroscope) والحرارة. يمكن تشغيله على Uno و Nano و Leonardo و Due.
قبل رفع البرنامج، تأكد من توفر مكتبة MPU6050 في بيئة Arduino IDE. إذا لم تكن مثبتة أو ظهرت رسالة تشير إلى مكتبة مفقودة، فاتبع خطوات التثبيت في قسم «ما هي المكتبات؟» وطرق تثبيتها في الدرس 1.5 «وميض LED وإضافة المكتبات».
افتح ملف البرنامج MPU-6050.ino من ملفات الدرس في بيئة Arduino IDE. بعد إتمام التوصيلات، وصّل لوحة أردوينو (UNO R3 Board) بالحاسوب بكابل توصيل (USB Cable)، ثم اضغط زر Upload (رفع) لنقل البرنامج إلى اللوحة وتشغيله عليها.
إذا تعذر نقل البرنامج إلى اللوحة، فراجع قسم «رفع البرنامج ومعالجة خطأ الاتصال» في الدرس 1.5 «وميض LED وإضافة المكتبات» للتحقق من اتصال USB واختيار نوع اللوحة والمنفذ التسلسلي في بيئة Arduino IDE.
افتح Serial Monitor لعرض البيانات، وراجع الدرس 2.4 «المراقب التسلسلي» لمعرفة طريقة فتحه وضبط سرعة الاتصال وقراءة البيانات.

الكود
MPU-6050/MPU-6050.ino
// MPU-6050 Short Example Sketch
//www.elegoo.com
//2016.12.9
#include<Wire.h>
const int MPU_addr=0x68; // I2C address of the MPU-6050
int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;
void setup(){
Wire.begin();
Wire.beginTransmission(MPU_addr);
Wire.write(0x6B); // PWR_MGMT_1 register
Wire.write(0); // set to zero (wakes up the MPU-6050)
Wire.endTransmission(true);
Serial.begin(9600);
}
void loop(){
Wire.beginTransmission(MPU_addr);
Wire.write(0x3B); // starting with register 0x3B (ACCEL_XOUT_H)
Wire.endTransmission(false);
Wire.requestFrom(MPU_addr,14,true); // request a total of 14 registers
AcX=Wire.read()<<8|Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
AcY=Wire.read()<<8|Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
AcZ=Wire.read()<<8|Wire.read(); // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
Tmp=Wire.read()<<8|Wire.read(); // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
GyX=Wire.read()<<8|Wire.read(); // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
GyY=Wire.read()<<8|Wire.read(); // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
GyZ=Wire.read()<<8|Wire.read(); // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)
Serial.print("AcX = "); Serial.print(AcX);
Serial.print(" | AcY = "); Serial.println(AcY);
Serial.print(" | AcZ = "); Serial.print(AcZ);
Serial.print(" | Tmp = "); Serial.print(Tmp/340.00+36.53); //From the datasheet of MPU6050, we can know the temperature formula
Serial.print(" | GyX = "); Serial.print(GyX);
Serial.print(" | GyY = "); Serial.println(GyY);
Serial.print(" | GyZ = "); Serial.println(GyZ);
}