مستوى الروح الرقمي المستند إلى Arduino و MPU6050: 3 خطوات
مستوى الروح الرقمي المستند إلى Arduino و MPU6050: 3 خطوات
Anonim
Image
Image
الدائرة
الدائرة

مرحبًا بكم في أول تدريب لي على الإطلاق! آمل أن تجدها مفيدة. لا تتردد في ترك تعليقات إيجابية أو سلبية.

يهدف هذا المشروع إلى إنشاء مستوى روح رقمي قائم على اردوينو و MPU6050. في حين أن التصميم النهائي والكود هو لي ، فإن المفهوم الأصلي والكثير من الكود الذي عملت منه ليس كذلك. أنا لست في الانتحال ، لذلك أنا أكثر من سعيد لمنح الفضل لأولئك الذين بنيت عليهم الأفكار. الشخصان الرئيسيان اللذان أريد أن أصرحا لهما هما Paul McWhorter من YouTuber و DroneBot Workshop. أقوم بتضمين روابط لهم في روابط PDF المفيدة الخاصة بي على youtube. شكرًا أيضًا لـ EEEnthusiast على الفيديو التثقيفي الخاص به حول استخدام MPU6050 بما في ذلك الإعداد والقراءة من الوحدة بدون مكتبة خارجية (الرابط الخاص به في نفس ملف PDF).

المشروع الذي أنتجته يعمل "كما هو" وهو دقيق بشكل خرافي ، بالتأكيد يصل إلى 45٪ في كلا الاتجاهين. يمكنك استخدامه تمامًا كما صممته ، أو يمكنك تخصيصه حسب ذوقك. كلما لاحظت أن مشروعي يبدو متطابقًا تقريبًا مع المشروع الذي أنتجته ورشة عمل DroneBot ، لكن كن مطمئنًا ، فهناك اختلافات كبيرة ، خاصة عندما يتعلق الأمر برمز حساب الزوايا ، بالإضافة إلى مرفق لتخزين قيم المعايرة في ابروم!

بعض الميزات لإثارة شهيتك:

تتوفر زوايا الميل واللف في حدود 0.1 درجة.

الكشف التلقائي عن اتجاه وحدة الدوران (أفقيًا أو رأسيًا)

المعايرة الكاملة مع النتائج المخزنة تلقائيًا في eeprom

مؤشر LED من -2 إلى +2 درجة (قابل للتغيير في الكود)

إشارة صوتية إضافية للمستوى (يمكن تشغيلها / إيقاف تشغيلها أثناء الطيران)

curcuit مضغوط يتطلب مكونات قليلة

هيا بنا نبدأ.

اللوازم

يستخدم هذا المشروع (كما هو) العناصر التالية:

1 × اردوينو نانو (لي نسخة مستنسخة)

1 × MPU6050 وحدة الدوران / مقياس التسارع

1 × LCD - 16 × 2 + اتصال I2C

1 × اضغط لجعل التبديل

1 × جرس بيزو

1 × ليد أخضر

2 × ليد أصفر

2 × ليد أحمر

مقاومات 5 × 220 أوم

كابلات توصيل مختلفة

اللوح

مزود الطاقة (استخدم لي بنك طاقة 5 فولت USB ، عندما لا يكون متصلاً بجهاز الكمبيوتر الخاص بي ، ولكن يمكنك استخدام بطارية متصلة بشكل مناسب)

الخطوة 1: الدائرة

الدائرة
الدائرة
الدائرة
الدائرة

بافتراض أن لديك جميع المكونات ، ستحتاج إلى بناء لوح التجارب.

أعرض الإعداد الخاص بي كدليل ، لكن الاتصالات هي كما يلي:

يتصل Arduino pin D2 بجانب واحد من مفتاح الدفع. يتصل الجانب الآخر من مفتاح الدفع بالأرض

يتصل Arduino pin D3 بجانب واحد من المقاوم 220 أوم. يتصل الجانب الآخر من المقاوم بإطار LED الأحمر. يذهب كاثود الصمام الأحمر إلى الأرض.

يتصل Arduino pin D4 بجانب واحد من المقاوم 220 أوم. الجانب الآخر من المقاوم يتصل بأنود الصمام الأصفر. يذهب الكاثود من الصمام الأصفر إلى الأرض.

يتصل Arduino pin D5 بجانب واحد من المقاوم 220 أوم. يتصل الجانب الآخر من المقاوم بمصباح LED الأخضر. يذهب كاثود LED الأخضر إلى الأرض.

