- اختيار أجزاء للروبوت ذاتي التوازن
- طباعة ثلاثية الأبعاد وتجميع روبوت التوازن الذاتي
- مخطط الرسم البياني
- كود الروبوت التوازن الذاتي
- عمل روبوت أردوينو ذاتي الموازنة
بعد أن استوحيت من محركات RYNO والدراجات البخارية الأخرى ذات التوازن الذاتي من Segway ، كنت أرغب دائمًا في بناء شيء خاص بي من Arduino Segway Robot. بالتفكير لفترة ، قررت بناء روبوت ذاتي التوازن باستخدام Arduino. بهذه الطريقة ، سأكون قادرًا على فهم المفهوم الأساسي وراء كل هذه الدراجات البخارية وأيضًا تعلم كيفية عمل خوارزمية PID.
بمجرد أن بدأت في البناء ، أدركت أن هذا الروبوت يمثل نوعًا من التحدي في البناء. هناك العديد من الخيارات للاختيار من بينها ، وبالتالي تبدأ الارتباكات بالشكل الصحيح عند اختيار المحركات وتبقى حتى ضبط قيم PID. وهناك العديد من الأشياء التي يجب مراعاتها مثل نوع البطارية ، وموضع البطارية ، وقبضة العجلة ، ونوع سائق المحرك ، والحفاظ على مركز الثقل (CoG) وغير ذلك الكثير.
لكن اسمحوا لي أن أطرحها عليك ، فبمجرد إنشائها ستوافق على أنها ليست بالصعوبة التي تبدو عليها. لذلك دعونا نواجه الأمر ، في هذا البرنامج التعليمي سأوثق تجربتي في بناء روبوت ذاتي التوازن. قد تكون مبتدئًا تمامًا وقد بدأ للتو أو ربما وصل إلى هنا بعد إحباط طويل من عدم تشغيل الروبوت الخاص بك. يهدف هذا المكان إلى أن يكون وجهتك النهائية. اذا هيا بنا نبدأ……
اختيار أجزاء للروبوت ذاتي التوازن
قبل أن أخبرك بجميع خيارات بناء الروبوت ، دعني أسرد العناصر التي استخدمتها في مشروع الروبوت ذاتي التوازن هذا
- اردوينو UNO
- محركات DC موجهة (لون أصفر) - عدد 2
- وحدة تشغيل المحرك L298N
- MPU6050
- زوج من العجلات
- بطارية ليثيوم أيون 7.4 فولت
- توصيل الأسلاك
- جسم مطبوع ثلاثي الأبعاد
يمكنك المزج والاختيار لأي من المكونات المذكورة أعلاه بناءً على مدى توفر مجموعة أدوات روبوت التوازن الذاتي الخاصة بك ، فقط تأكد من أن المكونات تناسب المعايير التالية.
وحدة التحكم: وحدة التحكم التي استخدمتها هنا هي Arduino UNO ، لماذا لأنها سهلة الاستخدام. يمكنك أيضًا استخدام Arduino Nano أو Arduino mini لكنني أوصيك بالالتزام بـ UNO حيث يمكننا برمجته مباشرة بدون أي أجهزة خارجية.
المحركات: أفضل خيار للمحرك يمكنك استخدامه لروبوت ذاتي التوازن ، دون أدنى شك سيكون محرك متدرج. ولكن لتبسيط الأمور ، استخدمت محرك تروس DC. نعم ، ليس إلزاميًا أن يكون لديك خطوة ؛ يعمل الروبوت بشكل جيد مع محركات التروس ذات اللون الأصفر الرخيصة المتوفرة بشكل شائع.
برنامج تشغيل المحرك: إذا قمت بتحديد محركات التروس DC مثل محركاتي ، فيمكنك إما استخدام وحدة تشغيل L298N مثلي ، أو حتى L293D يجب أن تعمل بشكل جيد. تعرف على المزيد حول التحكم في محرك التيار المستمر باستخدام L293D و Arduino.
عجلات: لا تقلل من تقدير هؤلاء الرجال. لقد واجهت صعوبة في معرفة أن المشكلة كانت في عجلاتي. لذا تأكد من تثبيت عجلاتك جيدًا على الأرضية التي تستخدمها. راقب عن كثب ، يجب ألا تسمح قبضتك لعجلاتك بالتزحلق على الأرض.
مقياس التسارع والجيروسكوب: أفضل خيار لمقياس التسارع والجيروسكوب للبوت الخاص بك هو MPU6050. لذلك لا تحاول إنشاء واحد بمقياس تسارع عادي مثل ADXL345 أو شيء من هذا القبيل ، فهو لن يعمل. ستعرف السبب في نهاية هذا المقال. يمكنك أيضًا التحقق من مقالتنا المخصصة حول استخدام MPU6050 مع Arduino.
البطارية: نحتاج إلى بطارية خفيفة قدر الإمكان ويجب أن يكون جهد التشغيل أكثر من 5 فولت حتى نتمكن من تشغيل Arduino مباشرة بدون وحدة تعزيز. لذا فإن الخيار المثالي سيكون بطارية ليثيوم بوليمر 7.4 فولت. هنا ، منذ أن كان لدي بطارية ليثيوم أيون 7.4 فولت متاحة بسهولة ، فقد استخدمتها. لكن تذكر أن Li-po مفيد من Li-ion.
الهيكل: مكان آخر لا يجب أن تتنازل فيه عن هيكل الروبوتات. يمكنك استخدام الورق المقوى والخشب والبلاستيك أي شيء تجيده. ولكن ، تأكد فقط من أن الهيكل متين ولا يجب أن يهتز عندما يحاول الروبوت تحقيق التوازن. لقد صممت بهيكل خاص به على Solidworks بالاستدلال من الروبوتات الأخرى وطبعتها ثلاثية الأبعاد إذا كان لديك طابعة ، فيمكنك أيضًا طباعة التصميم ، وسيتم إرفاق ملفات التصميم في العنوان التالي.
طباعة ثلاثية الأبعاد وتجميع روبوت التوازن الذاتي
إذا قررت الطباعة ثلاثية الأبعاد لنفس الهيكل الذي أستخدمه لبناء الروبوت الخاص بي ، فيمكن تنزيل ملفات STL من الأشياء المتنوعة. لقد أضفت أيضًا ملفات التصميم معها حتى تتمكن أيضًا من تعديلها وفقًا لتفضيلاتك الشخصية.
لا تحتوي الأجزاء على هياكل متدلية بحيث يمكنك طباعتها بسهولة دون أي دعامات وستعمل حشوة بنسبة 25٪ بشكل جيد. التصميمات بسيطة جدًا ويجب أن تكون أي طابعة أساسية قادرة على التعامل معها بسهولة. لقد استخدمت برنامج Cura لتقسيم النموذج وطباعته باستخدام Tevo Tarantula الخاص بي ، الإعداد موضح أدناه.
سيكون عليك طباعة جزء الهيكل بالإضافة إلى أربعة أجزاء تثبيت للمحرك. التجميع مستقيم جدًا للأمام ؛ استخدم صواميل ومسامير 3 مم لتأمين المحرك واللوحات في مكانها. بعد تجميعها يجب أن تبدو كما هو موضح في الصورة أدناه.
تم التخطيط للتصميم الفعلي باستخدام وحدة محرك L298N في الرف السفلي من Arduino والبطارية أعلىها كما هو موضح أعلاه. إذا كنت تتبع نفس الترتيب ، فيمكنك برغي اللوحة مباشرة من خلال الفتحات المتوفرة واستخدام علامة سلكية لبطارية Li-po. يجب أن يعمل هذا الترتيب أيضًا ، باستثناء العجلات فائقة السهولة التي كان علي تغييرها لاحقًا.
في الروبوت الخاص بي ، قمت بتبديل موضع البطارية ولوحة Arduino UNO لسهولة البرمجة واضطررت أيضًا إلى تقديم لوحة مثالية لإكمال الاتصالات. لذلك لم يبدو الروبوت كما خططت له في المرحلة الأولية. بعد الانتهاء من اختبار برمجة الأسلاك وكل شيء ، يبدو روبوتي ذو العجلتين أخيرًا هكذا
مخطط الرسم البياني
إن إجراء التوصيلات لروبوت التوازن الذاتي القائم على Arduino أمر بسيط للغاية. هذا روبوت ذاتي الموازنة يستخدم Arduino و MPU6050 لذلك نحن نتعامل مع MPU6050 مع Arduino وتوصيل المحركات من خلال وحدة محرك المحرك. يتم تشغيل الإعداد بالكامل بواسطة بطارية ليثيوم أيون 7.4 فولت. يظهر مخطط الدائرة لنفسه أدناه.
يتم تشغيل وحدة محرك Arduino و L298N Motor مباشرة من خلال دبوس Vin ومحطة 12V على التوالي. سيقوم المنظم الموجود على متن لوحة Arduino بتحويل المدخلات 7.4V إلى 5V وسيتم تشغيل ATmega IC و MPU6050 به. يمكن تشغيل محركات التيار المستمر من الفولتية 5 فولت إلى 12 فولت. لكننا سنقوم بتوصيل السلك الموجب 7.4 فولت من البطارية إلى طرف إدخال 12 فولت لوحدة سائق المحرك. هذا سيجعل المحركات تعمل بقوة 7.4 فولت. يسرد الجدول التالي كيفية توصيل وحدة تشغيل المحرك MPU6050 و L298N بـ Arduino.
مكون دبوس |
اردوينو دبوس |
MPU6050 |
|
Vcc |
+ 5 فولت |
أرض |
Gnd |
SCL |
A5 |
SDA |
A4 |
INT |
د 2 |
L298N |
|
في 1 |
د 6 |
في 2 |
D9 |
في 3 |
D10 |
IN4 |
D11 |
يتواصل MPU6050 مع Arduino من خلال واجهة I2C ، لذلك نستخدم دبابيس SPI A4 و A5 من Arduino. يتم توصيل محركات التيار المستمر بدبابيس PWM D6 و D9 D10 و D11 على التوالي. نحتاج إلى توصيلها بدبابيس PWM لأننا سنتحكم في سرعة محرك التيار المستمر من خلال تغيير دورة العمل لإشارات PWM. إذا لم تكن معتادًا على هذين المكونين ، فمن المستحسن قراءة البرنامج التعليمي MPU6050 Interfacing و L298N Motor driver.
كود الروبوت التوازن الذاتي
الآن علينا برمجة لوحة Arduino UNO الخاصة بنا لموازنة الروبوت. هذا هو المكان الذي يحدث فيه كل السحر ؛ المفهوم الكامن وراءه بسيط. يجب أن نتحقق مما إذا كان الروبوت يميل نحو الأمام أو نحو الخلف باستخدام MPU6050 وبعد ذلك إذا كان يميل نحو الأمام ، فيجب علينا تدوير العجلات في الاتجاه الأمامي وإذا كان يميل نحو الخلف ، فيجب علينا تدوير العجلات في الاتجاه المعاكس.
في الوقت نفسه ، يتعين علينا أيضًا التحكم في السرعة التي تدور بها العجلات ، إذا كان الروبوت مشوشًا قليلاً عن موضع المركز ، تدور العجلات ببطء وتزداد السرعة كلما ابتعدت عن موضع المركز. لتحقيق هذا المنطق ، نستخدم خوارزمية PID ، التي لها موقع مركزي كنقطة ضبط ومستوى الارتباك كإخراج.
لمعرفة الوضع الحالي للبوت ، نستخدم MPU6050 ، وهو مقياس تسارع بستة محاور ومستشعر جيروسكوب مجتمعين. من أجل الحصول على قيمة موثوقة للموضع من المستشعر ، نحتاج إلى استخدام قيمة كل من مقياس التسارع والجيروسكوب ، لأن القيم من مقياس التسارع بها مشاكل ضوضاء والقيم من الجيروسكوب تميل إلى الانحراف بمرور الوقت. لذلك علينا أن نجمع بين الاثنين ونحصل على قيمة انعراج وانحراف الروبوت الخاص بنا ، والذي سنستخدم فقط قيمة الانحراف منه.
يبدو قليلا من يترنح الرأس أليس كذلك؟ ولكن لا داعي للقلق ، فبفضل مجتمع Arduino ، لدينا مكتبات متاحة بسهولة يمكنها إجراء حساب PID وأيضًا الحصول على قيمة الانحراف من MPU6050. تم تطوير المكتبة بواسطة br3ttb و jrowberg على التوالي. قبل المتابعة ، قم بتنزيل مكتباتهم من الرابط التالي وأضفهم إلى دليل Arduino lib.
github.com/br3ttb/Arduino-PID-Library/blob/master/PID_v1.h
github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU6050
الآن ، لدينا مكتبات مضافة إلى Arduino IDE. لنبدأ البرمجة لروبوت التوازن الذاتي الخاص بنا. كما هو الحال دائمًا ، يتم تقديم الكود الكامل لروبوت الموازنة MPU6050 في نهاية هذه الصفحة ، هنا أنا فقط أشرح أهم المقتطفات في الكود. قيل سابقًا أن الكود مبني على رمز مثال MPU6050 ، سنقوم فقط بتحسين الكود لغرضنا وإضافة PID وتقنية التحكم لروبوت التوازن الذاتي الخاص بنا.
أولاً نقوم بتضمين المكتبات المطلوبة لهذا البرنامج للعمل. وهي تشمل مكتبة I2C المدمجة ومكتبة PID ومكتبة MPU6050 التي قمنا بتنزيلها للتو.
# تضمين "I2Cdev.h" # تضمين
ثم نعلن عن المتغيرات المطلوبة للحصول على البيانات من مستشعر MPU6050. نقرأ كلاً من قيم متجه الجاذبية والقيم الرباعية ثم نحسب قيمة الانحراف والانحراف للروبوت. و YPR تعويم مجموعة سيعقد النتيجة النهائية.
// MPU control / status vars bool dmpReady = false ؛ // تعيين صحيح إذا كان DMP init ناجحًا uint8_t mpuIntStatus ؛ // يحمل بايت حالة المقاطعة الفعلية من MPU uint8_t devStatus ؛ // حالة الإرجاع بعد كل عملية جهاز (0 = نجاح ،! 0 = خطأ) uint16_t packetSize ؛ // حجم حزمة DMP المتوقع (الافتراضي 42 بايت) uint16_t fifoCount ؛ // حساب جميع البايتات الموجودة حاليًا في FIFO uint8_t fifoBuffer ؛ // المخزن المؤقت لتخزين FIFO // التوجيه / الحركة vars Quaternion q ؛ // حاوية رباعية الجاذبية VectorFloat ؛ // ناقلات الجاذبية تطفو ypr ؛ // الانعراج / الملعب / حاوية لفة وناقل الجاذبية
يأتي بعد ذلك الجزء المهم جدًا من الكود ، وهذا هو المكان الذي ستقضي فيه وقتًا طويلاً في ضبط مجموعة القيم الصحيحة. إذا كان الروبوت الخاص بك مبنيًا بمركز ثقل جيد جدًا وتم ترتيب المكونات بشكل متماثل (وهو ليس كذلك في معظم الحالات) ، فستكون قيمة نقطة الضبط 180. عدا ذلك ، قم بتوصيل الروبوت الخاص بك بشاشة Arduino التسلسلية وقم بإمالتها حتى تجد موضع موازنة جيدًا ، اقرأ القيمة المعروضة على الشاشة التسلسلية وهذه هي قيمة نقطة ضبطك. يجب ضبط قيمة Kp و Kd و Ki وفقًا لبوتك. لن يكون لأي روبوتين متطابقين نفس قيم Kp و Kd و Ki ، لذا لا مفر منه. شاهد الفيديو في نهاية هذه الصفحة للحصول على فكرة عن كيفية ضبط هذه القيم.
/ ********* ضبط هذه القيم الأربع لـ BOT ********* / نقطة الضبط المزدوجة = 176 ؛ // عيّن القيمة عندما يكون الروبوت متعامدًا على الأرض باستخدام جهاز العرض التسلسلي. // اقرأ وثائق المشروع على circdigest.com لمعرفة كيفية تعيين هذه القيم double Kp = 21 ؛ // قم بتعيين أول Kd مزدوج = 0.8 ؛ // تعيين هذا ثانية Ki المزدوجة = 140 ؛ // أخيرًا قم بتعيين هذا / ****** نهاية إعداد القيم ********* /
في السطر التالي نقوم بتهيئة خوارزمية PID بتمرير إدخال متغيرات الإدخال والإخراج ونقطة التحديد و Kp و Ki و Kd. من بين هؤلاء ، قمنا بالفعل بتعيين قيم نقطة ضبط Kp و Ki و Kd في مقتطف الكود أعلاه. ستكون قيمة الإدخال هي القيمة الحالية للانعراج المقروءة من مستشعر MPU6050 وستكون قيمة المخرجات هي القيمة التي يتم حسابها بواسطة خوارزمية PID. لذلك ستعطينا خوارزمية PID بشكل أساسي قيمة إخراج يجب استخدامها لتصحيح قيمة الإدخال لتكون قريبة من نقطة التحديد.
PID pid (& input ، & output ، & setpoint ، Kp ، Ki ، Kd ، DIRECT) ؛
داخل وظيفة الإعداد الفارغ ، نقوم بتهيئة MPU6050 من خلال تكوين DMP (معالج الحركة الرقمية). سيساعدنا ذلك في دمج بيانات مقياس التسارع مع بيانات الجيروسكوب وتوفير قيمة موثوقة للانحراف والانحراف واللف. لن نتعمق كثيرًا في هذا لأنه سيكون بعيدًا عن الموضوع. على أي حال ، فإن مقطع واحد من الكود الذي يجب عليك البحث عنه في وظيفة الإعداد هو قيم الإزاحة الدورانية. يحتوي كل مستشعر MPU6050 على قيمه الخاصة للإزاحة ، يمكنك استخدام رسم Arduino هذا لحساب قيمة الإزاحة لجهاز الاستشعار وتحديث الأسطر التالية وفقًا لذلك في برنامجك.
// قم بتزويد تعويضات الدوران الخاصة بك هنا ، مع تحجيمها لأدنى حساسية mpu.setXGyroOffset (220) ؛ mpu.setYGyroOffset (76) ، mpu.setZGyroOffset (-85) ، mpu.setZAccelOffset (1688) ؛
يتعين علينا أيضًا تهيئة دبابيس PWM الرقمية التي نستخدمها لتوصيل محركاتنا بها. في حالتنا هي D6 و D9 و D10 و D11. لذلك نقوم بتهيئة هذه المسامير كدبابيس إخراج تجعلها منخفضة بشكل افتراضي.
// التهيئة للسيارات تبو دبابيس pinMode (6، OUTPUT)؛ pinMode (9 ، الإخراج) ؛ pinMode (10 ، الإخراج) ؛ pinMode (11 ، الإخراج) ؛ // بشكل افتراضي ، قم بإيقاف تشغيل كل من المحركات analogWrite (6 ، LOW) ؛ analogWrite (9 ، منخفض) ؛ analogWrite (10 ، منخفض) ؛ analogWrite (11 ، منخفض) ؛
داخل وظيفة الحلقة الرئيسية نتحقق مما إذا كانت البيانات من MPU6050 جاهزة للقراءة . إذا كانت الإجابة بنعم ، فإننا نستخدمها لحساب قيمة PID ثم نعرض قيمة الإدخال والإخراج لـ PID على الشاشة التسلسلية فقط للتحقق من كيفية استجابة PID. ثم بناءً على قيمة المخرجات ، نقرر ما إذا كان على الروبوت أن يتحرك للأمام أو للخلف أو يقف ساكنًا.
نظرًا لأننا نفترض أن MPU6050 سيعيد 180 عندما يكون الروبوت في وضع مستقيم. سنحصل على قيم تصحيح موجبة عندما يتراجع الروبوت نحو الأمام وسنحصل على قيم سلبية إذا كان الروبوت يتراجع باتجاه الخلف. لذلك نتحقق من هذه الحالة وندعو الوظائف المناسبة لتحريك الروبوت إلى الأمام أو الخلف.
while (! mpuInterrupt && fifoCount <packetSize) { // لا توجد بيانات mpu - إجراء حسابات PID والإخراج إلى المحركات pid.Compute () ؛ // اطبع قيمة المدخلات والمخرجات على الشاشة التسلسلية للتحقق من كيفية عملها. Serial.print (إدخال) ؛ Serial.print ("=>") ؛ Serial.println (الإخراج) ؛ if (input> 150 && input <200) {// إذا كان الروبوت ينخفض إذا (الإخراج> 0) // Falling نحو الأمام Forward () ؛ // قم بتدوير العجلات للأمام وإلا إذا (الإخراج <0) // السقوط نحو الخلف عكس () ؛ // قم بتدوير العجلات للخلف } else // إذا لم يسقط الروبوت ، توقف () ؛ // ثبّت العجلات }
و يقرر الناتج متغير PID أيضا مدى سرعة لابد من تدوير المحرك. إذا كان الروبوت على وشك السقوط ، فإننا نجري تصحيحًا بسيطًا عن طريق تدوير العجلة ببطء. إذا نجح هذا التصحيح البسيط وما زال إذا كان الروبوت يسقط ، فإننا نزيد من سرعة المحرك. سيتم تحديد قيمة سرعة دوران العجلات بواسطة خوارزمية PI. لاحظ أنه بالنسبة للدالة العكسية ، قمنا بضرب قيمة المخرجات في -1 حتى نتمكن من تحويل القيمة السالبة إلى قيمة موجبة.
void Forward () // Code لتدوير العجلة للأمام { analogWrite (6، output) ؛ analogWrite (9،0) ؛ analogWrite (10 ، الإخراج) ؛ analogWrite (11،0) ؛ Serial.print ("F") ؛ // معلومات التصحيح } void Reverse () // Code لتدوير العجلة للخلف { analogWrite (6،0)؛ analogWrite (9 ، الإخراج * -1) ؛ analogWrite (10،0) ؛ analogWrite (11 ، الإخراج * -1) ؛ Serial.print ("R") ؛ } void Stop () // Code لإيقاف كلتا العجلتين { analogWrite (6،0)؛ analogWrite (9،0) ؛ analogWrite (10،0) ؛ analogWrite (11،0) ؛ Serial.print ("S") ؛ }
عمل روبوت أردوينو ذاتي الموازنة
بمجرد أن تكون جاهزًا مع الجهاز ، يمكنك تحميل الكود على لوحة Arduino الخاصة بك. تأكد من أن التوصيلات مناسبة لأننا نستخدم بطارية Li-ion يلزم الحذر الشديد. لذا تحقق جيدًا من وجود دوائر قصيرة وتأكد من أن المحطات لن تتلامس حتى لو تعرض الروبوت لبعض التأثيرات الصغيرة. قم بتشغيل الوحدة النمطية الخاصة بك وافتح جهاز العرض التسلسلي الخاص بك ، إذا كان بإمكان Arduino الاتصال بـ MPU6050 بنجاح وإذا كان كل شيء يعمل كما هو متوقع ، فسترى الشاشة التالية.
هنا نرى قيم المدخلات والمخرجات لخوارزمية PID في تنسيق الإدخال => الإخراج . إذا كان الروبوت متوازنًا تمامًا ، فستكون قيمة الإخراج 0. قيمة الإدخال هي القيمة الحالية من مستشعر MPU6050. تمثل الأبجدية "F" أن الروبوت يتحرك للأمام ويمثل الحرف "R" أن الروبوت في الاتجاه المعاكس.
خلال المراحل الأولية من PID ، أوصي بترك كابل Arduino الخاص بك متصلاً بالبوت بحيث يمكنك بسهولة مراقبة قيم الإدخال والإخراج وأيضًا سيكون من السهل تصحيح وتحميل برنامجك لقيم Kp و Ki و Kd. يوضح الفيديو أدناه العمل الكامل للروبوت ويوضح أيضًا كيفية تصحيح قيم PID الخاصة بك.
آمل أن يساعد هذا في بناء روبوت التوازن الذاتي الخاص بك إذا كان لديك أي مشكلة في تشغيله ، ثم اترك أسئلتك في قسم التعليقات أدناه أو استخدم المنتديات لمزيد من الأسئلة الفنية. إذا كنت تريد المزيد من المرح ، يمكنك أيضًا استخدام نفس المنطق لبناء روبوت موازنة الكرة.