ربات تعقیب خط به رباتی اطلاق میشود که مسیری را که بر روی زمین مشخص شده، تشخیص دهد و در امتداد آن حرکت کند. عموما این مسیر با یک نوار تیره رنگ بر روی زمینهای به رنگ روشن مشخص می شود که ربات با توجه به سنسورهای مغناطیسی خود قادر به تشخیص مسیر خواهد بود.
برای تشخیص مسیر مشخص شده با نوار مشکی بر روی زمین، از سنسورهای مادون قرمز استفاده میشود. بدین گونه که یکLED فرستنده ی مادون قرمز (IR) نور را بر روی سطح میتاباند و هر چه رنگ سطح روشن تر باشد، نور بازتاب بیشتری خواهد داشت. در کنار این فرستنده، یک دیود حساس به نور IR وجود دارد که بازتاب نور را دریافت میکند. اگر تابش IR بیشتر از مقدار خاصی باشد، گیرنده خاصیت دیودی خود را از دست میدهد و با بایاس مناسب، میتوان بازتاب یا عدم بازتاب سطح و در نتیجه وجود رنگ تیره یا روشن در جلوی سنسور را تشخیص داد.
این جفت سنسورها که به اختصار فرستنده گیرنده IR گفته میشوند، به تعداد مناسبی در زیر بدنهی ربات نصب میشوند و پردازنده با استفاده از مقدار ولتاژ خروجی هر کدام از گیرنده ها، محل تقریبی قرار گرفتن خط تیره رنگ را در زمینه سفید می یابد.
ربات تعقیب خط برای حرکت به تعدادی موتور و چرخ نیاز دارد که برای انجام سریعتر حرکات و توانایی دور درجا زدن در مکان های کوچک عموما از حالت” 3چرخ” و یا “تانکی” استفاده میشود. در حالت” 3چرخ”، دو چرخ در عقب ربات نصب میشود که به شفت موتورهای حرکتی ربات متصلند و چرخ جلو برای حفظ تعادل ربات قرار میگیرد و به صورت هرزگرد عمل میکند.
برای پردازش سنسورها و ایجاد دستور های حرکتی برای اعمال به موتورها در جهت درست و سرعت مناسب، از یک پردازندهی AVR مدل ATmega64 استفاده کردهایم. برای ربات 24 جفت سنسور IR قرار دادیم و خروجی ولتاژ سنسورها را پس از تقویت شدن در یک بافر به میکروکنترلر وصل کردیم.
برای راهاندازی موتورها از یک جفت H-Bridge ماسفتی استفاده شده که راهاندازی هر کدام از ماسفتها توسط یک مدار پوش- بول انجام میگیرد و میکروکنترلر برای به حرکت در آوردن موتورها کافیست ورودی بیس ترانزیستورهای پوش- بول را صفر و یک نماید. همچنین برای کنترل سرعت موتورها، با ایجاد یک سیگنال PWM8 بیتی و ارسال آن به راهانداز موتورها، سرعت موتور در هر جهت حرکتی به 256 حالت مختلف تقسیم میشود. در واقع اگر به درایور موتورها، سیگنال PWM با چرخه کاری کامل (255) وارد شود، ربات با حداکثر سرعت به سمت جلو حرکت میکند و در صورت قرار دادن عدد 255- در ورودی هر کدام از درایورها، موتور در جهت عکس با حداکثر سرعت حرکت میکند.
نحوه ی گرفتن اطلاعات از سنسورها:
قبل از هر اقدامی باید بتوان از حالت سنسورها و مقدار ولتاژ خروجی آنها، وضعیت خط و جهت حرکت را مشخص کرد. هر سنسوری که خط را تشخیص دهد مقدار منطقی “یک” و هر سنسوری که زمینهی سفید را تشخیص دهد مقدار منطقی “صفر” را به عنوان خروجی به میکروکنترلر بر می گرداند. در نتیجه با قرائت مقدار منطقی سنسورها و بررسی آنها در پردازنده می توان به این که خط دقیقا در چه محلی قرار دارد پی برد.
حال برای تشخیص جهت حرکت، باید سنسورها را اولویت بندی کرد که اگر همزمان چند سنسور مقدار خروجی یک را برگرداندند بتوان با تشخیص اولویت، جهت حرکت اصلی را معین نمود. در حالت کلی سنسور مرکزی که مسئولیت حرکت رو به جلوی ربات را در صورت تشخیص خط بر عهده دارد، از بالاترین اولویت برخوردار است. هر چه از این سنسور به اطراف متمایل شویم، اولویت سنسور ها پایین تر می آید و در نهایت دو سنسوری که در منتهی الیه سمت چپ و راست قرار دارند، کمترین اولویت ها را به خود اختصاص می دهند.
مفهوم این اولویت بندی خودش را در عمل به این صورت نشان می دهد که اگر خط توسط چند سنسور مشاهده شود، حرکت ربات به سمت سنسوری است که خط را مشاهده کرده و به سنسور میانی نزدیکتر است. پس از تشخیص دادن جهت حرکت، موتور ها بسته به این که کدام سنسور خط را مشاهده کرده با سرعت و جهت گردش معینی، به گردش در میآیند و مسیر حرکت را اصلاح می کنند.
استفاده از کنترلر PID:
پیش فرض ما در این قسمت این است که حالت ابتدایی ربات حرکت رو به جلو و در مسیر مستقیم است و در این حالت خطای انحراف ربات از مسیر صفر در نظر گرفته می شود. تحت این شرایط به هر سنسور بر حسب فاصله از سنسور مرکزی شمارهای داده می شود که بیانگر میزان خطا است. برای تمیز قائل شدن بین شماره سنسور های سمت چپ و راست، شماره سنسورهای سمت چپ را منفی شمارهی سنسورهای متناظر در سمت راست در نظر می گیریم تا مقدار قرائت شده مقدار یکتا و قابل تشخیصی برای تحلیل باشد.
در حالت کلی معادله ی کنترلر PIDرا به صورت زیر در نظر می گیریم:
سرعت موتور = ضریب انتگرال×انتگرال خطا + ضریب مشتق×مشتق خطا + ضریب خطا×مقدار خطا + ثابت کل
U(t)= Kp×e(t) + Kd × e'(t) + Ki ×∫e(t) + c
روشهای متعددی برای تعیین مقادیر مقبولی از بهرههای PID وجود دارد. فرایند تعیین بهره را معمولا تنظیم PID میگویند. روش معمول در تنظیم، استفاده از راهنمای تنظیم PID است که به وسیلهی آن بهرههای کنترلر توسط روش سعی و خطا با مختصری تحلیل به دست میآید.
روشی تحلیلیتر نیز به نام روش زیگلر- نیکولز نیز وجود دارد که خود آن نیز دارای چندین حالت است. یکی از این روشهای تنظیم دستی به این گونه است که ابتدا Ki و Kd را برابر با صفر قرار میدهیم و سپس Kp را به تدریج زیاد میکنیم تا ربات شروع به نوسان کند و در لبهی ناپایداری قرار بگیرد.(اگر ربات را از گوشهایترین سنسور سمت چپ بر روی خط قرار دهیم، بچرخد و به طرف گوشهایترین سنسور سمت راست برود و دوباره برگردد و این کار را به دفعات انجام دهد.) به محض پیدا شدن Kp مورد نظر (با Ki=0, Kd=0) و آمدن ربات در مرز ناپایداری، Kp را به مقداری که به آن یک چهارم دامنهی میرا میگویند کاهش میدهیم. یعنی دامنهای از انحراف ربات که یک چهارم انحراف آن در مرز ناپایداری ربات است. یک مقداری حدودی برای این Kp حدود نصف Kp دامنه میرا است. در نهایت Kd و Ki را تا رسیدن به حرکت مطلوب ربات افزایش دهیم.
در استفاده از این روش برای ربات مورد نظر مشکلی وجود داشت و این بود که هر چقدر هم که ضریب Kd را اضافه کنیم ربات در سرعت نامی خود به مرز ناپایداری نمیرسد. به دلیل اینکه حداکثر ورودی گرفته شده توسط درایور که به مفهوم چرخهی کاری 100 % است، عدد 255 بوده و در نتیجه قرار گرفتن بیشتر از این مقدار پس از ضرب مشتق خطا در ضریب آن در درایور موتور به همان عدد 255 معنا میشود. لذا این روش برای این ربات تقریبا ناکارآمد بوده و از همان روش سعی و خطا با توضیحات زیر استفاده شد.
نحوهی محاسبهی ثابت کنترلر:
ربات طراحی شده باید بتواند فقط با بخش نسبی کنترلر، مسیر را به طور تقریبی و با خطای قابل ملاحظهای طی کند. بدین منظور باید ضرایب و ثابت های مربوط به این بخش را بیابیم که در ادامه نحوهی انجام این کار مشخص می شود. همانطور که گفته شد سرعت هر موتور با یک عدد هشت بیتی متناظر قرار داده می شود و به حداقل سرعت موتور صفر و به حداکثر آن ۲۵۵را اختصاص می دهیم. زمانی که سنسور جلو خط را تشخیص می دهد و خطا برابر صفر است و ربات باید با حداکثر سرعت به سمت جلو حرکت کند، در نتیجه به هر دو موتور باید حداکثر سرعت (ورودی ۲۵۵) اختصاص داده شود. پس در این حالت ثابت بخش P ربات برابر ۲۵۵ برای هر دو موتور است.
نحوهی محاسبهی ضریب نسبی:
ضریب خطا باید بتواند در صورتی که آخرین سنسور در گوشه ی سمت راست یا چپ، خط را تشخیص داد، با حداکثر سرعت به صورت معکوس موتور متناظر را بگرداند تا روبات با سریعترین حالت ممکن خطا را اصلاح کند و در مسیر صحیح قرار گیرد. به عنوان مثال اگر بیست سنسور قرار داده شده باشند که ده تای آنها سمت چپ و ده تا در سمت راست صفحهی زیرین ربات نصب شده باشند، ضریب تناسبی خطا باید به نحوی انتخاب شود که در صورتی که خط توسط آخرین سنسور ها مشاهده شد، سرعت موتور از ۲۵۵- به 255+ تغییر کند. در واقع حاصل ضرب ضریب خطا در خود خطا باید برابر یا بزرگتر از ۵۱۲ بشود. می توان این مطلب را به این صورت بیان کرد که ضریب تناسب خطا برابر 10/512یعنی عدد ۵۲ باشد. علت گرد کردن به بالا هم این است که باید کل محدوده پوشش داده بشود و در صورت گرد کردن به پایین مقداری خطا به وجود خواهد آمد.
نحوهی محاسبهی ضریب انتگرال:
بخش انتگرالگیر کنترلر به میزان کمی در این طراحی استفاده شده چرا که بیشتر تاثیر مخرب بر عملکرد تصحیح خطای حالت گذرا دارد تا اثر مثبت. این بخش بیشتر برای اصلاح خطا در حالت دائمی به کار می رود که عموما کاربردی در ربات تعقیب خط ندارد چرا که وجود و حرکت ربات بر روی خط کافیست و نیازی به اینکه ربات دقیقا در مرکز مسیر باشد، وجود ندارد. برای مثالی از زمان نیاز به بخش انتگرالی کنترلر، شرایطی که ربات در مسیر مستقیم حرکت می کند و به پیچ تندی می رسد را در نظر بگیریم. تا قبل از ورود به پیچ چون سنسور وسط، در حال دیدن خط است، خطا صفر است و بنابراین انتگرال خطا تا آن لحظه مقدار صفر دارد ولی هنگامی که ربات به پیچ می رسد با افزایش خطا مقدار خطا نیز شروع به افزایش می کند.در این شرایط مقدار انتگرال خطا به مراتب بیشتر از مقدار خود خطا می شود. بنابراین برای گنجاندن Kiدر معادله، مقدار آن باید بسیار کمتر از دو ضریب Kdو Kp باشد. در نتیجه در ابتدای چرخش ربات، ضریب انتگرال، کمکی به حرکت ربات نمی کند ولی بعد از مدت کوتاهی که مقدار انتگرال خطا زیاد می شود و ربات هم در حال چرخش است، بخش انتگرالی به چرخش ربات، توان بسیار بالایی می دهد. این توان بالا سبب پیچیدن بیش از حد ربات شده و خطا را مجددا افزایش می دهد و باعث می شود روبات نتواند بعد از رسیدن به خط صاف، در همان مسیر مستقیم ادامه دهد، در نتیجه مدت زمان نشست ربات در محدودهی کوچکی از مسیر درست را افزایش میدهد. به دلیل همین موضوع برای ضریب انتگرال خطا در کنترلر مقدار کمی (0.0001) در نظر گرفته شده است و کنترلر تقریبا به شکل PD عمل میکند. علت این امر که ضریب خطای انتگرال را کاملا حذف نکردیم این بود که در طی حرکت ربات در مکانهای خاصی که زمین لیز است یا به دلیل وجود موانع، ربات نمیتواند درست بپیچد و نیاز به حرکت و چرخیدن تندتری دارد که خطای حالت دائمی را از بین ببرد، وجود ضریب انتگرال حیاتی است. به عنوان مثال وقتی ربات در محلی گیر میکند و نمیتواند بپیچد نیاز به حرکت دور در جا دارد. در این شرایط اگر خط تقریبا در مسیر مستقیم ربات قرار داشته باشد، در لحظات ابتدایی این اتفاق، ربات همچنان دستور به حرکت رو به جلو میدهد، ولی در ادامه هر مقدار که زمان میگذرد انتگرال خطا بیشتر شده (به سمت بینهایت میرود) و حرکت ربات به گردش کامل میانجامد.
نحوهی محاسبه مشتق خطا :
به دلیل اینکه دادههای ورودی به پردازشگر یک سری اطلاعات گسسته هستند که در هر 1ms نمونه برداری میشوند، برای به دست آوردن مشتق نمونهها باید از تفریق متوالی دو نمونه آخر استفاده کرد (Backward). با توجه به سرعت بالای نمونهبرداری نسبت به لختی موتورها، مقدار مشتق عموما صفر میشود چرا که مدت زمانی که سنسور شمارهn ، خط سیاه را میبیند حدود 100 نمونه گرفته میشود و در نتیجه تفریق این نمونهها که همه مقدار مساوی n را دارند به صفر میانجامد و در نتیجه بخش مشتق کنترلر بی تاثیر خواهد بود. برای حل مشکل اینطور عمل کردیم که وقتی دو سمپل آخر شبیه یکدیگرند عملیات تفریق و محاسبهی مشتق انجام نمیشود و مقدار متغیری که اندازهی مشتق را نگاه میدارد تغییر نمیکند. البته این موضوع نباید برای سنسور میانی که در آن میزان خطا صفر است لحاظ شود و در شرایطی که دو نمونهی آخر برابر با سنسور میانی باشند، مقدار مشتق برابر صفر خواهد شد.
پس از اتمام این بخش و به دست آوردن ضرایب کنترلر، ربات را بر روی مسیر قرار دادیم و سعی کردیم با افزایش و کاهش اعداد به دست آمده، حرکت ربات را بهینه کنیم. نتایج به این گونه شد که پس از تست مجبور شدیم در ابتدا ضریب مشتق را برای عملکرد بهتر در بازگشت به مسیر اصلی زیاد کرده و در ادامه برای سرعت بیشتر در دور زدن، کمی ضریب نسبی را هم بالا ببریم.
در جدول زیر به طور کلی اثر افزایش بهرههای PID در پاسخ حرکتی ربات نشان داده شده است.

منبع:utmechatronics.ir