كود البحث

كود أردوينو لـ MPU-6050 مع شاشة LCD1602 عبر I2C

كود أردوينو لـ MPU-6050 مع شاشة LCD1602 عبر I2C

في هذا الدرس سنتعلم كيفية توصيل مقياس التسارع والجيروسكوب MPU-6050 بشاشة LCD1602 باستخدام اتصال I2C. سيزوّد MPU-6050 بقياسات الزوايا التي سيتم عرضها على شاشة LCD. سيساعدك هذا المشروع على تصور زوايا MPU-6050 في الوقت الحقيقي، مما يعزز فهمك لبيانات المستشعر وواجهات توصيل العرض.

LCD1602-I2C display module with 4 wires

بحلول نهاية هذا البرنامج التعليمي، سيكون لديك إعداد عملي يعرض زوايا X وY وZ على شاشة LCD. هذه طريقة رائعة لاكتساب خبرة عملية في التعامل مع بيانات المستشعر وتقنيات العرض في مشاريع Arduino. لمزيد من التوضيح، تأكد من مشاهدة الفيديو (فيه عند 00:00).

شرح الأجهزة

المكونات الرئيسية لهذا المشروع هي المستشعر MPU-6050 ووحدة العرض LCD1602. يعتبر MPU-6050 مستشعرًا متعدد الاستخدامات يجمع بين مقياس تسارع ثلاثي المحاور وجيروسكوب ثلاثي المحاور، موفِّرًا قياسات زاوية في الوقت الحقيقي. يتواصل عبر I2C، مما يتيح تكاملاً سلسًا مع الأردوينو.

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

تفاصيل ورقة البيانات

الشركة المصنعةإنفينسينس
رقم القطعةMPU-6050
جهد المنطق/الإدخال والإخراج3.3 فولت / 5 فولت
جهد التغذية3.3 فولت إلى 5 فولت
معدل بيانات الإخراج1 كيلوهرتز (الحد الأقصى)
مدى الجيروسكوب±250, ±500, ±1000, ±2000 °/s
نطاق مقياس التسارع±2g، ±4g، ±8g، ±16g
حزمةمغلف رباعي مسطح بدون دبابيس (QFN)
ملاحظات / تنويعاتيتضمن معالج الحركة الرقمي (DMP)

  • تحقق من عنوان I2C (الافتراضي هو 0x68).
  • تأكد من أن جهد مصدر الطاقة مناسب (3.3 فولت أو 5 فولت).
  • استخدم مقاومات سحب لخطّي SDA وSCL إذا لم تكن موجودة بالفعل على اللوحة.
  • ضع في اعتبارك استخدام مكثفات فك الارتباط بالقرب من أطراف الطاقة لتحسين الاستقرار.
  • تحقق من توصيلات الأسلاك لتجنب مشاكل الاتصال.

تعليمات الأسلاك

Arduino wiring for MPU-6050 with LCD

لتوصيل MPU-6050 وشاشة LCD1602 بـ Arduino، اتبع التوصيلات التالية:

  • قم بتوصيل الـVCCدبوس الـMPU-6050 إلى الـ5Vدبوس على الأردوينو.
  • قم بتوصيل الـGNDدبوس الـMPU-6050 إلى الـGNDالدبوس على الأردوينو.
  • وصل الـSDAدبوس الـMPU-6050 إلى الـA4دبوس على لوحة الأردوينو.
  • وصل الـSCLدبوس الـMPU-6050 إلى الـA5الدبوس على الأردوينو.
  • بالنسبة لشاشة LCD1602، قم بتوصيل الـVCCتثبيت إلى5Vعلى الأردوينو.
  • قم بتوصيلGNDدبوس الـLCD1602 إلى الـGNDدبوس على الأردوينو.
  • وصل الـSDAالدبوس الخاص بـ LCD1602 إلى نفسهA4الدبوس المستخدم لـ MPU-6050.
  • قم بتوصيل الـSCLدبوس الـ LCD1602 إلى نفسهA5الدبوس المستخدم لوحدة MPU-6050.

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

أمثلة على الكود وشرح خطوة بخطوة

يبدأ الكود بتضمين المكتبات اللازمة لـ MPU-6050 وشاشة LCD. المقتطف التالي يوضح كيفية تهيئة MPU-6050:

MPU6050 mpu6050(Wire);

هنا نقوم بإنشاء الـMPU6050الكائن، الذي سيُستخدم لقراءة البيانات من المستشعر. بعد ذلك، نحتاج إلى إعداد الجهاز في الـsetup()دالة:

void setup() {
  Serial.begin(9600);
  Wire.begin();
  mpu6050.begin();
  mpu6050.calcGyroOffsets(true);
  lcd.begin();
  lcd.backlight();   
}

يقوم هذا الكود بتهيئة الاتصال التسلسلي، وناقل I2C، ومستشعر MPU-6050. كما يهيئ شاشة LCD ويشغل إضاءتها الخلفية. تحتوي الحلقة على المنطق لتحديث وعرض الزوايا:

