 تعقيب خط با روبورو
روبورو هستم از دايره جنايي!
برنامه امروز تعقيب گريز روي خط سياه است! ... قرار است با تعقيب خط سياه معماي يک قتل مرموز را حل کنيم! امروز نشان مي دهيم که چرا شرلوک هولمز و پوآرو بايد بياييند و جلوي روبورو لنگ بيندازند!
امروز ميخواهيم با کمک سنسور هاي خط به دنبال يک خط سياه برويم و آن را با سرعت هر چه بيشتر تعقيب کنيم. تعقيب خط يا line tracking يکي از معروف ترين مسابقات روبوتيک دانش آموزي و دانشجويي است. براي اين مسابقه روي يک سطح سفيد خط سياهي کشيده مي شود که در برخي مواضع بريدگي هم دارد و روبات هاي بچه ها بايد خط را با تمام شکستگي ها و بريديدگي هاي آن تا آخر تعقيب کنند و هر کسي که در کمترين زمان اين کار را بکند برنده مي شود! امروز با هم يک برنامه مي نويسيم که روبورو بتواند با کمک آن به دنبال خط برود، هفته بعد هم با هم درباره بورد الکترونيکي روبورو و چيز هايي که روي آن قرار دارد صحبت مي کنيم.
خوب، به نظر شما بايد از کجا شروع کنيم؟ به نظر شما روبورو چطوري مي تواند يک خط را تشخيص دهد؟ بله، با کمک سنسور هاي خط يا LSL و LSR. اما اين دو سنسور مثل باقي سنسور هاي روبورو فقط جواب روشن بودن يا خاموش بودن مي دهند، ما چطوري بفهميم که روي يک خط قرار داريم و چطور حرکت کنيم که هميشه روي خط باقي بمانيم؟
يک راه حل ساده الگوريتم زير است: 1 – شروع 2 – موتور ها خاموش 3 - اگر سنسور خط سمت چپ روي سياه است، آنگاه: موتور سمت راست روشن پايان اگر 4 – اگر سنسور سمت راست روي خط سياه است، آنگاه: موتور سمت چپ روشن پايان اگر 5 – برو به شروع
و ترجمه آن به زبان روبورويي: label: 1 Motor R STOP Motor L STOP IF LSR is ON Motor L DOWN End if IF LSL is ON Motor R DOWN End if goto: 1
خيلي شبيه برنامه تعقيب نور شد نه؟ ... من احساس مي کنم قضيه به اين سادگي ها هم نباشد! اين برنامه را بنويسيد و توي روبورو بريزيد، چه اتفاقي مي افتد؟
ديديد گفتم به اين سادگي ها هم نيست! ... روبورو از جاي خودش تکان نمي خورد... نه؟!
خوب بياييد ببينيم مشکل از کجا است، اين چند مورد را چک کنيم:
1 – آيا سنسور هاي روبورو تنظيم هستند يا نه؟ مي دانيد براي تنظيم کردن سنسور هاي روبورو بايد چه کار بکنيم؟ ... بهه ... نمي دانيد؟! ... پس چطور انتظار داشتيد که روبورو حرکت کند و دنبال نور يا خط برود؟ ... پس بگذاريد اول از همه اين مورد را برايتان کاملا شرح بدهم:
• تنظيم سنسور ها ( به نقل از دفترچه راهنماي روبورو) ... همان طور که در هنگام مونتاژ دستگاه ديديد, روبورو داراي سه جفت سنسور است . يک جفت سنسور کليد مانند که در گوشه هاي چپ و راست روبات قرار دارند و وظيفه آنها تشخيص دادن برخورد روبات با اجسام است . جفت سنسور ديگر سنسورهاي نوري هستند که روي مدار روبات و با اندکي زاويه نسبت به هم نصب شده اند . اين سنسورها قادر به تشخيص نور در دو سمت روبات هستند . آخرين جفت سنسور واقع در زير روبات است که اشعه مادون قرمز را تشخيص ميدهد و از آنجا که مادون قرمز توسط رنگهاي روشن منعکس و توسط رنگهاي تيره جذب ميشود, ميتوانند هر تفاوت رنگي را در زير روبات تشخيص دهند. دقت کنيد که يکي از سه LED زير دستگاه سنسور نيست و بلکه توليد کننده مادون قرمز است!
همان طور که ميدانيد روبورو به روشن يا خاموش بودن اين سنسور ها حساس است، اما سنسور هاي نور و خط نسبت به ميزان نور يا ميزان اشعه مادون قرمز حساس هستند. براي حل اين مشکل شما بايد يک معيار شدت نور و يک معيار شدت مادون قرمز براي روبات مشخص کنيد تا روبات ميزان شدتهاي بالاتر از آنها را به عنوان روشن(ON) و پايين تر را به عنوان خاموش(OFF) در نظر بگيرد. براي تنظيم کردن سنسور هاي نور و خط، دو عدد کليد فشاري کوچک بر روي بورد روبورو تعبيه شده است. يکي در سمت چپ و ديگري در سمت راست جلوي مدار. با فشار دادن اين دکمه ها، LED زرد همان سمت براي مدتي روشن ميشود. طي اين مدت روبورو ميزان شدت نور و شدت مادون قرمزي که روي سنسور هاي همان سمت هستند را تشخيص داده و به عنوان معيار ذخيره ميکند.
کمي پيچيده شد، نه؟... با يک مثال بحث را ادامه ميدهيم. فرض کنيد ميخواهيم روبورو دنبال خط برود، پس بايد بتواند زمينه سياه را از سفيد تشخيص بدهد. براي اين کار سنسور هاي خط را روي رنگ خاکستري (که رنگي بين سياه و سفيد است) قرار ميدهيم و دکمه سنسور ها را فشار ميدهيم. به اين طريق روبورو معيار روشن يا خاموش بودن سنسور ها را رنگ خاکستري در نظر ميگيرد. حالا اگر سنسور هاي خط روبورو روي زمينه سفيد باشند چون از خاکستري روشن تر است، روشن خواهند بود و روي سياه هم خاموش! توجه داشته باشد که کليد سمت چپ، همزمان، هم معيار شدت نور براي سنسور نور سمت چپ، و هم معيار شدت مادن قرمز براي سنسور خط سمت چپ را مشخص ميکند. و به همين ترتيب کليد سمت راست براي سنسور هاي خط و نور سمت راست.
خوب، فکر کنم که توضيحات کامل و مفصلي بود و به نظر مي آيد که مي تواند خيلي از مشکلات ما را حل کند. پس اول از همه بايد سنسور هاي خط روبورو را با کمک آن دو تا دکمه قرمز کوچولوي روي مدار تنظيم کنيم و بعد بياييم به سراغ باقي کارها.
2 – آيا روبوروي شما روي يک سطح سفيد قرار دارد يا روي ابتداي يک خط سياه؟ اگر به برنامه اي که نوشته ايم دقت کنيد مي بينيد که اگر بر روي يک سطح سفيد ايستاده باشيم هيچ اتفاقي براي روبورو نخواهد افتاد چرا که هر دو تا دستور IF که نوشته ايم بي اثر ميشود. بنابراين اين الگوريتم تنها موقعي جواب مي دهد که روبات درست بر روي خط سياه قرار گرفته باشد .... وگرنه همانطور که مي بينيد ميخکوب مي شود توي جاي خودش!
3 – روبات را روي خط سياه گذاشتيد و حرکت نکرد؟ ... ها ها ها .... اين يک فوت کوزه گري است که الان برايتان دليلش را توضيح مي دهم :
(به نقل از دفترچه راهنماي روبورو ) ...نکته آخر در مورد سنسور ها اينکه اگر توجه کرده باشيد در زير روبورو سه LED ديده ميشود که وسطي فرستنده و دو تاي ديگر گيرنده مادون قرمز هستند. هنگامي که موتور ها روشن ميشوند، چون جريان مدار به طرف موتور ها ميرود، توانايي فرستنده مادون قرمز کاهش پيدا ميکند و به همين خاطر ممکن است تنظيمات سنسور هاي خط به هم بخورد و شما نتوانيد از آنها استفاده کنيد. براي رفع اين مشکل، که اغلب روباتهايي که از باتري استفاده ميکنند با آن درگير هستند، يک راه حل پيشنهادي وجود دارد: ميتوانيد موقتا موتور ها را خاموش کنيد، با استفاده از دستور wait ، کمي صبر کنيد و بعد مقدار سنسور ها را بخوانيد و به تصميم گيري بپردازيد، سپس بر اساس تصميمات جديد دوباره موتور ها را روشن کنيد. براي درک بهتر اين موضوع ميتوانيد به برنامه تعقيب خط که در CD روبورو موجود است مراجعه کنيد و آن را با دقت بررسي کنيد.
نتيجه اخلاقي: قبل از نوشتن هر گونه برنامه ابتدا دفترچه راهنما را کاملا مطالعه کنيد!
خوب با توجه به اين توضيحات بياييد يک فکر اساسي بکنيم...
1 – شروع 2 – موتور ها خاموش 3 – به مدت 50 ميلي ثانيه صبر کن 4 – اگر سنسور سمت راست بر روي خط سياه است موتور سمت چپ روشن پايان اگر 5 – اگر سنسور سمت چپ بر روي خط سياه است موتور سمت راست روشن پايان اگر 6 – به مدت 100 ميلي ثانيه صبر کن 7 – برو به 1
ترجمه به زبان روبورويي:
label: 1 Motor R STOP Motor L STOP Wait for 50 MilliSecond IF LSR is ON Motor L DOWN End if IF LSL is ON Motor R DOWN End if Wait for 100 MilliSecond goto: 1
برنامه را توي روبات بريزيد ... چي ؟ باز هم کار نمي کند؟
آها ... اگر گفتيد برنامه ما چه اشکالي دارد؟ گفتيم که " هنگام خواندن سنسور خط بايد موتور ها خاموش باشند" درست است؟ اما حالا به خط شماره 5 الگوريتم نگاه کنيد، اينجا يک دستور اگر داريم که سنسور سمت چپ را ميخواند و بالاي همين دستور هم يک دستور اگر ديگر داريم که توي بلوک شرطي آن يک دستور براي روشن شدن موتور قرار داده ايم! ... بفرما ... مشکل درست همين جا است ... موتور سمت چپ ممکن است پيش از خواندن سنسور سمت چپ روشن شده باشد و تمام کاسه و کوزه هاي ما را به هم ريخته باشد ... بياييد اين بار هم از دستورات رياضي روبورو کمک بگيريم، درس هفته پيش را به خاطر داريد؟
1 – شروع 2 – موتور ها خاموش 3 – به مدت 50 ميلي ثانيه صبر کن 4 – رجيستر R01 = 0 5 – رجيستر R02 = 0 6 – اگر سنسور سمت راست بر روي خط سياه است R01 = 1 پايان اگر 7 – اگر سنسور سمت چپ بر روي خط سياه است R02 = 1 پايان اگر 8 – اگر R01==1 موتور سمت چپ روشن پايان اگر 9 – اگر R02 == 1 موتور سمت راست روشن پايان اگر 10 – به مدت 100 ميلي ثانيه صبر کن 11 – برو به 1
ترجمه به زبان روبورويي اش هم ديگر به عهده خودتان .... اما مطمئن باشيد که اين آخري ديگر کار مي کند! قول مي دهم!
آرمين سنقري (نويسنده مقالات رباتيک سايت تبيان: www.Tebyan.ir)
Asonghori@gmail.com
|