ملخص سريع
يوضح لك هذا البرنامج التعليمي كيفية إنشاء روبوت يتبع الخطوط يتم التحكم فيه بواسطة PID باستخدام Arduino Uno، ومستشعر الألوان TCS34725 RGB، وArduino Motor Shield Rev3. يستخدم الروبوت المعايرة التلقائية لاكتشاف تباين المسار ويطبق التحكم التناسبي والمشتق التكاملي لتتبع الخط بشكل سلس ومستقر. يتضمن تصميم هيكل كامل مطبوع ثلاثي الأبعاد، ومخططات الأسلاك، ورمز Arduino الكامل، وتعليمات ضبط PID.
في هذا البرنامج التعليمي، سوف تقوم ببناء الروبوت المتتبع للخطوط TCS34725 يستخدم مستشعر ألوان RGB ووحدة تحكم PID للتنقل بين المسارات بدقة وثبات. إذا أكملت روبوت يتبع الخط للمبتدئين مزود بأجهزة استشعار KY-033 IR، يبدأ هذا المشروع من حيث توقف هذا المشروع. سوف تستبدل مستشعر الأشعة تحت الحمراء البسيط بمستشعر الضوء TCS34725 RGB، وتضيف حلقة تحكم PID كاملة، ونتيجة لذلك تحصل على تتبع خط أكثر سلاسة بشكل ملحوظ، حتى على المنحنيات الأكثر إحكامًا.
يغطي هذا البرنامج التعليمي عملية البناء الكاملة: تصميم الهيكل المطبوع ثلاثي الأبعاد، والأسلاك، والمعايرة، وبرمجة Arduino، وضبط PID. لذا، سواء كنت تقوم ببناء مشروعك الأول تابع خط اردوينو PID أو الترقية من تصميم أبسط، يرشدك هذا الدليل خلال كل شيء بدءًا من تجميع الأجهزة وحتى التعليمات البرمجية وضبط النظام روبوت متطور يتبع الخطوط مدعوم بمستشعر TCS34725 و Arduino Motor Shield Rev3.
ماذا سوف تتعلم
- كيف يكتشف مستشعر TCS34725 RGB التباين بين خط المسار وسطح الخلفية
- كيف يعمل التحكم PID على تحسين استقرار متابعة الخط مقارنةً بالتوجيه البسيط للتشغيل/الإيقاف
- كيف يعمل Arduino Uno وMotor Shield Rev3 معًا لقيادة الروبوت
- كيف يقوم الروبوت بمعايرة نفسه تلقائيًا عن طريق أخذ عينات من المناطق السوداء والبيضاء
- كيفية توصيل وتجميع وبرمجة واختبار الروبوت الكامل
- كيفية ضبط معلمات PID (Kp، Ki، Kd) للحصول على أداء أفضل على المسارات المختلفة
كيف يعمل الروبوت
قبل الدخول في البناء، إليك نظرة عامة سريعة على كيفية عمل النظام. هذا روبوت اردوينو TCS34725 يستخدم نظام ردود فعل مغلقة، لذلك يتحكم إدخال المستشعر بشكل مباشر في إخراج المحرك من خلال خوارزمية PID. إليك ما يفعله كل مكون:
إن أردوينو أونو هو عقل الروبوت. فهو يقرأ بيانات المستشعر، ويدير حسابات PID، ويرسل أوامر السرعة إلى كلا المحركين. علاوة على ذلك، فإن درع المحرك Arduino Motor Shield Rev3 يقع أعلى Uno ويتعامل مع توزيع الطاقة والتحكم في الاتجاه لمحركي التيار المستمر. فهو يتيح لـ Arduino التحكم بشكل مستقل في سرعة واتجاه كل عجلة، وهي الطريقة التي يوجه بها الروبوت.
الاستشعار والمعايرة
تم تركيبه على الجانب السفلي من الروبوت مستشعر الضوء TCS34725 RGB يواجه لأسفل نحو سطح المسار. على عكس مستشعر انعكاس الأشعة تحت الحمراء البسيط الذي يرى الضوء أو الظلام فقط، يقيس TCS34725 شدة الضوء عبر القنوات الحمراء والخضراء والزرقاء والواضحة. بالنسبة لهذا المشروع، على الرغم من ذلك، فإن قناة واضحة (ج) هو الشيء المهم لأنه يوفر قراءة سطوع شاملة موثوقة تفصل بوضوح الخط الداكن عن الخلفية الفاتحة.
أثناء بدء التشغيل، يقوم الروبوت بتشغيل روتين المعايرة التلقائية. يدور قليلاً لوضع المستشعر فوق منطقة مظلمة، ويسجل شدة الضوء كقيمة سوداء، ثم يدور في الاتجاه الآخر لأخذ عينات من الخلفية البيضاء. ويصبح متوسط هاتين القراءتين هو العتبة (القيمة المتوسطة). بمجرد الانتهاء من المعايرة، يقرأ المستشعر باستمرار القناة الواضحة أثناء تحرك الروبوت، ويصبح الفرق بين القراءة الحالية والعتبة هو إشارة خطأ الذي يغذي وحدة تحكم PID.
ومن هناك، وحدة تحكم PID يأخذ هذا الخطأ ويحسب قيمة التصحيح. التصحيح الإيجابي يعني أن الروبوت يحتاج إلى التوجيه في اتجاه واحد؛ التصحيح السلبي يعني العكس. تتم إضافة هذا التصحيح إلى سرعة المحرك الأيسر وطرحه من سرعة المحرك الأيمن (أو العكس)، مما يؤدي إلى إنشاء توجيه تفاضلي سلس. لذلك يتبع الروبوت الخط بأقل قدر من التذبذب ويتعامل أيضًا مع المنحنيات بشكل جيد، وهو تحسن كبير مقارنة بنظام التحكم الأبسط المستخدم في KY-033 برنامج تعليمي للروبوت الذي يتبع الخط.
المكونات المطلوبة (فاتورة المواد)
يسرد الجدول أدناه كل المكونات التي تحتاجها لهذا الغرض روبوت يتبع الخط بمستشعر RGB. إذا قمت بالفعل ببناء الروبوت المتتبع للخط KY-033يمكنك إعادة استخدام الهيكل والمحركات والعجلات والاردوينو ودرع المحرك. الجزء الجديد الوحيد هو وحدة الاستشعار TCS34725.
الأجزاء المطبوعة بتقنية الطباعة ثلاثية الأبعاد
تم تصميم هذه الأجزاء خصيصًا لهذا المشروع ويمكن تنزيلها كملفات STL من Cults3D أو احصل على حزمة المشروع الكاملة من موقعنا متجر أومارترونيكس.
| المكوّن | مطلوب / اختياري | الغرض | الملاحظات |
|---|---|---|---|
| الشاسيه | مطلوب | يحتوي على المحركات وأجهزة الاستشعار ولوحة Arduino | يوصى بالطباعة ثلاثية الأبعاد أو PLA أو ABS |
| حامل المستشعر | مطلوب | يقوم بمحاذاة مستشعر TCS34725 للكشف عن الخط بشكل متسق | يحافظ على المستشعر عند الارتفاع الصحيح فوق المسار |
| حامل أردوينو | مطلوب | قم بتثبيت Arduino Uno بشكل آمن على الهيكل | يوفر سهولة الوصول للبرمجة والأسلاك |
المحركات والعجلات والإلكترونيات
| المكوّن | الكمية | مطلوب / اختياري | الغرض | الملاحظات |
|---|---|---|---|---|
| محرك DC مع علبة التروس | 2 | مطلوب | يقود عجلات الروبوت | تعمل محركات TT الصفراء القياسية بشكل جيد |
| العجلات | 2 | مطلوب | توفير التنقل | يجب أن تناسب مهاوي المحرك |
| عجلة الدعم (العجلة) | 1 | مطلوب | يوازن الروبوت في الخلف | عجلة كروية أو عجلة دوارة |
| أردوينو أونو | 1 | مطلوب | متحكم دقيق للبرمجة والتحكم | يقوم بتشغيل حسابات PID ويقرأ بيانات المستشعر |
| درع المحرك Arduino Motor Shield Rev3 | 1 | مطلوب | يقود كلا المحركين ويوزع الطاقة | مداخن مباشرة على اردوينو أونو |
| مستشعر ضوء RGB TCS34725 | 1 | مطلوب | يقيس شدة الضوء للكشف عن تباين الخط | يستخدم قناة واضحة (C) لهذا المشروع |
| أسلاك التوصيل | العديد من | مطلوب | يربط المكونات | رؤوس الدبوس M/F وM/M |
| مسامير وإدراج مترابطة | حسب الحاجة | مطلوب | يتم تركيب جميع الأجزاء بشكل آمن على الهيكل | يوصى باستخدام مسامير M3 |
| البطارية (7.4 فولت ليبو أو 9 فولت) | 1 | مطلوب | يشغل الروبوت | يوصى باستخدام LiPo للجهد المستمر |
| مفتاح الطاقة | 1 | اختياري | سهولة التحكم في التشغيل/الإيقاف | يحفظ عمر البطارية بين الاختبارات |
الخطوة 1: تصميم الروبوت في Autodesk Inventor
تم تصميم الروبوت في أوتوديسك إنفنتور للتأكد من أن جميع المكونات تتلاءم بشكل آمن مع الحفاظ على الهيكل خفيف الوزن وصغير الحجم. يتكون التصميم من ثلاثة أجزاء مخصصة:
- الهيكل: قاعدة متينة لتركيب المحركات وحساس TCS34725 والاردوينو مع درع المحرك الخاص به.
- حامل الاستشعار: ضع مستشعر TCS34725 على الارتفاع الصحيح فوق سطح الأرض للحصول على قراءات موثوقة. يعد الحصول على ارتفاع المستشعر بشكل صحيح أمرًا مهمًا للغاية لإجراء معايرة دقيقة واكتشاف خط متسق.
- حامل اردوينو: يوفر سهولة الوصول إلى Arduino Uno للبرمجة والأسلاك وتصحيح الأخطاء.
يمكنك تنزيل ملفات STL لجميع الأجزاء المطبوعة ثلاثية الأبعاد من Cults3D أو الحصول عليها من لدينا متجر أومارترونيكس.
الخطوة 2: طباعة المكونات ثلاثية الأبعاد
بمجرد الانتهاء من التصميم، قم بطباعة المكونات باستخدام طابعة FDM ثلاثية الأبعاد قياسية. أ كرياليتي إندر 3 أو طابعة مماثلة تعمل بشكل جيد. PLA هو أسهل مادة للطباعة، بينما يوفر ABS مزيدًا من المتانة إذا كنت تخطط لاستخدام الروبوت كثيرًا. بعد الطباعة، قم بتنظيف الأجزاء: قم بإزالة أي مواد دعم، وقم برمل الحواف الخشنة، وتأكد من أن جميع فتحات المسامير وفتحات المكونات بالحجم الصحيح قبل التجميع.
الخطوة 3: تجميع الروبوت الذي يتبع الخط

