جدول المحتويات:

MPU 6050 Gyro ، اتصال التسارع مع Arduino (Atmega328p): 5 خطوات
MPU 6050 Gyro ، اتصال التسارع مع Arduino (Atmega328p): 5 خطوات

فيديو: MPU 6050 Gyro ، اتصال التسارع مع Arduino (Atmega328p): 5 خطوات

فيديو: MPU 6050 Gyro ، اتصال التسارع مع Arduino (Atmega328p): 5 خطوات
فيديو: How to use MPU-6050 Accelerometer and Gyroscope with Arduino code 2024, شهر نوفمبر
Anonim
MPU 6050 Gyro ، اتصال التسارع مع Arduino (Atmega328p)
MPU 6050 Gyro ، اتصال التسارع مع Arduino (Atmega328p)
MPU 6050 Gyro ، اتصال التسارع مع Arduino (Atmega328p)
MPU 6050 Gyro ، اتصال التسارع مع Arduino (Atmega328p)
MPU 6050 Gyro ، اتصال التسارع مع Arduino (Atmega328p)
MPU 6050 Gyro ، اتصال التسارع مع Arduino (Atmega328p)

يحتوي MPU6050 IMU على مقياس تسارع ثلاثي المحاور وجيروسكوب ثلاثي المحاور مدمج في شريحة واحدة.

يقيس الجيروسكوب سرعة الدوران أو معدل تغير الوضع الزاوي بمرور الوقت ، على طول المحور X و Y و Z.

تكون مخرجات الجيروسكوب بالدرجات في الثانية ، لذا من أجل الحصول على الموضع الزاوي ، نحتاج فقط إلى تكامل السرعة الزاوية.

من ناحية أخرى ، يقيس مقياس التسارع MPU6050 التسارع عن طريق قياس تسارع الجاذبية على طول المحاور الثلاثة وباستخدام بعض رياضيات حساب المثلثات يمكننا حساب الزاوية التي يتم فيها وضع المستشعر. لذلك ، إذا قمنا بدمج أو دمج بيانات مقياس التسارع والجيروسكوب ، فيمكننا الحصول على معلومات دقيقة للغاية حول اتجاه المستشعر.

جيروسكوب ثلاثي المحاور يتكون MPU-6050 من جيروسكوب ثلاثي المحاور يمكنه اكتشاف سرعة الدوران على طول المحور x و y و z باستخدام تقنية النظام الكهروميكانيكي الصغير (MEMS). عندما يتم تدوير المستشعر على طول أي محور ، يتم إنتاج اهتزاز بسبب تأثير Coriolis الذي تم اكتشافه بواسطة MEMS ، يتم استخدام 16 بت ADC لرقمنة الجهد لأخذ عينات من كل محور. + / - 250 ، +/- 500 ، +/- 1000، +/- 2000 هي النطاق الكامل لمقياس الإخراج. تقاس السرعة الزاوية على طول كل محور بالدرجة لكل وحدة ثانية.

رابط مفيد: …………….

لوحة اردوينو:. ……….

MPU6050 IMU ………………

الخطوة 1: وحدة MPU-6050

وحدة MPU-6050
وحدة MPU-6050

تحتوي وحدة MPU-6050 على 8 دبابيس ،

المترجم: مقاطعة طرف الإخراج الرقمي.

AD0: I2C Slave Address LSB pin. هذا هو 0 بت في 7 بت عنوان تابع للجهاز. إذا كان متصلاً بـ VCC ، فسيتم قراءته على أنه منطق واحد وتغيير عنوان الرقيق.

XCL: دبوس الساعة التسلسلي الإضافي. يستخدم هذا الدبوس لتوصيل مستشعرات أخرى ممكّنة لواجهة I2C SCL pin بـ MPU-6050.

XDA: دبوس البيانات التسلسلية المساعدة. يستخدم هذا الدبوس لتوصيل أجهزة الاستشعار الأخرى التي تم تمكين واجهة I2C بها ، SDA pin بـ MPU-6050.