يتصل Arduino pin D6 بجانب واحد من المقاوم 220 أوم. الجانب الآخر من المقاوم يتصل بأنود الصمام الأصفر. يذهب الكاثود من الصمام الأصفر إلى الأرض.

يتصل Arduino pin D7 بجانب واحد من المقاوم 220 أوم. يتصل الجانب الآخر من المقاوم بإطار LED الأحمر. يذهب كاثود الصمام الأحمر إلى الأرض.

يتصل Arduino pin D8 بجانب واحد من Piezo buzzer. الجانب الآخر من الجرس يتصل بالأرض.

يتصل Arduino pin A4 بدبابيس SDA على MPU6050 وشاشة LCD.

يتصل Arduino pin A5 بدبابيس SCL على MPU6050 وشاشة LCD

تأتي الطاقة 5 فولت و Gnd لـ MPU6050 و LCD من دبابيس Arduino Nano 5v و GND على التوالي.

بمجرد الانتهاء ، يجب أن يكون مشابهًا للإعداد الموضح. أضع blu tak تحت MPU6050 لإيقافه عن الحركة وأيضًا على شاشة LCD لإبقائه على حافة اللوح.

الخطوة الثانية: الكود

الكود المرفق هو الكود الذي استخدمته لهذا المشروع. المكتبة الوحيدة التي قد تواجه مشكلة معها هي

مكتبة LiquidCrystal_I2C.h حيث قمت باستيراد هذا عندما بدأت العمل مع شاشات LCD لأول مرة. لسوء الحظ ، هناك عدد قليل من المكتبات التي تستخدم نفس العبارة #include ، لكنها مختلفة قليلاً. إذا كانت لديك مشكلات مع رمزك ، فابحث عن رمز LCD آخر يناسبك وقم بتعديل الرمز وفقًا لذلك. من المحتمل فقط أن يكون الإعداد هو المختلف. يجب أن تعمل جميع أوامر "الطباعة" بالطريقة نفسها.

تم التعليق على جميع الكود وبافتراض أنني فعلت ذلك بشكل صحيح ، سيكون هناك أيضًا مقطع فيديو يشرح كل شيء ، ولكن إليك بعض النقاط التي يجب ملاحظتها:

LiquidCrystal_I2C lcd (0x27، 16، 2) ؛

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