تركيب المحركات والعجلات
- أولاً، قم بتثبيت كلا محركي التيار المستمر بالهيكل باستخدام براغي M3 وإدخالات ملولبة. تأكد من أن أعمدة المحرك متجهة للخارج.
- بعد ذلك، اضغط العجلات على أعمدة المحرك وتأكد من أن كلا العجلتين تدوران بحرية دون الاحتكاك بالهيكل.
- وأخيرًا، قم بتركيب عجلة الدعم في الجزء الخلفي من الهيكل لتوفير توازن ثابت ثلاثي النقاط.
تركيب الالكترونيات
- أولاً، قم بتركيب Arduino Uno في حامل Arduino ثم قم بتوصيل الحامل بالهيكل.
- ثم قم بتكديس Arduino Motor Shield Rev3 أعلى Arduino Uno. تأكد من محاذاة جميع دبابيس الرأس بشكل صحيح.
- بعد ذلك، قم بتوصيل وحدة الاستشعار TCS34725 بحامل المستشعر وقم بتثبيت الحامل بالجزء السفلي الأمامي من الهيكل، بحيث يكون متجهًا للأسفل باتجاه سطح المسار. يجب أن يكون المستشعر على ارتفاع 10 إلى 15 ملم تقريبًا فوق سطح الأرض للحصول على أفضل النتائج.
- وأخيرًا، قم بتوصيل البطارية وتأمين جميع المكونات حتى لا يتم فقدان أي شيء أثناء الحركة.
الخطوة 4: توصيل المكونات
يستخدم هذا المشروع أ مستشعر TCS34725 RGB واحد (ليست أجهزة استشعار متعددة). يتصل المستشعر بالاردوينو عبر I2C، بينما يتم التحكم بالمحركات من خلال Motor Shield. يوضح مخطط الأسلاك أدناه الدائرة الكاملة.