SCL: دبوس الساعة التسلسلية. قم بتوصيل هذا الدبوس بدبوس SCL للميكروكونترولر. SDA: دبوس البيانات التسلسلية. قم بتوصيل هذا الدبوس بدبوس SDA لوحدات التحكم الدقيقة.

GND: دبوس الأرض. قم بتوصيل هذا الدبوس بالاتصال الأرضي.

VCC: دبوس مزود الطاقة. قم بتوصيل هذا الدبوس بمصدر تيار مستمر 5 فولت. تحتوي الوحدة النمطية MPU-6050 على عنوان تابع (عندما يكون AD0 = 0 ، أي أنه غير متصل بـ Vcc)

عنوان الكتابة التابعة (SLA + W): 0xD0

عنوان قراءة الرقيق (SLA + R): 0xD1

الخطوة الثانية: الحسابات

العمليات الحسابية
العمليات الحسابية

تتكون بيانات مستشعر الجيروسكوب ومقياس التسارع لوحدة MPU6050 من بيانات أولية 16 بت في شكل مكمل 2.

تتكون بيانات مستشعر درجة الحرارة لوحدة MPU6050 من بيانات 16 بت (ليست في شكل مكمل 2).

لنفترض الآن أننا اخترنا ،

  • - نطاق مقياس التسارع الكامل +/- 2g مع معامل مقياس الحساسية 16 ، 384 LSB (Count) / g.
  • - النطاق الكامل للجيروسكوب +/- 250 درجة / ثانية مع معامل مقياس الحساسية 131 LSB (Count) / ° / s. من ثم،

للحصول على بيانات مستشعر أولية ، نحتاج أولاً إلى إجراء مكمل 2 على بيانات المستشعر لمقياس التسارع والجيروسكوب. بعد الحصول على بيانات مستشعر أولية ، يمكننا حساب التسارع والسرعة الزاوية عن طريق قسمة بيانات المستشعر الخام مع عامل مقياس الحساسية الخاص بهم على النحو التالي -

قيم التسارع بوحدة g (قوة g)

  • التسارع على طول المحور X = (مقياس التسارع X بيانات أولية / 16384) ز.
  • التسارع على طول المحور Y = (مقياس التسارع Y بيانات أولية المحور / 16384) ز.
  • التسارع على طول المحور Z = (مقياس التسارع Z بيانات أولية / 16384) ز.

قيم الجيروسكوب بالدرجة / ثانية (درجة في الثانية)

  • السرعة الزاوية على طول المحور X = (البيانات الأولية لمحور الجيروسكوب X / 131) ° / ثانية.
  • السرعة الزاوية على طول المحور Y = (البيانات الأولية لمحور الجيروسكوب Y / 131) ° / ثانية.
  • السرعة الزاوية على طول المحور Z = (البيانات الأولية لمحور الجيروسكوب Z / 131) ° / ثانية.

قيمة درجة الحرارة في ° / c (درجة لكل مئوية)

درجة الحرارة بالدرجات المئوية = ((بيانات مستشعر درجة الحرارة) / 340 + 36.53) درجة / درجة مئوية.

على سبيل المثال،

لنفترض أنه بعد 2 'مكمل حصلنا على قيمة أولية لمقياس التسارع X لمحاور = +15454

ثم الفأس = +15454/16384 = 0.94 جم.

أكثر،

لذلك نحن نعلم أننا نعمل بحساسية +/- 2G و +/- 250 درجة / ثانية ولكن كيف تتوافق قيمنا مع تلك التسارع / الزوايا.

كلاهما رسمان بيانيان خطيان ويمكننا أن نستنتج منهما أنه بالنسبة إلى 1G سنقرأ 16384 وبالنسبة إلى 1 درجة / ثانية سنقرأ 131.07 (على الرغم من أن 0.07 سيتم تجاهلها بسبب ثنائي) ، فقد تم عمل هذه القيم للتو من خلال رسم رسم بياني خطي مستقيم مع 2G عند 32767 و -2G عند -32768 و 250 / -250 بنفس القيم.