{lcd.setCursor (0، 1) ؛ lcd.print ("أفقي!") ؛ الاتجاه = أفقي ؛ // اقرأ بيانات acc و gyro من MPU-6050 1000 مرة لـ (int cal_int = 0 ؛ cal_int <1000 ؛ cal_int ++) {read_mpu_6050_data () ؛ // أضف الإزاحة الدورانية x إلى gyro_x_cal المتغير gyro_x_cal + = gyro_x؛ // أضف الإزاحة الدورانية y إلى gyro_y_cal المتغير gyro_y_cal + = gyro_y ؛ // أضف الإزاحة الدورانية z إلى gyro_z_cal المتغير gyro_z_cal + = gyro_z ؛ // أضف تعويض acc x إلى المتغير acc_x_cal acc_x_cal + = acc_x ؛ // أضف تعويض acc y إلى متغير acc_y_cal + = acc_y ؛ } // قسّم جميع النتائج على 1000 للحصول على متوسط الإزاحة gyro_x_cal / = 1000.0 ؛ gyro_y_cal / = 1000.0 ؛ gyro_z_cal / = 1000.0 ؛ acc_x_cal / = 1000.0 ؛ acc_y_cal / = 1000.0 ؛ horizonalCalibration = 255 ؛ eeprom_address = 0 ؛ EEPROM.put (eeprom_address، horizonalCalibration) ؛ eeprom_address + = sizeof (int) ؛ EEPROM.put (eeprom_address، gyro_x_cal) ؛ eeprom_address + = sizeof (تعويم) ؛ EEPROM.put (eeprom_address، gyro_y_cal) ؛ eeprom_address + = sizeof (تعويم) ؛ EEPROM.put (eeprom_address، gyro_z_cal) ؛ eeprom_address + = sizeof (تعويم) ؛ EEPROM.put (eeprom_address، acc_x_cal) ؛ eeprom_address + = sizeof (تعويم) ؛ EEPROM.put (eeprom_address، acc_y_cal) ؛ eeprom_address + = sizeof (تعويم) ؛ // لاحظ أننا لا نقوم بتخزين تعويض لـ acc_z ، بسبب الجاذبية! تأخير (500) ؛ }

يتم تنفيذ الكتلة أعلاه من التعليمات البرمجية لروتين المعايرة. هذا الرمز للمعايرة الأفقية. يوجد رمز متطابق تقريبًا للمعايرة الرأسية (لاحظ أن الكود يعرف ما إذا كان MPU6050 مركبًا أفقيًا أم رأسيًا!). MPU6050 ، يُقرأ 1000 مرة. يتم إضافة القيم المناسبة بشكل تراكمي ثم يتم تقسيمها على 1000 لإعطاء متوسط قيمة "تعويض". ثم يتم تخزين هذه القيم في Nano eeprom. يتم تخزين جميع قيم المعايرة الأفقية بدءًا من عنوان eeprom 0. يتم تخزين جميع القيم الرأسية بدءًا من عنوان eeprom 24. يجب إجراء المعايرة على سطح مستوٍ تمامًا ، وإلا فإنها لا تعني شيئًا.

/ * * تعالج الأسطر القليلة التالية البيانات الأولية لتغييرها إلى زوايا يمكن إخراجها إلى شاشات LCD و LED. * قيمة 4096 ، التي يتم تقسيم بيانات التسريع عليها ، مأخوذة من ورقة بيانات MPU6050 وتعتمد على معدل العينة. * قيمة 9.8 هي الجاذبية * الدالة atan2 مأخوذة من وحدة الرياضيات وتستخدم لحساب الزوايا من البيانات المعطاة * / thetaM = -atan2 ((acc_x / 4096.0) /9.8 ، (acc_z / 4096.0) /9.8) /2/3.141592656 * 360 ؛ // البيانات الأولية phiM = -atan2 ((acc_y / 4096.0) /9.8، (acc_z / 4096.0) /9.8) /2/3.141592656 * 360 ؛ // البيانات الأولية dt = (millis () - millisOld) / 1000.؛ ميليس أولد = ميلي () ؛ / * * يستخدم هذا القسم بيانات الدوران لجعل النظام أكثر استجابة * قيمة 65.5 ، والتي يتم تقسيم البيانات الجيروسكوبية عليها مأخوذة من ورقة بيانات MPU6050 وتستند إلى معدل العينة * / ثيتا = (ثيتا + (gyro_y / 65.5) * dt) *.96 + thetaM *.04 ؛ // مرشح تمرير منخفض phi = (phi + (gyro_x / 65.5) * dt) *.96 + phiM *.04؛ // مرشح تمرير منخفض

الكود أعلاه هو المادة التي تحسب الزوايا. نأمل أن تعطي التعليقات نظرة ثاقبة حول كيفية عملها ، ولكن للحصول على شرح مفصل ، تحقق من فيديو Paul McWhorters المرتبط في ملف PDF المرفق. ما سأقوله على الرغم من ذلك هو أنه يمكنك تغيير معدل العينة للجيروسكوب ومقياس التسارع (الذي يتم في روتين الإعداد MPU6050 في الجزء السفلي من الكود الخاص بي). إذا قمت بتغيير معدل العينة ، فيجب عليك أيضًا تغيير مقدار تقسيم البيانات الأولية. بالنسبة لبيانات مقياس التسارع ، القيمة الحالية هي 4096. بالنسبة للجيروسكوب ، القيمة الحالية هي 65.5.

ارجع إلى أوراق البيانات المرفقة والفيديو بواسطة EEEntusiast (رابط في ملف PDF المرفق) لمزيد من المعلومات المتعمقة حول كيفية العثور على قيم أخذ العينات والإزاحة.

الخطوة الثالثة: الخطوات التالية

بحلول هذه المرحلة ، نأمل أن يكون هذا المشروع ، ولكن ماذا الآن؟

أولاً ، لماذا لا نبنيها في الواقع إلى مستوى روحي يمكنك استخدامه. يمكنك شراء مستوى روح رخيص (تأكد من أنه نوع الصندوق) الذي يمكنك تكييفه ، أو إذا كان لديك العدة ، فقم بطباعة مستواك / صندوقك.

ربما يمكنك التلاعب بمعدلات عينة الدوران والتسارع لمعرفة ما إذا كانت تعمل بشكل أفضل بمعدل واحد عن الآخر.

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

إذا كان لديك أي أسئلة ، مهما بدت بسيطة ، يرجى طرحها. إذا كان بإمكاني المساعدة ، فسأفعل.

إذا كنت تحب هذه التعليمات ، فيرجى إعطائها إعجابًا ، حتى أعرف.

إذا قمت بإجراء هذا ، فيرجى إظهاره لي (خاصة إذا كان في حالة عمل).

اشكرك