اتصالات المحرك
تتصل محركات التيار المستمر بأطراف المحرك في Arduino Motor Shield Rev3. يتعامل الدرع مع التحكم في الاتجاه وسرعة PWM من خلال هذه المسامير:
| المحرك | محطة الدرع | دبوس الاتجاه | دبوس PWM (السرعة). |
|---|---|---|---|
| المحرك الأيسر (المحرك أ) | محطة المحرك | الدبوس الرقمي 12 (DIR_A) | الدبوس الرقمي 3 (PWM_A) |
| المحرك الأيمن (المحرك ب) | محطة المحرك ب | الرقم الرقمي 13 (DIR_B) | الدبوس الرقمي 11 (PWM_B) |
اتصالات الاستشعار TCS34725 (I2C)
يتصل TCS34725 مع Arduino عبر ناقل I2C. قم بتوصيله على النحو التالي:
| TCS34725 دبوس | دبوس الأردوينو | الملاحظات |
|---|---|---|
| رقم VIN | 5V | مصدر الطاقة لجهاز الاستشعار |
| GND | GND | أرضية مشتركة |
| SDA | A4 (SDA) | خط بيانات I2C |
| SCL | A5 (SCL) | خط الساعة I2C |
اتصالات الطاقة
| المكوّن | الاتصال | الملاحظات |
|---|---|---|
| البطارية (7.4 فولت ليبو أو 9 فولت) | موتور شيلد مدخلات الطاقة الخارجية | يعمل على تشغيل كل من المحركات واردوينو من خلال الدرع |
| مفتاح الطاقة (اختياري) | في سلسلة مع الرصاص الإيجابي للبطارية | يسمح بسهولة التشغيل/الإيقاف دون فصل البطارية |
مهم: يستخدم هذا المشروع مستشعر TCS34725 واحدًا، وليس مجموعة من أجهزة الاستشعار المتعددة. يقرأ المستشعر قناة واضحة (ج) للكشف عن السطوع العام. تشير جميع الإشارات إلى "المستشعر" في هذا البرنامج التعليمي إلى وحدة TCS34725 الفردية هذه.
الخطوة 5: فهم التحكم PID لهذا الروبوت
يقوم مستشعر TCS34725 RGB بعمل جيد في تمييز الخط الأسود عن الخلفية البيضاء لأنه يقيس شدة الضوء الفعلية. يقوم هذا المشروع بإقران هذا المستشعر بـ متحكم PID (متحكم تناسبي-إدماجي-مشتق-مركب) لمتابعة المسار السلس. إذا قمت ببناء الروبوت المتتبع للخط KY-033، ستلاحظ فرقًا كبيرًا: يستخدم إصدار KY-033 إشارات رقمية بسيطة للتشغيل/الإيقاف (سواء تم اكتشاف الخط أم لا)، مما جعل الروبوت متعرجًا. يستخدم هذا النهج القائم على PID بدلاً من ذلك القيم التناظرية المستمرة من القناة الواضحة TCS34725 لحساب التصحيحات التناسبية، مما ينتج حركة أكثر سلاسة وأكثر قابلية للتنبؤ بها.

ماذا يعني الخطأ ونقطة الضبط والتصحيح في هذا الروبوت
في هذا الروبوت، ترتبط مصطلحات PID بقيم ملموسة:
- نقطة الضبط: إن
القيمة المتوسطةوهو متوسط قراءات المعايرة بالأبيض والأسود. وهذا يمثل الحدود بين الخط والخلفية. - متغير العملية: قراءة القناة الواضحة الحالية من مستشعر TCS34725.
- خطأ: الفرق بين
القيمة المتوسطةوقراءة الاستشعار الحالية. الخطأ الإيجابي يعني أن المستشعر فوق الخط المظلم؛ خطأ سلبي يعني أنه فوق الخلفية الساطعة. - تصحيح (ذ): تتم إضافة قيمة مخرجات PID إلى سرعة محرك واحدة ويتم طرحها من الأخرى، مما يؤدي إلى إنشاء توجيه تفاضلي.
مكونات PID الثلاثة
المتناسب (P) — يتفاعل مع الخطأ الحالي. يقوم هذا المصطلح بضرب الخطأ الحالي بالكسب Kp. إذا انحرف المستشعر عن حافة الخط، فإن المصطلح P ينتج على الفور تصحيحًا يتناسب مع مدى بعد المستشعر. تنتج قيم Kp الأكبر تفاعلات أسرع ولكنها يمكن أن تسبب تجاوزًا وتذبذبًا إذا تم ضبطها على قيمة عالية جدًا. المعادلة هي: P = Kp × خطأ.
التكامل (I) - يعوض عن الأخطاء المتراكمة مع مرور الوقت. يقوم هذا المصطلح بجمع الخطأ بمرور الوقت وضربه بـ Ki. من المفيد أن ينحرف الروبوت باستمرار قليلاً إلى جانب واحد بسبب الاختلافات الحركية أو عدم تناسق المسار. يصحح التكامل هذا الانحياز للحالة المستقرة. في الكود، يكون المجموع المتكامل مقيدًا بنطاق صغير (±4) لمنع حدوث خطأ، ويتم إعادة تعيينه عندما يكون الخطأ صغيرًا. المعادلة هي: أنا = كي × Σخطأ.
المشتق (د) — يتنبأ بالخطأ المستقبلي من معدل التغير. يبحث هذا المصطلح في مدى سرعة تغير الخطأ ويضرب معدل التغيير بالدينار الكويتي. إنه بمثابة مخمد: إذا كان الروبوت يتأرجح نحو الخط بسرعة، فإن الحد D يبطئ التصحيح لمنع التجاوز. بالنسبة لهذا المشروع، فإن المكون المشتق اختياري وثانوي. أنا وP نقوم بمعظم العمل، ولكن يمكنك زيادة Kd قليلاً إذا رأيت تذبذبًا مستمرًا. المعادلة هي: D = دينار × (خطأ − خطأ سابق).
معادلة PID المدمجة
يجمع تصحيح PID الكامل بين المصطلحات الثلاثة: التصحيح = Kp × خطأ + Ki × Σerror + Kd × (خطأ − خطأ سابق). ثم يتم تطبيق قيمة التصحيح هذه على سرعات المحرك:
speedLeft = baseSpeed + تصحيحspeedRight = baseSpeed - التصحيح
عندما يكون الخطأ صفرًا (المستشعر على العتبة مباشرة)، يعمل كلا المحركين بالسرعة الأساسية ويتحرك الروبوت بشكل مستقيم. عندما يكون الخطأ إيجابيًا أو سلبيًا، فإن التصحيح يجعل أحد المحركات أسرع والآخر أبطأ، مما يتسبب في عودة الروبوت نحو الخط.
مزايا PID لمتابعة الخط
- يتتبع الروبوت حافة الخط بدقة، حتى من خلال المنحنيات.
- فهو يزيل السلوك المتعرج المتشنج الذي تحصل عليه من خلال اتباع الخط البسيط القائم على العتبة.
- يعالج التغيرات في انعكاس السطح، وعدم تناسق المحرك، وانخفاض جهد البطارية.
- يمكنك ضبطه ليناسب تخطيطات المسارات المختلفة وعروض الخطوط وسرعات الروبوت عن طريق ضبط Kp وKi وKd.
الخطوة 6: برمجة الروبوت الذي يتبع الخط (كود الاردوينو)
يوجد أدناه مخطط Arduino الكامل للروبوت الذي يتبع الخط TCS34725 مع التحكم PID. قم بتحميل هذا الرمز إلى Arduino Uno الخاص بك باستخدام Arduino IDE. قبل التحميل، تأكد من أن لديك مكتبة أدافروت TCS34725 و مكتبة AFMotor مثبتة. يمكنك العثور على كليهما في Arduino Library Manager. الكود الكامل متاح أيضًا على مستودع GitHub مرتبط في قسم الموارد.
رسم اردوينو كامل
/**
* Author: Omar Draidrya
* Date: 2024/12/06
* Line-Following Robot with TCS34725.
*/
#include <Wire.h>
#include <AFMotor.h>
#include <Adafruit_TCS34725.h>
// Initialize TCS34725 sensor
Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_2_4MS, TCS34725_GAIN_4X);
// Motor control pins
#define DIR_A 12
#define DIR_B 13
#define PWM_A 3
#define PWM_B 11
// PID parameters
float Kp = 24.0; // Proportional gain
float Ki = 1.0; // Integral gain
float Kd = 1.0; // Derivative gain
int baseSpeed = 60; // Base speed
// Middle value for black/white
int middleValue = 3; // Adjusted based on measured values
// Global variables for PID
float error = 0, previousError = 0, sumError = 0;
void setup() {
Serial.begin(9600);
// Initialize TCS34725 sensor
if (!tcs.begin()) {
Serial.println("Error: TCS34725 not detected. Check wiring!");
while (1);
}
Serial.println("TCS34725 sensor detected!");
// Configure motor control pins
pinMode(DIR_A, OUTPUT);
pinMode(DIR_B, OUTPUT);
pinMode(PWM_A, OUTPUT);
pinMode(PWM_B, OUTPUT);
// Perform sensor calibration
calibrateSensor();
}
void loop() {
uint16_t r, g, b, c;
tcs.getRawData(&r, &g, &b, &c);
// Calculate error
error = middleValue - (float)c ;
// PID calculation
sumError += error;
sumError = constrain(sumError, -4, 4); // Limit integral component
if (abs(error) < 2.0) {
sumError = 0; // Reset for small errors
}
float differential = error - previousError;
float correction = Kp * error + Ki * sumError + Kd * differential;
previousError = error;
// Adjust motor speeds
int speedLeft = baseSpeed + (int)correction;
int speedRight = baseSpeed - (int)correction;
speedLeft = constrain(speedLeft, 20, 255);
speedRight = constrain(speedRight, 20, 255);
controlMotors(speedLeft, speedRight);
}
void calibrateSensor() {
uint16_t r, g, b, c;
// Measure black value
Serial.println("Calibrating: Measuring black value...");
controlMotors(-85, 85); // Slightly turn left
delay(350);
// Stop motors after calibration
controlMotors(0, 0);
delay(50);
tcs.getRawData(&r, &g, &b, &c);
int blackValue = c;
Serial.print("Black Value: ");
Serial.println(blackValue);
// Measure white value
Serial.println("Calibrating: Measuring white value...");
controlMotors(85, -85); // Slightly turn right
delay(500);
// Stop motors after calibration
controlMotors(0, 0);
delay(50);
tcs.getRawData(&r, &g, &b, &c);
int whiteValue = c;
Serial.print("White Value: ");
Serial.println(whiteValue);
// Calculate middle value
middleValue = (blackValue + whiteValue) / 2;
Serial.print("Middle Value: ");
Serial.println(middleValue);
// Stop motors after calibration
controlMotors(0, 0);
}
void controlMotors(int speedLeft, int speedRight) {
if (speedLeft >= 0) {
digitalWrite(DIR_A, HIGH);
} else {
digitalWrite(DIR_A, LOW);
speedLeft = abs(speedLeft);
}
if (speedRight >= 0) {
digitalWrite(DIR_B, HIGH);
} else {
digitalWrite(DIR_B, LOW);
speedRight = abs(speedRight);
}
analogWrite(PWM_A, speedLeft);
analogWrite(PWM_B, speedRight);
}
إرشادات التعليمات البرمجية
دعنا نتعرف على كل قسم من الكود حتى تفهم كيفية عمل الروبوت الذي يتبع الأسطر المعتمد على المستشعر TCS34725:
تهيئة المستشعر
Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_2_4MS, TCS34725_GAIN_4X);
تتم تهيئة مستشعر TCS34725 بوقت تكامل قصير جدًا (2.4 مللي ثانية) وكسب معتدل (4×). يعني وقت التكامل القصير أن المستشعر يأخذ القراءات بسرعة كبيرة، وهو أمر مهم لأن الروبوت المتحرك يحتاج إلى الاستجابة لتغيرات الخط بسرعة. يعمل الكسب 4× على تضخيم الإشارة بما يكفي لتمييز اللون الأسود من الأبيض دون تشبع المستشعر على الأسطح الساطعة. إذا بدت قراءاتك منخفضة جدًا أو مرتفعة جدًا، فجرب إعدادات كسب مختلفة (1×، 4×، 16×، أو 60×).
تعريفات دبوس المحرك
# تعريف DIR_A # 12
#تعريف DIR_B 13
#تعريف PWM_A 3
#تعريف PWM_B 11
تتوافق تعريفات الدبوس هذه مع تخطيط Arduino Motor Shield Rev3. يتحكم DIR_A وDIR_B في اتجاه دوران كل محرك (عالٍ للأمام، ومنخفض للخلف). يتحكم PWM_A وPWM_B في سرعة كل محرك يستخدم تعديل عرض النبضة (PWM)حيث 0 يعني توقف و 255 يعني السرعة الكاملة. لذلك يقوم تصحيح PID بضبط قيم PWM هذه بشكل مستقل لكل محرك للتوجيه.
روتين المعايرة
void calibrateSensor() {
// Measures the light intensity for black and white areas.
// Calculates the middle value (threshold) as the average of the two.
}
تعد وظيفة المعايرة أحد أهم أجزاء الكود. عند تشغيل الروبوت، يقوم بتنفيذ الخطوات التالية تلقائيًا:
- قياس القيمة السوداء (الداكنة): يدور الروبوت قليلاً إلى اليسار لمدة 350 مللي ثانية، ويضع المستشعر فوق مساحة السطح المظلمة. ثم يتوقف ويأخذ قراءة واضحة للقناة، والتي تصبح
blackValue. - قياس القيمة البيضاء (المشرقة): يدور الروبوت إلى اليمين لمدة 500 مللي ثانية (أطول قليلاً لتغطية الشريط الأبيض أيضًا). ويتوقف ويأخذ قراءة أخرى، والتي تصبح
WhiteValue. - حساب العتبة: إن
القيمة المتوسطةتم ضبطه على متوسط القراءات بالأبيض والأسود. هذه العتبة هي الخط الفاصل بين "على الخط المظلم" و"على الخلفية الساطعة" لجميع حسابات PID التالية.
ملحوظة هامة بخصوص التنسيب: قبل تشغيل الروبوت، ضعه بحيث يبدأ تشغيل المستشعر عند الحافة اليسرى من الشريط الأبيض على السطح الداكن. تفترض المعايرة أن الروبوت سيقرأ أولاً المنطقة المظلمة (الانعطاف إلى اليسار) ثم المنطقة المضيئة (الانعطاف إلى اليمين). إذا تم وضع الروبوت في موضع خاطئ، فستعطي المعايرة قيمًا غير صحيحة ولن يتبع الروبوت الخط بشكل صحيح.
الحلقة الرئيسية وحساب الخطأ
void loop() {
uint16_t r, g, b, c;
tcs.getRawData(&r, &g, &b, &c);
// Reads the light intensity from the sensor.
// Calculates error and adjusts motor speeds using PID control.
}
في كل تكرار للحلقة، يقرأ المستشعر القنوات الحمراء والخضراء والزرقاء والواضحة، ولكن القناة الواضحة فقط c يتم استخدامه لأنه يعطي قياسًا موثوقًا للسطوع بشكل عام. يتم حساب الخطأ كما القيمة المتوسطة - ج: عندما يكون المستشعر فوق الخط المظلم، يكون c منخفضًا ويكون الخطأ إيجابيًا؛ وعندما يكون فوق الخلفية الساطعة، يكون c مرتفعًا ويكون الخطأ سلبيًا. يؤدي هذا الخطأ الموقع إلى دفع تصحيح PID لتوجيه الروبوت في الاتجاه الصحيح.
حساب تصحيح PID
التصحيح العائم = Kp * خطأ + Ki * مجموع الخطأ + Kd * الفرق;
هذا الخط المفرد هو جوهر وحدة التحكم PID. فهو يجمع بين المصطلحات التناسبية والتكاملية والمشتقة في قيمة تصحيح واحدة. المجموع التكاملي (sumError) مقيد بين -4 و4 لمنع الانهيار المتكامل، مما قد يتسبب في تجاوز الروبوت بشكل سيئ بعد دورة طويلة. وأيضًا، عندما يكون الخطأ صغيرًا جدًا (أقل من 2.0)، تتم إعادة تعيين المجموع المتكامل إلى الصفر، وبالتالي لا يتراكم التصحيح المتراكم عندما يكون الروبوت يتتبع جيدًا بالفعل.
تحديد السرعة
بعد تطبيق تصحيح PID على السرعة الأساسية، يتم تقييد سرعتي المحرك إلى نطاق من 20 إلى 255 باستخدام تقييد () وظيفة. الحد الأدنى هو 20 لأن قيم PWM المنخفضة جدًا قد لا تنتج أي حركة بسبب احتكاك المحرك. الحد الأقصى 255 هو حد Arduino PWM.
وظيفة التحكم في المحرك
void controlMotors(int speedLeft, int speedRight) {
// Adjusts motor direction and speed based on the calculated correction.
}
إن محركات التحكم () تقبل الوظيفة قيم السرعة الموقعة لكل محرك. القيم الإيجابية تدفع المحرك إلى الأمام؛ القيم السالبة تدفعه في الاتجاه المعاكس (يستخدم أثناء دورات المعايرة). لذا تقوم الوظيفة بتعيين دبوس الاتجاه (مرتفع أو منخفض) ثم تطبق قيمة السرعة المطلقة عبر PWM. بهذه الطريقة، تتعامل نفس الوظيفة مع القيادة الأمامية، والانعطاف، ومناورات دوران المعايرة.
الخطوة 7: المعايرة – كيف يتعلم الروبوت المسار
المعايرة مهمة لأن قراءات المستشعر المطلقة تتغير وفقًا لظروف الإضاءة وارتفاع المستشعر ولون السطح ومواد الشريط. بدلاً من ترميز عتبة ثابتة، يقوم الروبوت بقياس البيئة الفعلية عند بدء التشغيل ثم يحسب العتبة ديناميكيًا.
قبل المعايرة: الموضع الصحيح
ضع الروبوت بحيث يتم وضع مستشعر TCS34725 في مكانه الحافة اليسرى من الشريط الأبيض، مع وجود السطح الداكن على اليسار والشريط الأبيض على اليمين. وهذا يضمن أنه عندما يدور الروبوت إلى اليسار أثناء المعايرة، يقرأ المستشعر الخلفية المظلمة، وعندما يدور إلى اليمين، فإنه يقرأ الشريط الأبيض.
ما يفعله روتين المعايرة
- يقوم بتدوير الروبوت إلى اليسار لمدة 350 مللي ثانية ويسجل قراءة القناة الواضحة كـ
blackValue. - يقوم بتدوير الروبوت لليمين لمدة 500 مللي ثانية ويسجل قراءة القناة الواضحة كـ
WhiteValue. - يحسب
القيمة المتوسطة = (القيمة السوداء + القيمة البيضاء) / 2. - يطبع القيم الثلاث جميعها على الشاشة التسلسلية حتى تتمكن من التحقق من المعايرة الصحيحة.
ماذا تفعل إذا كانت المعايرة تعطي قيمًا سيئة
- إذا كانت قيم الأسود والأبيض قريبة جدًا من بعضها البعض، فلن يتمكن المستشعر من تمييز الخط من الخلفية. تحقق من ارتفاع المستشعر (يجب أن يكون 10-15 مم فوق السطح)، وتأكد من أن الخط به تباين قوي، وتحقق من عمل المستشعر عن طريق التحقق من القيم الأولية في الشاشة التسلسلية.
- إذا بدت القيم معكوسة (القيمة السوداء أعلى من القيمة البيضاء)، فقد يكون الروبوت قد تم وضعه في موضع البداية الخاطئ، أو أن أوقات الدوران تحتاج إلى تعديل.
- إذا كان المستشعر يُرجع دائمًا قيمًا منخفضة جدًا أو صفرًا، فتحقق من أسلاك I2C (SDA إلى A4، وSCL إلى A5) وتأكد من اكتشاف المستشعر عند بدء التشغيل.
الخطوة 8: كيفية اختبار الروبوت وضبطه