الآن نحن نعرف قيم الحساسية لدينا (16384 و 131.07) نحتاج فقط إلى طرح التعويضات من قيمنا ثم تقسيمها حسب الحساسية.

ستعمل هذه بشكل جيد مع قيم X و Y ولكن نظرًا لتسجيل Z عند 1G وليس 0 ، فسنحتاج إلى طرح 1G (16384) قبل أن نقسم على حساسيتنا.

الخطوة 3: اتصالات MPU6050-Atmega328p

اتصالات MPU6050-Atmega328p
اتصالات MPU6050-Atmega328p
اتصالات MPU6050-Atmega328p
اتصالات MPU6050-Atmega328p
اتصالات MPU6050-Atmega328p
اتصالات MPU6050-Atmega328p

فقط قم بتوصيل كل شيء كما هو وارد في الرسم التخطيطي…

الوصلات موضحة كالتالي: -

MPU6050 اردوينو نانو

دبوس خرج VCC 5 فولت

دبوس الأرض GND

SDA A4 pin // البيانات التسلسلية

SCL A5 pin // الساعة التسلسلية

حساب الانحراف واللف: الدوران هو الدوران حول المحور السيني والميل هو الدوران على طول المحور الصادي.

النتيجة بالتقدير الدائري. (حول إلى درجات عن طريق الضرب في 180 والقسمة على pi)

الخطوة 4: الرموز والتوضيحات

الرموز والتوضيحات
الرموز والتوضيحات

