تعلم الوحدات · الدرس 2.15

وحدة القياس بالقصور الذاتي (MPU-6050 Module)

العودة إلى الدروس

التعرف على الوحدة

ستتعلم استخدام MPU-6050، وهي وحدة قياس بالقصور الذاتي (IMU) متوافقة مع Arduino. تستخدم هذه الحساسات في الروبوتات المتوازنة ذاتيًا والطائرات غير المأهولة والهواتف الذكية وغيرها.

المكونات المطلوبة

الحساس

يجمع حساس InvenSense مقياس تسارع MEMS وجيروسكوب MEMS في شريحة واحدة. يحتوي محولًا من التناظري إلى الرقمي بدقة 16 بت لكل قناة، فيلتقط X و Y و Z معًا. يتصل بـ Arduino عبر I2C. تكلفته قليلة نسبيًا بالنظر إلى جمع الحساسين.

تستخدم IMU في الهواتف والأجهزة القابلة للارتداء ووحدات الألعاب. تساعد على تحديد وضعية جسم مثبت عليها في الفضاء ثلاثي الأبعاد، وغالبًا تمثل النتائج بزوايا. تستخدم الهواتف ذلك لتحديد اتجاهها، وأجهزة مثل Nike FuelBand و Fitbit لتتبع الحركة.

وحدة القياس بالقصور الذاتي (MPU-6050 Module) وأطرافها
وحدة القياس بالقصور الذاتي (MPU-6050 Module) وأطرافها

كيف تعمل IMU؟

تضم وحدات IMU عادة اثنين أو أكثر من: مقياس تسارع، جيروسكوب، مقياس مغناطيسية، ومقياس ارتفاع. MPU-6050 وحدة بست درجات حرية 6 DOF، أي ست قيم: ثلاث للتسارع وثلاث للجيروسكوب. تقوم على تقنية الأنظمة الكهروميكانيكية الدقيقة MEMS، ويتواصل الحساسان المدمجان عبر I2C، أي Inter Integrated Circuit.

مقياس التسارع (Accelerometer)

يمكن تقريب الفكرة بنموذج صندوق بداخله كرة صغيرة: عند إمالة الصندوق تتجه الكرة نحو أحد جدرانه بفعل الجاذبية. تقابل أزواج الجدران المحاور X و Y و Z، وتوضح كيف يتغير أثر الجاذبية مع الاتجاه. في مقياس التسارع (Accelerometer) MEMS تتحرك كتلة دقيقة تحت تأثير التسارع، ويُحوَّل تغير موضعها إلى إشارة كهربائية. تساعد قراءات المحاور الثلاثة على تقدير الميل عندما يكون الحساس ساكنًا.

رسم محاور التسارع وتأثير الجاذبية
رسم محاور التسارع وتأثير الجاذبية

الجيروسكوب (Gyroscope)

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

رسم تسارع كوريوليس
رسم تسارع كوريوليس

توصيل I2C

المخطط الكهربائي لوحدة القياس بالقصور الذاتي (MPU-6050 Module)
المخطط الكهربائي لوحدة القياس بالقصور الذاتي (MPU-6050 Module)
توصيل وحدة القياس بالقصور الذاتي (MPU-6050 Module) بلوحة أردوينو (UNO R3 Board)
توصيل وحدة القياس بالقصور الذاتي (MPU-6050 Module) بلوحة أردوينو (UNO R3 Board)

وصّل 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);
  
}

ملفات الدرس والمكتبات

المكتبات المرفقة

ملفات الدرس

100%

عرض الصورة

استخدم + و− للتكبير والتصغير، أو اضغط Esc للإغلاق.