ربات تعقیب خط یا ربات مسیریاب (Line Follower Robot) یک ربات ساده است که بهصورت مستقل هدایت میشود و خطی را که روی زمین کشیده شده دنبال میکند. این خط میتواند خطی تیره روی سطح سفید یا خطی سفید، بر روی سطح تیره باشد. ساخت این ربات یک پروژه بسیار جالب است! در این آموزش، با نحوه ساخت ربات مسیریاب با آردوینو UNO و برخی المانهای در دسترس آشنا خواهید شد.
نحوه کار ربات مسیریاب
همانطور که قبلاً گفته شد، ربات مسیریاب (LFR) یک خط را دنبال میکند و برای دنبال کردن یک خط، باید ابتدا خط را تشخیص دهد. اما چگونه میتوان مکانیسم تشخیص خط را در LFR پیاده سازی کرد؟ همه میدانیم که بازتاب نور در سطح سفید، حداکثر و در سطح سیاه، حداقل است؛ زیرا سطح سیاه بیشترین مقدار نور را جذب میکند. بنابراین، ما قصد داریم از این ویژگی نور برای تشخیص خط استفاده کنیم. بهمنظور تشخیص نور، میتوان از LDR (مقاومت وابسته به نور) یا سنسور IR استفاده کرد.
در این پروژه، به دلیل دقت بالاتر از سنسور IR استفاده میکنیم. برای تشخیص خط، دو سنسور IR را در سمت چپ و دیگری در سمت راست ربات قرار میدهیم که در شکل زیر مشخص شده است. سپس، ربات را روی خط قرار میدهیم، به طوری که خط در وسط سنسورها قرار گیرد.
سنسورهای مادون قرمز از دو عنصر فرستنده و گیرنده تشکیل شده است. اساساً فرستنده یک LED IR است که سیگنال را تولید میکند و گیرنده IR یک دیود نوری است که سیگنال تولید شده توسط فرستنده را حس میکند. حسگرهای مادون قرمز، نور مادون قرمز را بر روی یک جسم ساطع میکنند. نوری که به قسمت سیاه برخورد میکند، جذب آن میشود. به همین دلیل، خروجی کمی ایجاد میکند، اما نور تابیده به قسمت سفید به فرستنده باز میگردد و توسط گیرنده مادون قرمز تشخیص داده میشود. در نتیجه، گیرنده خروجی آنالوگ میدهد. با توجه به اصلی که گفتیم، حرکت ربات را با چرخاندن چرخهای متصل به موتورها کنترل میکنیم. موتورها نیز توسط میکروکنترلر کنترل خواهند شد.
چگونه یک ربات تعقیب خط حرکت و مسیریابی میکند؟
یک ربات معمولی دارای دو دسته موتور است. بیایید آنها را موتور چپ و موتور راست بنامیم. هر دو موتور بر اساس سیگنال دریافتی از سنسورهای چپ و راست به ترتیب میچرخند. این ربات باید 4 سری حرکت را انجام دهد که شامل حرکت به جلو، گردش به چپ، چرخش به راست و توقف است. توضیح هر حالت در ادامه آمده است.
حرکت به جلو:
در این حالت، هنگامیکه هر دو سنسور روی یک سطح سفید هستند و خط بین دو سنسور قرار دارد، ربات باید به جلو حرکت کند، به عبارت دیگر، هر دو موتور باید به شکلی بچرخند که ربات در جهت جلو حرکت کند (در واقع هر دو موتور باید به دلیل نحوه قرار دادن آنها در ساختار ما، در جهت مخالف بچرخند. اما برای سادگی کار، ما حرکت موتورها را رو به جلو مینامیم.)
گردش به چپ:
در این حالت، سنسور سمت چپ در بالای خط تاریک قرار دارد، در حالیکه سنسور سمت راست روی قسمت سفید قرار دارد. از این رو، سنسور سمت چپ، خط سیاه را تشخیص داده و یک سیگنال به میکروکنترلر میدهد. از آنجا که سیگنال از سنسور سمت چپ میآید، ربات باید به جهت چپ بچرخد. بنابراین، موتور چپ به عقب و موتور راست به جلو میچرخد. در نتیجه، ربات به سمت چپ میچرخد.
چرخش به راست:
چرخش به راست مانند چرخش به چپ است، اما در این وضعیت فقط سنسور راست خط را تشخیص میدهد، به این معنی که ربات باید در جهت راست بچرخد. برای چرخاندن ربات به جهت راست، موتور چپ به جلو و موتور راست به عقب میچرخد و در نتیجه، ربات به سمت راست خواهد چرخید.
توقف:
در این حالت، هر دو سنسور در بالای خط هستند و میتوانند خط سیاه را بهطور همزمان تشخیص دهند. میکروکنترلر نیز به شکلی برنامهریزی میشود که این وضعیت را به عنوان یک فرآیند توقف در نظر بگیرد. از این رو، هر دو موتور متوقف میشوند و این موضوع باعث متوقف شدن حرکت ربات خواهد شد.
اجزای مورد نیاز برای ساخت ربات تعقیب خط با آردوینو UNO
1. آردوینو UNO – 1 عدد
2. درایور موتور L293D – 1 عدد
3. ماژول سنسور IR – 2 عدد
4. باتری 7.4 یا 9 ولت – 1 عدد
5. موتور گیربکس– 2 عدد
6. چرخ ربات – 2 عدد
7. چرخ هرزگرد – 1 عدد
8. شاسی ربات– 1 عدد
9. سیم
10. پیچ
نمودار مدار و مونتاژ ربات مسیریاب
مدار ربات مسیریاب از شش قسمت کلی تشکیل شده است:
- دو سنسور IR
- یک درایور موتور
- دو موتور گیربکس
- یک آردوینو
- یک باتری
- چند سیم برای اتصال
سنسور، نور IR منعکس شده از سطح را حس میکند و خروجی را به مقایسه کننده آپ امپی خود میفرستد. هنگامیکه سنسور روی زمینه سفید قرار میگیرد، نور ساطع شده توسط سنسور بهوسیله زمین سفید منعکس میشود و توسط گیرنده دریافت خواهد شد. اما وقتی سنسور بر روی پس زمینه سیاه قرار داشته باشد، نور منبع از آن منعکس نخواهد شد.
سنسور شدت نور منعکس شده را احساس میکند تا خروجی بدهد. خروجی سنسور به میکروکنترلر ارسال میشود و به درایور موتور دستور میدهد تا موتور را مطابق آن حرکت دهد. در این پروژه، Arduino Uno به شکلی برنامهریزی شده است که با توجه به ورودی سنسور، ربات را به جلو حرکت داده، به راست یا به چپ بچرخاند یا متوقف کند. خروجی آردوینو نیز به درایور موتور داده میشود.
چرا به درایور موتور نیاز داریم؟
دلیل استفاده از درایور موتور در اینجا، این است که سیگنال خروجی آردوینو برای حرکت موتور کافی نیست. به علاوه، لازم است موتورها را در هر دو جهت بچرخانیم. به همین دلیل، ما برحسب نیاز، از درایور موتور برای حرکت موتور استفاده میکنیم. درایور موتور قادر است جریان کافی برای حرکت موتور را تأمین کند. در اینجا، ما از یک درایور موتور L293D استفاده میکنیم که یک درایور موتور پل هیبرید دوبل است و برای 2 موتور کافی میباشد.
L293D دارای 16 پین است ، پایههای L293D در نمودار زیر نشان داده شده است.
اتصالات پینهای درایور موتور به شرح زیر است:
پین شماره 1 و 9 پینهای فعالساز هستند. این دو پین را به ورودی 5 ولت متصل میکنیم تا موتور فعال شود.
پینهای شماره 1A ، 2A ، 3A و 4A پینهای کنترل هستند.
برای مثال اگر پین 1A مقدار صفر بگیرد و 2A مقدار یک بگیرد، موتور به راست میچرخد و در صورت پایین آمدن 1A و 2A بالا، موتور به سمت چپ میچرخد. بنابراین، ما این پینها را به پایههای خروجی دیکودر وصل میکنیم.
پینهای 1Y،2Y ، 3Y و 4Y، پینهای اتصال موتور هستند.
توجه: Vcc2، پین ولتاژ درایور موتور است و فقط در صورت استفاده از موتور ولتاژ بالا استفاده میشود.
اتصال پینهای آردوینو UNO با درایور موتور به شرح زیر است:
در اینجا، ما از باتری 7.4 لیتیوم یون برای تغذیه کل مدار استفاده میکنیم. میتوانید از هر نوع باتری از 6 تا 12 ولت استفاده کنید. برای حرکت ربات، باید از موتورهایی با RPM کم اما با گشتاوری کافی برای حمل وزن ربات استفاده کنیم. بنابراین، برای این ربات دو موتور گیربکس 60 دور در دقیقه 6V انتخاب شده است که با باتری تغذیه میشود.
مونتاژ ربات مسیریاب
هنگامیکه اتصال همه اجزا را درک کردیم، میتوانیم مونتاژ ربات مسیریاب خود را شروع کنیم. مراحل مونتاژ گام به گام ربات در ویدیوی پایین صفحه توضیح داده شده است.
برای ساخت ربات مسیریاب ، ابتدا به بدنه ربات نیاز داریم. در اینجا از یک شاسی دست ساز استفاده کردهایم. میتوانید از شاسی آماده استفاده کنید یا خودتان آن را بسازید.
اکنون، موتورها را با کمک چسب حرارتی مانند تصویر زیر روی شاسی نصب کنید.
گام بعدی این است که درایور موتور را روی شاسی قرار دهید و سیمهای موتور را به خروجی درایور موتور وصل کنید.
در مرحله بعد، LED مادون قرمز و سنسور را مانند تصویر خم کنید.
سپس سنسورها را به سمت پایین ربات قرار دهید، حسگرها را با توجه به عرض مسیر و عرض ربات تنظیم کنید. به یاد داشته باشید که یک سنسور برای تشخیص سمت چپ و دیگری برای تشخیص سمت راست است.
حالا برد آردوینو خود را با استفاده از چسب روی شاسی نصب کنید و پایههای خروجی سنسور را به پین دیجیتال 2 و 4 آردوینو وصل کنید.
پینهای VCC را به 5 ولت و پایههای زمین را به زمین وصل کنید.
حالا، پینهای فعال کننده درایور موتور را به پین 5 و 8 آردوینو وصل کنید و پینهای ورودی درایور موتور را به ترتیب به پین شماره 6 ، 7 ، 9 و 10 آردوینو وصل کنید.
در نهایت، باتری را به مدار وصل کرده و باتری را روی شاسی قرار دهید. در اینجا، همه چیز را با سیمهای جامپر متصل کردهایم. اما برای ایجاد یک ساختار دائمی، میتوانید مستقیماً همه چیز را به هم لحیم کنید.
حالا برد را وارونه کرده و با کمک تفنگ چسب حرارتی، چرخهای هرزگرد را مانند تصویر زیر وصل کنید.
در نهایت، چرخها را اضافه کنید. برای ایمنی بیشتر، یک ورق پلاستیکی را نیز به عنوان ضربه گیر اضافه کردیم.
کد آردوینو برای راه اندازی ربات مسیریاب
بخش برنامه نویسی ربات مسیریاب بسیار ساده است و فقط به توابع اولیه آردوینو نیاز داریم. برنامه کامل این پروژه را میتوانید در انتهای همین صفحه مشاهده کنید. توضیحات این برنامه به شرح زیر است:
اولین قدم این است که هر پین آردوینو استفاده شده را تعریف کنیم. با پینهای درایور و پینهای سنسور شروع میکنیم. در اینجا، برای درک آسان هر خطِ کد، توضیحات بهصورت کامنت آمده است.
#define enA 5 //Enable1 L293 Pin enA
#define in1 6 //Motor1 L293 Pin in1
#define in2 7 //Motor1 L293 Pin in1
#define in3 9 //Motor2 L293Pin in1
#define in4 10 //Motor2 L293 Pin in1
#define enB 8 //Enable2 L298 Pin enB
#define R_S 4 // Right sensor
#define L_S 2 // Left sensor
در قسمت حلقه، حالت هر پین را تعریف کنید. در اینجا، ما باید خروجی سنسورهای IR را بخوانیم. بنابراین، آن پینها را به عنوان ورودی تعریف میکنیم. موتور باید توسط آردوینو هدایت شود، به همین دلیل، پینهای درایور موتور را به عنوان خروجی تعریف میکنیم. در نهایت، پین فعال ساز را به وضعیت high میبریم.
pinMode(R_S, INPUT);
pinMode(L_S, INPUT);
pinMode(enA, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
pinMode(enB, OUTPUT);
digitalWrite(enA, HIGH);
digitalWrite(enB, HIGH);
در بخش حلقه، ابتدا مقادیر سنسورهای IR را میخوانیم و سپس با استفاده از “if condition” حرکت موتور را مطابق نیاز خود کنترل میکنیم. چهار شرایط حرکت در زیر توضیح داده شده است.
حرکت رو به جلو:
if((digitalRead(R_S) == 0)&&(digitalRead(L_S) == 0)){forward();}
در این حالت، اگر سنسور سمت راست و سنسور سمت چپ، بالای رنگ سفید باشند، ربات باید در جهت جلو حرکت کند. به همین دلیل، تابع forward فراخوانی میکنیم.
(توجه: در اینجا 0 به این معنی است که خروجی سنسور IR در وضعیت high است، زیرا سنسور روی سطح سفید قرار دارد)
گردش به سمت راست:
if((digitalRead(R_S) == 1)&&(digitalRead(L_S) == 0)){turnRight();}
اگر سنسور راست در حال تشخیص سطح سیاه است و سنسور چپ هیچ خط مشکی را تشخیص نمیدهد، آنگاه تابع Right فراخوانی میشود و با فراخوانی تابع turnRight، پروتکل مربوط به چرخش به راست را آغاز میکند.
گردش به سمت چپ:
if((digitalRead(R_S) == 0)&&(digitalRead(L_S) == 1)){turnLeft();}
اگر سنسور راست روی رنگ سفید باشد و سنسور چپ سیاه را تشخیص دهد، آنگاه تابع turnLeft فراخوانی میشود. این تابع چرخش ربات به سمت چپ را انجام میدهد.
توقف ربات مسیریاب:
if((digitalRead(R_S) == 1)&&(digitalRead(L_S) == 1)){Stop();}
اگر سنسور راست و سنسور چپ روی رنگ مشکی باشند، تابع Stop فراخوانی میشود. در این حالت، ربات کاملاً متوقف خواهد شد.
ما 4 عملکرد ربات راForward ، turnLeft ، turnRight و Stop تعریف کردهایم. کد انجام این توابع در زیر آمده است:
تابع جلو:
void forward(){
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
}
این بدان معناست که ما ورودی 1 و 4 درایور موتور را به وضعیت high میبریم، در نتیجه، هر دو موتور به جلو حرکت میکنند. به همین شکل توابع دیگر را که در ادامه ارائه شدهاند، میسازیم.
تابع چرخش به راست:
void turnRight(){
digitalWrite(in1, LOW); //Right Motor forward Pin
digitalWrite(in2, HIGH); //Right Motor backward Pin
digitalWrite(in3, LOW); //Left Motor backward Pin
digitalWrite(in4, HIGH); //Left Motor forward Pin
}
تابع چرخش به چپ :
void turnLeft(){
digitalWrite(in1, HIGH); //Right Motor forward Pin
digitalWrite(in2, LOW); //Right Motor backward Pin
digitalWrite(in3, HIGH); //Left Motor backward Pin
digitalWrite(in4, LOW); //Left Motor forward Pin
}
تابع توقف:
void Stop(){
digitalWrite(in1, LOW); //Right Motor forward Pin
digitalWrite(in2, LOW); //Right Motor backward Pin
digitalWrite(in3, LOW); //Left Motor backward Pin
digitalWrite(in4, LOW); //Left Motor forward Pin
پس از کدنویسی، باید کد را در آردوینو بارگذاری کنیم و برای انجام این کار، آردوینو خود را با استفاده از کابل USB به رایانه متصل کرده و این کد را با استفاده از Arduino IDE بارگذاری کنیم.
// Arduino Line Follower Robot Code
#define enA 5//Enable1 L293 Pin enA
#define in1 6 //Motor1 L293 Pin in1
#define in2 7 //Motor1 L293 Pin in1
#define in3 9 //Motor2 L293 Pin in1
#define in4 10 //Motor2 L293 Pin in1
#define enB 8 //Enable2 L293 Pin enB
#define R_S 4//ir sensor Right
#define L_S 2 //ir sensor Left
void setup(){
pinMode(R_S, INPUT);
pinMode(L_S, INPUT);
pinMode(enA, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
pinMode(enB, OUTPUT);
digitalWrite(enA, HIGH);
digitalWrite(enB, HIGH);
delay(1000);
}
void loop(){
if((digitalRead(R_S) == 0)&&(digitalRead(L_S) == 0)){forward();} //if Right Sensor and Left Sensor are at White color then it will call forward function
if((digitalRead(R_S) == 1)&&(digitalRead(L_S) == 0)){turnRight();} //if Right Sensor is Black and Left Sensor is White then it will call turn Right function
if((digitalRead(R_S) == 0)&&(digitalRead(L_S) == 1)){turnLeft();} //if Right Sensor is White and Left Sensor is Black then it will call turn Left function
if((digitalRead(R_S) == 1)&&(digitalRead(L_S) == 1)){Stop();} //if Right Sensor and Left Sensor are at Black color then it will call Stop function
}
void forward(){ //forward
digitalWrite(in1, HIGH); //Right Motor forward Pin
digitalWrite(in2, LOW); //Right Motor backward Pin
digitalWrite(in3, LOW); //Left Motor backward Pin
digitalWrite(in4, HIGH); //Left Motor forward Pin
}
void turnRight(){ //turnRight
digitalWrite(in1, LOW); //Right Motor forward Pin
digitalWrite(in2, HIGH); //Right Motor backward Pin
digitalWrite(in3, LOW); //Left Motor backward Pin
digitalWrite(in4, HIGH); //Left Motor forward Pin
}
void turnLeft(){ //turnLeft
digitalWrite(in1, HIGH); //Right Motor forward Pin
digitalWrite(in2, LOW); //Right Motor backward Pin
digitalWrite(in3, HIGH); //Left Motor backward Pin
digitalWrite(in4, LOW); //Left Motor forward Pin
}
void Stop(){ //stop
digitalWrite(in1, LOW); //Right Motor forward Pin
digitalWrite(in2, LOW); //Right Motor backward Pin
digitalWrite(in3, LOW); //Left Motor backward Pin
digitalWrite(in4, LOW); //Left Motor forward Pin
}
آزمایش و کالیبراسیون
ما ربات مسیریاب را مونتاژ کرده و کد را بارگذاری کردیم، اکنون زمان آن است که عملکرد آن را ببینیم. اگر ربات ما نتواند خط را دنبال کند، باید آن را کالیبره کنیم. برای شروع، ربات را روی سطح سیاه (هر دو سنسور باید بر روی سطح سیاه باشند) قرار دهید.
سپس، مقاومت متغیر ماژول IR را تنظیم کنید تا خروجی LED ماژول IR خاموش شود. در مرحله بعد، ربات را روی یک سطح سفید قرار دهید و بررسی کنید که آیا LED روشن میشود. اگر روشن نشد، فقط مقاومت متغیر را تنظیم کنید. این عمل را یک بار دیگر تکرار کنید تا مطمئن شوید LED خروجی، صحیح کار میکند.
اکنون، از آنجا که ما ربات را کالیبره کردهایم، تنها کاری که باید انجام دهیم این است که ربات را بر روی خط سیاه قرار دهیم و آن را در عمل ببینیم.
امیدواریم از این مقاله لذت برده باشید. حتما ویدیوی زیر را مشاهده کنید تا نحوه ساخت ربات تعقیب خط را به صورت دقیق ببینید. اگر سوالی در مورد نحوه ساخت این ربات دارید نیز، حتما آن را در قسمت دیدگاه مطرح کنید.
سلام میشه از درایور متور تو این ربات استفاده نکرد
سلام وقت بخیر، خیر دوست عزیز
سلام این ربات رو میشه تو مسابقات رباتیک شرکت داد
سلام به شما،
هر مسابقهای قوانین خودش رو داره و ممکنه قابل استفاده باشه، ممکنه هم نباشه.
اما به طور کلی این ربات بیشتر نقطه شروعی برای مبتدیانه و
معمولا برای مسابقه از تعداد سنسورهای بیشتر، قابلیتهای متنوعتر و صد البته برنامه پیچیدهتر استفاده میشه.
سلام این شاسی ربات طرح داره یعنی جنس شاسی که تو آموزش گفتید از چیه
طرح این شاسی رودارید بهم بدید ممنون میشم
پلکسی هست. متاسفانه طرحش رو نداریم.
سلام این سیم هایی که برای اتصال مدارات استفاده میشه مدلش چیه
سلام وقتتون بخیر،
سیم جامپر هستند.
سلام ميشه از درايور موتور l298 استفاده كرد
سلام وقتتون بخیر،
بله امکانش هست.
سلام ببخشید اگر ما بخواهیم با درایور l298d کار کنیم که دارای 16 پین نمی باشد خوب چی کار کنیم که وصل بشود به برد اردینیو و بقیه
سلام وقت بخیر،
روی بردها پینهایی از آی سی که برای راهاندازی، موردنیازه قرار داده شده پس جای نگرانی نیست.
سلام وقت بخیر برد l293d که من می خواهم بخرم که یک مدل دیگر است چه کار کنم
سلام دوست عزیز،
احتمال زیاد بردها تشابه زیادی دارند و راهاندازی همه اونها بسیار سادهست،
با خوندن دیتاشیت و جستجو در اینترنت و … میتونید به راحتی برد خودتون رو راهاندازی کنید.
سلام خوب هستید میتونیم از درایور موتور استفاده نکنیم؟
سلام دوست عزیز،
تشکر، اتصال مستقیم موتور به میکروکنترلر باعث آسیب رسیدن به میکرو میشه،
به همین دلیل نیاز به درایور موتور داریم. البته میتونیم درایور رو خودمون با چند ترانزیستور بسازیم.
سلام با دوتا سنسور میتونه دوران هم بزنه؟
سلام دوست عزیز،
بله میتونه، البته طبیعتا برای مسیرهای پیچیده به تعداد سنسور بیشتری نیازه.
سلام خسته نباشید
چجوری میشه سرعت موتور رو نتظیم کرد ؟
سلام به شما، تشکر
با مدولاسیون عرض پالس یا pwm. به عبارت دیگه به جای اینکه به موتور دائما ۱ بدید، یک پالس ۰ و ۱ بدید که هر چه زمان ۱ بیشتر باشه،
متوسط ولتاژ بیشتر بوده و سرعت هم بیشتر خواهد بود. این عملکرد با تابع analogWrite(n) صورت میگیره که n عددی بین ۰ و ۲۵۶ هست.
سلام
من اینو وصل کردم و همین برنامه رو کامل نوشتم
فقط رباتم ی دفعه شروع به حرکت می کنه و گاهی هم حرکت نمی کنه
سلام دوست عزیز،
احتمالا مشکل از اینه که سنسور گاهی تشخیص میده و گاهی نه.. برای حل مشکل سنسورها باید بخش کالیبراسیون رو دوباره انجام بدید.
توجه داشته باشید که جایگیری سنسورها مهمه و همچنین نور محیط در تشخیص دادن موثره.
مثلا ممکنه در نور روز ربات به خوبی کار کنه و شبها نه و به این صورت نیاز به کالیبراسیون دوباره باشه.
سلام من یه ربات مسیر یاب دارم.با 4 تا سنسور ای ار TRT5000 و 1 ماژول شعله و 2 تا سنسور تشخیص رنگ TSC3200 و 1 پمپ اب کف کش 3 تا 6 ولتی و درایور موتور L298 و 4 تا موتور DC . سه تا باتری کتابی موازی کردم ولی اصلا نتونست ربات رو به حرکت در بیاره.میخواستم بدونم پیشنهادی دارین من از چه باتری و چه تعدادی استفاده کنم تا مشکلم حل بشه؟
سلام دوست عزیز،
میتونید از باتریهای لیتیومی استفاده کنید. هر سل باتری لیتیومی در حالت شارژ کامل حدود ۴.۲ ولت هست. پس دو سل باید سری بشه.