بشكل عام، الاختبار والضبط هما المكان الذي ينتقل فيه الروبوت الذي يتتبع الخطوط من "العمل" إلى "العمل بشكل جيد". اتبع هذه العملية للحصول على أفضل أداء من جهازك روبوت تابع للخط DIY مع PID.
إعداد مسار الاختبار
- استخدم شريط لاصق أبيض بعرض 50 ملم على سطح مظلم غير عاكس. وهذا يوفر تباينًا قويًا لمستشعر TCS34725.
- ابدأ بتصميم منحنى بسيط بيضاوي أو لطيف. تجنب المنعطفات الحادة بزاوية 90 درجة حتى يتم ضبط PID.
- تأكد من إضاءة سطح المسار بشكل متساوٍ. يمكن للظلال أو الأضواء الساطعة أن تربك قراءات المستشعر.
ضبط معلمات PID
يعد ضبط PID عملية تكرارية. تعتبر القيم الافتراضية في الكود (Kp = 24.0، Ki = 1.0، Kd = 1.0) نقطة بداية جيدة، ولكن قد تحتاج إلى تعديلها لتناسب الإعداد المحدد لديك.
- ابدأ بـ Kp فقط. اضبط Ki = 0 وKd = 0. ثم قم بزيادة Kp تدريجيًا من قيمة منخفضة (على سبيل المثال، 5) حتى يبدأ الروبوت في اتباع الخط. إذا تجاوزت الحد وتأرجحت، قم بتقليل Kp قليلًا.
- أضف كي بعناية. إذا كان الروبوت ينجرف باستمرار إلى جانب واحد أو يفتقد منحنيات لطيفة، قم بزيادة Ki بزيادات صغيرة (على سبيل المثال، 0.5). الكثير من كي يسبب التذبذب البطيء وعدم الاستقرار.
- أضف دينارًا فقط إذا لزم الأمر. إذا كان الروبوت يتأرجح حتى بعد ضبط Kp، فإن قيمة Kd صغيرة (على سبيل المثال، 0.5 إلى 2.0) يمكن أن تخفف من التذبذب. تجنب ضبط Kd على مستوى مرتفع جدًا، حيث قد يؤدي ذلك إلى جعل الروبوت بطيئًا أو متوترًا.
- تقليل السرعة الأساسية أثناء الاختبارات المبكرة. أقل
com.baseSpeed(على سبيل المثال، 40-60) يمنح وحدة التحكم PID المزيد من الوقت للرد. بمجرد ضبطه، يمكنك زيادة السرعة تدريجيًا. - انتبه للتذبذب مقابل التباطؤ. إذا تحرك الروبوت بشكل متعرج بسرعة حول الخط، فإن Kp مرتفع جدًا أو Kd منخفض جدًا. إذا كان رد فعل الروبوت بطيئًا جدًا وأخطأ في المنحنيات، فإن Kp منخفض جدًا.
افتح Serial Monitor عند 9600 باود أثناء الاختبار. ستساعدك قيم المعايرة وقراءات الأخطاء على فهم ما يراه الروبوت وكيفية ضبط مكاسب PID وفقًا لذلك.
استكشاف المشكلات الشائعة وإصلاحها
إذا لم يكن أداء الروبوت الخاص بك كما هو متوقع، فإن الجداول التالية تلخص المشكلات الأكثر شيوعًا وحلولها:
| مشكلة | السبب المحتمل | حل |
|---|---|---|
| الروبوت لا يتبع الخط على الإطلاق | لم يتم اكتشاف المستشعر، أو توصيلات خاطئة، أو فشل المعايرة | تحقق من أسلاك I2C (SDA → A4، SCL → A5). افتح Serial Monitor للتحقق من اكتشاف المستشعر وقيم المعايرة. أعد وضع الروبوت وأعد المعايرة. |
| يتأرجح الروبوت بشدة حول الخط | Kp مرتفع جدًا أو Kd منخفض جدًا | تقليل Kp بنسبة 20-30%. أضف قيمة Kd صغيرة (0.5–2.0) لتخفيف التذبذب. |
| يتفاعل الروبوت ببطء شديد ويفتقد المنحنيات | Kp منخفض جدًا أو السرعة الأساسية مرتفعة جدًا | قم بزيادة Kp تدريجياً. قم بتقليل السرعة الأساسية لمنح PID مزيدًا من وقت رد الفعل. |
| تبدو قراءات المستشعر غير مستقرة أو صاخبة | المستشعر بعيدًا جدًا عن السطح، أو تداخل الإضاءة المحيطة، أو الأسلاك غير المتماسكة | اخفض المستشعر إلى 10-15 ملم فوق المسار. قم بحماية المستشعر من الأضواء العلوية. تحقق من جميع توصيلات الأسلاك. |
| يقوم الروبوت بالمعايرة بشكل غير صحيح | وضع البداية الخاطئ أو التباين غير الكافي | ضع الروبوت على الحافة اليسرى من الشريط الأبيض على السطح الداكن. تأكد من أن الشريط أبيض تمامًا وأن الخلفية داكنة حقًا. |
مشاكل المحرك والطاقة والمسار
| مشكلة | السبب المحتمل | حل |
|---|---|---|
| المحركات ضعيفة جدًا أو لا تتحرك | بطارية منخفضة، أو قيمة PWM منخفضة جدًا، أو أن أسلاك المحرك معكوسة | قم بشحن البطارية أو استبدالها. تأكد من أن الحد الأدنى للسرعة (20) كافٍ لمحركاتك. قم بتبديل أسلاك المحرك إذا كان الاتجاه خاطئًا. |
| محرك واحد يعمل بشكل أسرع من الآخر | اختلافات في أجهزة المحرك أو مشكلة في الأسلاك | هذا أمر طبيعي بالنسبة للمحركات الرخيصة. يساعد المصطلح المتكامل (Ki) في PID على تصحيح هذا الانجراف. يمكنك أيضًا ضبط إزاحة السرعة الأساسية في الكود. |
| يتحرك الروبوت في دوائر أثناء المعايرة | يتم توصيل محرك واحد في الاتجاه المعاكس | قم بتبديل الأسلاك الموجبة والسالبة للمحرك الذي يدور في الاتجاه الخاطئ. |
| تباين الخط غير كاف | لون الشريط مشابه جدًا للخلفية، أو أن السطح اللامع يسبب انعكاسات | استخدم شريطًا أبيض غير لامع على سطح داكن غير لامع. تجنب الأرضيات اللامعة أو الشريط المعدني. |
| تسبب مشكلات الطاقة سلوكًا غير متناسق | انخفاض جهد البطارية أثناء استخدام المحرك | استخدم بطارية LiPo مشحونة بالكامل. قد لا توفر بطارية كتلة 9 فولت تيارًا كافيًا لكلا المحركين. فكر في مراقبة جهد البطارية. |
الأسئلة المتداولة (الأسئلة الشائعة)
TCS34725 عبارة عن مستشعر ألوان RGB وضوء واضح يتصل عبر I2C. على عكس مستشعرات الأشعة تحت الحمراء الأساسية، فإنه يوفر قيمًا تناظرية لكثافة الضوء، لذلك يكون اكتشاف الخط أكثر دقة.
يعنيPID المشتق النسبي التكاملي. إنها خوارزمية تحكم في ردود الفعل تعمل على ضبط سرعات المحرك بشكل متناسب مع مدى بعد المستشعر عن الخط، بحيث يتبع الروبوت الخط بسلاسة بدلاً من التعرج.
نعم. يمكنك استخدام Arduino Mega أو Nano إذا كانا يدعمان I2C. ومع ذلك، فإن Motor Shield Rev3 يتم تكديسه مباشرة على Uno أو Mega. إذا كنت تستخدم النانو، فسوف تحتاج إلى توصيل توصيلات المحرك يدويًا.
يحتوي TCS34725 على عنوان I2C ثابت، لذلك لا يمكنك توصيل جهازي استشعار مباشرة بدون معدد إرسال I2C (مثل TCA9548A). يستخدم هذا المشروع مستشعرًا واحدًا، وهو ما يكفي للمسارات القياسية.
إذا اتبع الروبوت الخط بسلاسة دون تذبذب مفرط، فإن قيمك جيدة. التعرج السريع يعني أن Kp مرتفع للغاية، في حين أن الانحراف عن المنحنيات يعني أن Kp منخفض جدًا. استخدم جهاز المراقبة التسلسلية لمشاهدة قيم الخطأ أثناء الضبط.
نعم. نظرًا لأن TCS34725 يوفر بيانات قناة باللون الأحمر والأخضر والأزرق والواضح، فيمكنك استخدام قنوات ألوان محددة بدلاً من القناة الواضحة. على سبيل المثال، لمتابعة خط أحمر، استخدم القناة الحمراء نسبة إلى القنوات الخضراء والزرقاء. وهذا يتطلب إجراء تغييرات على منطق حساب الخطأ.
الموارد والتنزيلات
- مستودع جيثب: كود Arduino الكامل لهذا المشروع متاح على GitHub.
- ملفات المحكمة الخاصة بلبنان: قم بتنزيل الهيكل القابل للطباعة ثلاثية الأبعاد وحامل المستشعر وحامل Arduino من Cults3D أو من لدينا متجر أومارترونيكس.
- مكتبة أدافروت TCS34725: قم بالتثبيت عبر Arduino IDE Library Manager (ابحث عن "Adafruit TCS34725").
- مكتبة AFMotor: قم بالتثبيت عبر Arduino IDE Library Manager (ابحث عن "Adafruit Motor Shield").
دروس OmArTronics ذات الصلة
إذا أعجبك هذا المشروع، فاطلع على هذه البرامج التعليمية ذات الصلة لمواصلة بناء مهاراتك في مجال الروبوتات:
- بناء روبوت يتبع الخطوط باستخدام أجهزة الاستشعار KY-033 للمبتدئين – النسخة المبتدئة من هذا المشروع، تستخدم مستشعرات IR أبسط بدون التحكم PID.
- بناء السيارة الروبوتية OmObi التي يتم التحكم فيها عن طريق البلوتوث – تعلم كيفية بناء روبوت متنقل يمكنك التحكم فيه عبر البلوتوث وتطبيق الهاتف الذكي.
- OmObiArm: روبوت متحرك بذراع روبوتية مدمجة – مشروع روبوت متنقل أكثر تقدماً يجمع بين منصة القيادة والذراع الآلية.
- التحكم في محرك سيرفو باستخدام عصا التحكم وشاشة OLED – تعلم أساسيات Arduino باستخدام الماكينات وإدخال عصا التحكم وإخراج العرض.
- الذراع الروبوتية ذات 6 دووف ذات التحكم بالبلوتوث - بناء وبرمجة ذراع آلية كاملة بست درجات من الحرية.
الخاتمة
لقد قمت الآن ببناء كامل روبوت يتبع الخط TCS34725 مع تحكم Arduino وPID. يأخذك هذا البرنامج التعليمي عبر التصميم ثلاثي الأبعاد والطباعة والتجميع والأسلاك ومعايرة المستشعر ونظرية PID وبرمجة Arduino والاختبار والضبط. بالمقارنة مع متتبع الخط الأساسي المعتمد على الأشعة تحت الحمراء، يتتبع هذا الروبوت الخطوط بسلاسة أكبر بفضل القراءات التناظرية المستمرة من مستشعر TCS34725 والتصحيحات التناسبية من وحدة التحكم PID.
من هنا، يمكنك تجربة سرعات أساسية أعلى، أو منحنيات مسار أكثر إحكامًا، أو اكتشاف الخطوط الملونة باستخدام قنوات RGB، أو إضافة أجهزة استشعار متعددة باستخدام معدد إرسال I2C. يمكنك أيضًا التحقق من أخرى مشاريع الروبوتات OmArTronics لمزيد من تصميمات Arduino والميكاترونكس والروبوتات المتنقلة.
تنزيل ملفات الطباعة ثلاثية الأبعاد (STL)
جميع ملفات STL القابلة للطباعة ثلاثية الأبعاد لهذا المشروع متاحة للتنزيل. يمكنك الحصول عليها من متجرنا أو تصفحها على Cults3D:
- متجر OmArTronics: قم بتنزيل ملفات المشروع من OmArTronics – احصل على حزمة المشروع الكاملة بما في ذلك ملفات STL ومخططات الأسلاك وكود المصدر الذي يتم تسليمه إلى بريدك الإلكتروني.
- الطوائف3D: عرض على Cults3D – تصفح وتنزيل ملفات النماذج ثلاثية الأبعاد على Cults3D.
رأي واحد حول “Building a Line Following Robot with TCS34725 RGB Sensor”