void loop() {
  mpu6050.update();
  lcd.clear();
  lcdDisplay(0, 0, "X:", 2, 0, mpu6050.getAngleX());
  lcdDisplay(13, 0, "Y:", 0, 1, mpu6050.getAngleY());
  lcdDisplay(7, 1, "Z:", 9, 1, mpu6050.getAngleZ());
  delay(100);
}

في هذه الحلقة، تُحدَّث زوايا المحاور X وY وZ وتُعرض على شاشة LCD. الدالةlcdDisplay()يُستخدم لتنسيق المخرجات بشكل صحيح. يمكنك العثور على الكود الكامل الموجود أسفل المقال.

عرض توضيحي / ما الذي تتوقعه

عند اكتمال الإعداد وتحميل الكود، يجب أن ترى زوايا المحاور X وY وZ معروضة على شاشة LCD في الوقت الحقيقي. إذا كانت كل الوصلات موصولة بشكل صحيح، فستتجدد الشاشة كل 100 ميلي ثانية لتعرض الوضعية الحالية لوحدة MPU-6050.

من الأخطاء الشائعة التأكد من أن وصلات I2C صحيحة وأن مصدر الطاقة مستقر. إذا لم يتم تهيئة MPU-6050 بشكل صحيح، فقد ترى بيانات خاطئة أو لا تظهر أي بيانات على شاشة LCD (في الفيديو عند 01:15).

الصور

LCD1602-I2C display module with 4 wires
LCD1602-I2C display module with 4 wires
LCD1602-I2C display module with 4 wires
LCD1602-I2C display module with 4 wires
MPU-6050-module-1
MPU-6050-module-1
MPU-6050-module-2
MPU-6050-module-2
MPU-6050-module-schematic
MPU-6050-module-schematic
MPU-6050-module-1
MPU-6050-module-1
Arduino wiring for MPU-6050 with LCD
Arduino wiring for MPU-6050 with LCD
118-Arduino code for MPU-6050 accelerometer and gyroscope sensor (all data)
اللغة: C++
/*
 * 
 * This code is basic usage of the MPU-6050 accelerometer and gyroscope.
 * Running this code, you will get angles only.
 * The angles at X, Y, and Z are displayed on the LCD1602-I2C display module.
 * 
 * Library and code have been taken from:
 * https://github.com/tockn/MPU6050_tockn
 * 
 * Updated by Ahmad Shamshiri on July 05, 2018 at 22:19 in Ajax, Ontario, Canada
 * for Robojax.com
 * Get this code from Robojax.com
 * Watch video instructions for this code at: https://youtu.be/uIz6WIis4dc
 * 
 * You will need to watch two videos before following the instructions in this video:
 * 1-MPU6050 Introduction video and code: https://youtu.be/uhh7ik02aDc
 * 2-LCD1602 with I2C module video and code: https://youtu.be/q9YC_GVHy5A
 */
#include <MPU6050_tockn.h>
#include <Wire.h>

MPU6050 mpu6050(Wire);

#include <LiquidCrystal_I2C.h>
// Set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup() {
  Serial.begin(9600);
  Wire.begin();
  mpu6050.begin();
  mpu6050.calcGyroOffsets(true);

  // initialize the LCD, 
  lcd.begin();
  // Turn on the backlight and print a message.
  lcd.backlight();   
}

void loop() {

  mpu6050.update();
  Serial.print("angleX : ");
  Serial.print(mpu6050.getAngleX());
  Serial.print("\tangleY : ");
  Serial.print(mpu6050.getAngleY());
  Serial.print("\tangleZ : ");
  Serial.println(mpu6050.getAngleZ());
  
  lcd.clear();// clearn previous values from screen
  lcdDisplay(
             // to print X:
             0, // character 0  
             0, // line 0
             "X:", 

             // to print AngleX
             2, // character 2
             0, // line 0
             mpu6050.getAngleX() 
             );

  lcdDisplay(
             // to print Y:
             13, // character 13 
             0, // line 0
             "Y:", 

             // to print AngleY
             0, // character 0
             1, // line 1
             mpu6050.getAngleY() 
             );  

  lcdDisplay(
             // to print Z:
             7, // character 7 
             1, // line 1
             "Z:", 

             // to print AngleZ
             9, // character 9
             1, // line 0
             mpu6050.getAngleZ() 
             );                         
   delay(100);
}// loop end

/*
 * lcdDisplay(int tc, int tr, String title, int vc, int vr, float value)
 * displays value and title on LCD1602
 * How to use:
 * If you want to display: "Voltage: 13.56mV" starting from the first character
 * on the second row.
 * use:
 * lcdDisplay(0, 1, "Voltage: ", 13.56)
 *   
 * tc  is the character number  (0)
 * tr is the row number in the LCD (1)
 * title is the text ("Voltage:")
 * vc is the character number for the value
 * vr is the row number for the value
 * value is the value (13.56)
 */
void lcdDisplay(int tc, int tr, String title, int vc, int vr, float value)
{
   // Robojax.com MPU6050 Demo
   lcd.setCursor (tc,tr); //
   lcd.print(title);
   
   lcd.setCursor (vc,vr); //
   lcd.print(value);
 
}

الأشياء التي قد تحتاجها

الموارد والمراجع

ملفات📁

مكتبات أردوينو (ملف مضغوط)

Fritzing File