صناعة سيارة تتبع الخط الأسود باستخدام Arduino ومستشعرات الأشعة تحت الحمراء
في الحلقة السادسة من سلسلة Arduino من الصفر سنصنع سيارة تتبع الخط الأسود باستخدام Arduino ومستشعرين للأشعة تحت الحمراء. سنعيد استخدام هيكل سيارة تفادي العوائق من المشروع السابق، ونضيف درع التحكم بالمحركات L293D، ثم نبرمج السيارة لتتقدم وتنعطف تلقائيًا بحيث يبقى الخط الأسود بين المستشعرين.
فيديو المشروع
شاهدوا خطوات تركيب السيارة، شرح المستشعرات والبرنامج، ثم التجربة العملية في الفيديو السادس من سلسلة Arduino من الصفر على قناة نادي الابتكار.
فكرة سيارة تتبع الخط الأسود
تعتمد السيارة على مستشعرين للأشعة تحت الحمراء في مقدمتها: أحدهما على اليمين والآخر على اليسار. يعكس السطح الفاتح الأشعة تحت الحمراء بدرجة أكبر من الخط الأسود في الظروف المناسبة. ومن خلال قراءة المستشعرين يستطيع Arduino تحديد ما إذا كان عليه التقدم أو الانعطاف أو التوقف.
المكونات المطلوبة
- لوحة Arduino متوافقة مع درع المحركات المستخدم.
- درع محركات L293D Motor Shield.
- هيكل سيارة روبوت مع محركين DC وعجلتين أماميتين.
- عجلة حرة خلفية للتوازن.
- مستشعران للأشعة تحت الحمراء بكاشف انعكاس ومخرج رقمي.
- أسلاك توصيل أنثى–أنثى.
- حامل بطاريات وبطاريات مناسبة للمحركات والدرع.
- مفتاح تشغيل وأسلاك تثبيت وبراغٍ.
- مسار أبيض أو فاتح مرسوم عليه خط أسود.
تجميع هيكل السيارة
يستخدم الفيديو هيكل السيارة من مشروع تفادي العوائق السابق. تم الاعتماد على العجلتين الأماميتين المتصلتين بالمحركين، مع عجلة حرة في منتصف الخلف. يساعد هذا الترتيب على جعل محور دوران السيارة قريبًا من المستشعرين المثبتين في المقدمة، مما يحسن قدرتها على اتباع المنعطفات.
تُثبت لوحة Arduino على الهيكل، ثم يركب درع L293D فوقها. بعد ذلك تُوصل أسلاك المحركين بمخارج المحركات المخصصة على الدرع، وتثبت المستشعرات في مقدمة السيارة مع الحرص على ثباتهما وتقارب ارتفاعهما عن الأرض.
التعرف على درع L293D Motor Shield
يحتوي الدرع الموضح في الفيديو على دائرتين متكاملتين L293D، ويمكنه التحكم في ما يصل إلى أربعة محركات DC أو محركين خطويين ضمن الحدود الكهربائية للدرع. كما يوفر توصيلًا لمصدر طاقة خارجي للمحركات ومنافذ مخصصة لمحركات Servo لا نحتاج إليها في هذا المشروع.
مهم: تحقق من إصدار الدرع وترقيم مخارج المحركات ومواصفات تغذيته قبل التوصيل. لا تفترض أن جميع دروع L293D متطابقة، ولا تغذِّ المحركات من منفذ Arduino دون التحقق من متطلبات التيار والجهد.
كيف يعمل مستشعر الأشعة تحت الحمراء؟
تتكون الوحدة المستخدمة من مرسل ومستقبل للأشعة تحت الحمراء، ومقاومة متغيرة لضبط الحساسية، ومؤشر طاقة، ومؤشر كشف، إضافة إلى أطراف التغذية والمخرج الرقمي. في التوصيف الوارد بالفيديو، يعطي المخرج مستوى منخفضًا عند استقبال انعكاس كافٍ من السطح الفاتح، ومستوى مرتفعًا عندما يقل الانعكاس فوق الخط الأسود.
قد يختلف السلوك الفعلي حسب نوع المستشعر وضبط المقاومة المتغيرة، كما تؤثر الإضاءة المحيطة والمسافة عن الأرض ولون السطح. لذلك يجب اختبار الوحدتين ومعايرتهما قبل تشغيل السيارة.
توصيل المستشعرات مع Arduino
يركب المستشعر الأيسر والمستشعر الأيمن في مقدمة السيارة. ورغم استخدام مداخل Arduino التناظرية A0 وA1، فإن الوحدة الموصوفة توفر خرجًا رقميًا؛ ويمكن قراءة هذا الخرج بواسطة المنافذ التناظرية المستخدمة كمداخل وفق البرنامج الأصلي.
| المكوّن | طرف المستشعر | Arduino |
|---|---|---|
| المستشعر الأيسر | OUT | A1 |
| المستشعر الأيمن | OUT | A0 |
| المستشعران | VCC | 5V وفق مواصفات الوحدة |
| المستشعران | GND | GND |
| المحرك الأيسر والأيمن | سلكا المحرك | مخارج المحركات المختارة على درع L293D |
لم يحدد التعليق الصوتي أرقام مخارج المحركات على الدرع، لذلك يجب مطابقتها مع الكود الأصلي والتركيب الفعلي قبل التشغيل.
منطق تتبع الخط الأسود
في البرنامج المعروض تُقارن قراءة كل مستشعر بعتبة 36. إذا كانت القراءتان أقل من العتبة تتقدم السيارة. وإذا تجاوزت قراءة المستشعر الأيمن العتبة تنعطف يمينًا، وإذا تجاوزت قراءة المستشعر الأيسر العتبة تنعطف يسارًا. أما إذا تجاوزت القراءتان العتبة فتتوقف السيارة.
| المستشعر الأيسر A1 | المستشعر الأيمن A0 | قرار السيارة |
|---|---|---|
| أقل من 36 | أقل من 36 | التقدم إلى الأمام |
| أقل من 36 | أكبر من 36 | الانعطاف يمينًا |
| أكبر من 36 | أقل من 36 | الانعطاف يسارًا |
| أكبر من 36 | أكبر من 36 | التوقف |
ملاحظة تقنية حول العتبة 36: يذكر الفيديو قراءة تقارب 30 على السطح الأبيض وقراءة تتجاوز 1000 على الأسود. هذا يتوافق مع قراءة analogRead() على لوحة Arduino ذات محول 10-bit لخرج رقمي 0V/5V، لكنه ليس قياسًا تدريجيًا للانعكاس في هذه الحالة. العتبة 36 قيمة تجريبية مرتبطة بهذا التركيب؛ ويمكن عند استخدام digitalRead() التعامل مباشرة مع HIGH وLOW. راجع الكود الأصلي قبل تغيير طريقة القراءة.
الكود الكامل لسيارة تتبع الخط الأسود
يستدعي البرنامج مكتبة التحكم بدرع المحركات، ويعرّف المحركين والمستشعرين والسرعات، ثم ينفذ أوامر الحركة بحسب القراءات.
//import your motor shield library
#include <AFMotor.h>
// set up motors.
AF_DCMotor motor1(3, MOTOR34_1KHZ);
AF_DCMotor motor2(2, MOTOR12_1KHZ);
// define the pins of your sensor
#define left_sensor_pin A0
#define right_sensor_pin A2
// sets speed of DC motors, between 0-255
#define MAX_SPEED 150
long duration, distance;
void setup() {
// begin serial communication
Serial.begin(9600);
pinMode(left_sensor_pin, INPUT); // set the left_sensor pin to input
pinMode(right_sensor_pin, INPUT); // set the right_sensor pin to input
//set the speed of the motors
motor1.setSpeed(MAX_SPEED);
motor2.setSpeed (MAX_SPEED);
}
void loop() {
int left_sensor = analogRead(left_sensor_pin);
int right_sensor = analogRead(right_sensor_pin);
if ( left_sensor <= 36 && right_sensor <= 36 ) { //
//Forward
Serial.println ("Black line not delected" );
moveForward();
}
else if( left_sensor <= 36 && right_sensor > 36 ) {
//Forward
Serial.println ("Black line delected by right sensor" );
turnRight();
}
else if(left_sensor > 36 && right_sensor <= 36) {
//Forward
Serial.println ("Black line delected by left sensor" );
turnLeft();
}
else if(left_sensor > 36 && right_sensor > 36) {
//turn right
Serial.println ("Black line delected by both sensors" );
moveStop();
}
}
//Move forward Function
void moveForward() {
motor1.run(FORWARD);
motor1.setSpeed(MAX_SPEED);
motor2.run(FORWARD);
motor2.setSpeed(MAX_SPEED);
}
//release movment Function
void moveStop() {
motor1.run(RELEASE);
motor2.run(RELEASE);
}
//Turn Right Function
void turnRight() {
motor1.run(FORWARD);
motor1.setSpeed(MAX_SPEED+50);
motor2.run(BACKWARD);
motor2.setSpeed(MAX_SPEED+50);
}
//Turn Left Function
void turnLeft() {
motor1.run(BACKWARD);
motor1.setSpeed(MAX_SPEED+50);
motor2.run(FORWARD);
motor2.setSpeed(MAX_SPEED+50);
}
شرح البرنامج خطوة بخطوة
تعريف المكتبة والمحركات والمنافذ
في بداية البرنامج تُستدعى مكتبة التحكم في L293D ويُعرّف المحركان المستخدمان، بالإضافة إلى مدخلي المستشعر الأيمن A0 والأيسر A1 ومتغير سرعة المحركات.
الإعداد الأولي setup()
يبدأ الاتصال التسلسلي لعرض القراءات أثناء الاختبار، ثم تُجهز المنافذ وتُحدد سرعة المحركين.
الحلقة المتكررة loop()
يقرأ Arduino حالتي المستشعرين ويعرض القيم في Serial Monitor. ثم يختار الحركة المناسبة: تقدم أو انعطاف يمينًا أو يسارًا أو توقف. يحتوي البرنامج كذلك على دوال منفصلة لتنفيذ كل حركة، مع زيادة بسيطة لسرعة المحركات أثناء بعض الانعطافات كما ورد في الشرح.
اختبار السيارة ومعايرة المستشعرات
- ثبت المستشعرين جيدًا في مقدمة السيارة وعلى ارتفاع مناسب عن الأرض.
- اختبر قراءاتهما فوق سطح أبيض ثم فوق خط أسود باستخدام Serial Monitor.
- اضبط المقاومة المتغيرة على كل مستشعر إذا كانت القراءة غير مستقرة.
- اختبر دوران المحركين أولًا والعجلات مرفوعة عن الأرض.
- ضع السيارة على المسار وتحقق من اتجاه الانعطاف، ثم عدّل السرعة أو موضع المستشعرات عند الحاجة.
في الاختبار النهائي المعروض بالفيديو تسير السيارة فوق الأرض وتتبع الخط الأسود بين المستشعرين، وتنعطف يمينًا ويسارًا، ثم تتوقف عندما يصبح الخط الأسود تحت المستشعرين معًا.
مشاكل شائعة وحلولها
| المشكلة | الحل المقترح |
|---|---|
| السيارة تنعطف في الاتجاه الخاطئ | تحقق من موضع المستشعرين A0/A1 واتجاه دوران المحركين. |
| السيارة لا تكتشف الخط | اضبط حساسية المستشعرين وارتفاعهما واختبر الانعكاس فوق الأسود والأبيض. |
| السيارة تتوقف باستمرار | راجع قراءات المستشعرين والعتبة ومنطق الحالات. |
| المحركات لا تتحرك | تحقق من تغذية الدرع والبطاريات وتوصيلات المحركات ومكتبة التحكم. |
| السيارة تفقد الخط في المنعطفات | خفّض السرعة، واضبط المسافة بين المستشعرين وموضعهما الأمامي. |
ماذا تعلمنا؟
- إعادة استخدام هيكل سيارة روبوت في مشروع جديد.
- استخدام درع L293D للتحكم في محركين DC.
- فهم انعكاس الأشعة تحت الحمراء على الأسطح الفاتحة والداكنة.
- توصيل مستشعرين مع Arduino عبر A0 وA1.
- استخدام الشروط البرمجية لاتخاذ قرارات الحركة.
- معايرة المستشعرات وتجربة السيارة على مسار حقيقي.
أفكار لتطوير المشروع
يمكن تحسين الأداء بتجربة سرعات مختلفة، وإضافة مستشعرات أخرى، أو استخدام متحكم تناسبي لتقليل الاهتزاز أثناء تتبع المنعطفات. ويمكن لاحقًا الجمع بين تتبع الخط وكشف العوائق في سيارة واحدة.
الخلاصة
صنعنا سيارة تتبع الخط الأسود باستخدام Arduino ودرع L293D ومستشعرين للأشعة تحت الحمراء. وتعلمنا كيف نحول قراءات المستشعرات إلى أوامر للمحركين لتوجيه السيارة على المسار. تابعوا باقي حلقات Arduino من الصفر على قناة Naadi Tech – نادي الابتكار.