/*

Arduino و MPU6050 Accelerometer and Gyroscope Sensor Tutorial بواسطة Dejan ، https://howtomechatronics.com * / #include const int MPU = 0x68؛ // MPU6050 I2C تعويم العنوان AccX ، AccY ، AccZ ؛ تعويم GyroX ، GyroY ، GyroZ ؛ تعويم accAngleX ، accAngleY ، gyroAngleX ، gyroAngleY ، gyroAngleZ ؛ لفة تعويم ، الملعب ، الانعراج ؛ تعويم AccErrorX ، AccErrorY ، GyroErrorX ، GyroErrorY ، GyroErrorZ ؛ تعويم elapsedTime ، CurrentTime ، previousTime ؛ كثافة العمليات ج = 0 ؛ إعداد باطل () {Serial.begin (19200) ؛ Wire.begin () ؛ // تهيئة سلك الاتصال. // بدء الاتصال بـ MPU6050 // MPU = 0x68 Wire.write (0x6B) ؛ // تحدث إلى السجل 6B Wire.write (0x00) ؛ // إجراء إعادة تعيين - ضع 0 في سجل 6B Wire.endTransmission (صحيح) ؛ // إنهاء الإرسال / * // تكوين حساسية مقياس التسارع - نطاق النطاق الكامل (افتراضي +/- 2 جم) Wire.beginTransmission (MPU) ؛ Wire.write (0x1C) ؛ // تحدث إلى سجل ACCEL_CONFIG (1C hex) Wire.write (0x10) ؛ // قم بتعيين بتات التسجيل على أنها 00010000 (+/- 8g نطاق كامل الحجم) Wire.endTransmission (صحيح) ؛ // تكوين حساسية الدوران - نطاق النطاق الكامل (افتراضي +/- 250 درجة / ثانية) Wire.beginTransmission (MPU) ؛ Wire.write (0x1B) ؛ // تحدث إلى سجل GYRO_CONFIG (1B hex) Wire.write (0x10) ؛ // قم بتعيين بتات السجل كـ 00010000 (مقياس كامل 1000deg / s) Wire.endTransmission (صحيح) ؛ تأخير (20) ؛ * / // اتصل بهذه الوظيفة إذا كنت بحاجة إلى الحصول على قيم خطأ IMU للوحدة الخاصة بك calculate_IMU_error () ؛ تأخير (20) ؛ } حلقة فارغة () {// === قراءة بيانات التسريع === // Wire.beginTransmission (MPU) ؛ Wire.write (0x3B) ؛ // ابدأ بالسجل 0x3B (ACCEL_XOUT_H) Wire.endTransmission (خطأ) ؛ Wire.request From (MPU، 6، true) ؛ // قراءة إجمالي 6 سجلات ، يتم تخزين كل قيمة محور في سجلين // بالنسبة إلى نطاق + -2 جم ، نحتاج إلى تقسيم القيم الأولية على 16384 ، وفقًا لورقة البيانات AccX = (Wire.read () << 8 | Wire.read ()) / 16384.0 ؛ // قيمة المحور السيني AccY = (Wire.read () << 8 | Wire.read ()) / 16384.0 ؛ // قيمة المحور Y AccZ = (Wire.read () << 8 | Wire.read ()) / 16384.0 ؛ // قيمة المحور Z // حساب التدوير والخطوة من بيانات مقياس التسارع accAngleX = (atan (AccY / sqrt (pow (AccX، 2) + pow (AccZ، 2))) * 180 / PI) - 0.58 ؛ // AccErrorX ~ (0.58) راجع الوظيفة المخصصة calculate_IMU_error () لمزيد من التفاصيل accAngleY = (atan (-1 * AccX / sqrt (pow (AccY، 2) + pow (AccZ، 2))) * 180 / PI) + 1.58 ؛ // AccErrorY ~ (-1.58) // === قراءة بيانات الجيروسكوب === // previousTime = currentTime ؛ // يتم تخزين الوقت السابق قبل الوقت الفعلي للقراءة CurrentTime = millis () ؛ // الوقت الحالي الوقت الفعلي للقراءة المنقضية = (currentTime - previousTime) / 1000 ؛ // قسّم على 1000 للحصول على ثوانٍ Wire.beginTransmission (MPU) ؛ Wire.write (0x43) ؛ // بيانات الجيروسكوب أولاً عنوان التسجيل 0x43 Wire.endTransmission (خطأ) ؛ Wire.request From (MPU، 6، true) ؛ // قراءة إجمالي 4 سجلات ، يتم تخزين كل قيمة محور في سجلين GyroX = (Wire.read () << 8 | Wire.read ()) / 131.0 ؛ // بالنسبة لنطاق 250deg / s ، يتعين علينا قسمة القيمة الأولية أولاً على 131.0 ، وفقًا لورقة البيانات GyroY = (Wire.read () << 8 | Wire.read ()) / 131.0 ؛ GyroZ = (Wire.read () << 8 | Wire.read ()) / 131.0 ؛ // تصحيح النواتج بقيم الخطأ المحسوبة GyroX = GyroX + 0.56 ؛ // GyroErrorX ~ (-0.56) GyroY = الدوران - 2 ؛ // GyroErrorY ~ (2) GyroZ = GyroZ + 0.79 ؛ // GyroErrorZ ~ (-0.8) // حاليًا القيم الأولية هي بالدرجات في الثانية ، deg / s ، لذلك نحن بحاجة إلى الضرب في Sendonds (s) للحصول على الزاوية بالدرجات gyroAngleX = gyroAngleX + GyroX * elapsedTime ؛ // deg / s * s = deg gyroAngleY = gyroAngleY + GyroY * elapsedTime ؛ ياو = ياو + جيروز * انقضت الوقت ؛ // مرشح تكميلي - اجمع بين قيم التسارع وزاوية الدوران لفة = 0.96 * gyroAngleX + 0.04 * accAngleX ؛ الملعب = 0.96 * زاوية الدوران + 0.04 * accAngleY ؛ // طباعة القيم على الشاشة التسلسلية Serial.print (لفة) ؛ Serial.print ("/") ؛ Serial.print (الملعب) ؛ Serial.print ("/") ؛ Serial.println (ياو) ؛ } void calculate_IMU_error () {// يمكننا استدعاء funtion في قسم الإعداد لحساب مقياس التسارع وخطأ بيانات الدوران. من هنا سوف نحصل على قيم الخطأ المستخدمة في المعادلات أعلاه مطبوعة على Serial Monitor. // لاحظ أنه يجب علينا وضع وحدة IMU بشكل مسطح من أجل الحصول على القيم المناسبة ، حتى نتمكن بعد ذلك من القيم الصحيحة // قراءة قيم مقياس التسارع 200 مرة بينما (c <200) {Wire.beginTransmission (MPU) ؛ Wire.write (0x3B) ؛ Wire.endTransmission (خطأ) ؛ Wire.request From (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 ؛ // مجموع كل القراءات 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)) ؛ سي ++ ؛ } // قسّم المجموع على 200 للحصول على قيمة الخطأ AccErrorX = AccErrorX / 200؛ AccErrorY = AccErrorY / 200 ؛ ج = 0 ؛ // قراءة قيم الدوران 200 مرة أثناء (c <200) {Wire.beginTransmission (MPU) ؛ Wire.write (0x43) ؛ Wire.endTransmission (خطأ) ؛ Wire.request From (MPU، 6، true) ؛ GyroX = Wire.read () << 8 | Wire.read () ؛ GyroY = Wire.read () << 8 | Wire.read () ؛ GyroZ = Wire.read () << 8 | Wire.read () ؛ // جمع كل القراءات GyroErrorX = GyroErrorX + (GyroX / 131.0) ؛ GyroErrorY = GyroErrorY + (GyroY / 131.0) ، GyroErrorZ = GyroErrorZ + (GyroZ / 131.0) ؛ سي ++ ؛ } // قسّم المجموع على 200 للحصول على قيمة الخطأ GyroErrorX = GyroErrorX / 200 ؛ GyroErrorY = GyroErrorY / 200 ؛ GyroErrorZ = GyroErrorZ / 200 ؛ // طباعة قيم الخطأ على 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) ، } ------------------------------------------------- ---------------------------------------------- النتائج: - X = Y = Z = --------------------------------------------- ----------------------------------------------- ملاحظة مهمة: - ----------------

في قسم الحلقة ، نبدأ بقراءة بيانات مقياس التسارع. يتم تخزين البيانات الخاصة بكل محور في 2 بايت أو سجلات ويمكننا رؤية عناوين هذه السجلات من ورقة بيانات المستشعر.

من أجل قراءتها جميعًا ، نبدأ بالسجل الأول ، وباستخدام الوظيفة RequiestFrom () نطلب قراءة جميع السجلات الستة لمحاور X و Y و Z. ثم نقرأ البيانات من كل سجل ، ولأن المخرجات ثنائية ، فإننا نجمعها بشكل مناسب للحصول على القيم الصحيحة.

الخطوة الخامسة: فهم زاوية الميل

مقياس التسارع

جاذبية الأرض عبارة عن تسارع ثابت حيث تشير القوة دائمًا إلى مركز الأرض.

عندما يكون مقياس التسارع موازيًا للجاذبية ، سيكون التسارع المقاس 1G ، وعندما يكون مقياس التسارع متعامدًا مع الجاذبية ، سيقيس 0G.

يمكن حساب زاوية الميل من التسارع المقاس باستخدام هذه المعادلة:

θ = sin-1 (التسارع المقاس / تسارع الجاذبية)

يستخدم الجيروسكوب (مستشعر معدل) لقياس السرعة الزاوية (ω).

من أجل الحصول على زاوية إمالة الروبوت ، نحتاج إلى دمج البيانات من الدوران كما هو موضح في المعادلة أدناه:

ω = dθ / dt ،

θ = ∫ ω دينارا

الجيروسكوب ومستشعر التسارع الانصهار بعد دراسة خصائص كل من الجيروسكوب ومقياس التسارع ، نعلم أن لديهم نقاط قوتهم وضعفهم. تتميز زاوية الميل المحسوبة من بيانات مقياس التسارع بوقت استجابة بطيء ، بينما تخضع زاوية الميل المدمجة من بيانات الدوران للانحراف خلال فترة زمنية. بمعنى آخر ، يمكننا القول أن بيانات مقياس التسارع مفيدة على المدى الطويل بينما بيانات الدوران مفيدة على المدى القصير.

رابط لفهم أفضل: انقر هنا

موصى به: