بله فقط یک بار بیشتر سوییچ نوشته نمی شود .
وقت خوبیه کمی در مورد الگوریتم بحث کنیم .
همانطور که می دونید باید ربات در هر پیچی با یک سرعت خاص حرکت کند . برای مثال در پیچ 90 درجه یک چرخ ربات می ایستد و دیگری حرکت می کند . ولی در پیچ 30 مجبوریم هر دو چرخ را خلاف جهت همدیگر حرکت دهیم .
این ها حالات ساده ای به نظر می رسند . ولی همیشه اینطور نیست که خط زیر سنسور های ما باشد . حتی ممکن است زیر یکی از سنسور ها باشد ولی نفهمیم حالا ربات باید به کدام سمت برود . گاهی هم ممکن است ربات از خط خارج شود . در این حالت ربات باید چه تصمیمی بگیرد ؟
در این مواقع باید تشخیص دهد که به راه راست ادامه دهد ... یا بایستد .... یا دور خودش بچرخد تا خط را بیابد ....
شما اگر خود را جای ربات بگذارید چه می کنید ؟ بهترین کاری که به نظر می رسد این است که چک کنیم آخرین بار کدام سنسور دیده است؟ سنسور سمت راست ؟ اگر سمت راستی آخرین بار دیده باشد پس خط به سمت راست پیچیده و ربات ما وقت نکرده به سمت راست بپیچد و از خط خارج گشته است .
اگر سنسور چپی آخرین بار دیده است . پس خط به سمت چپ رفته و ربات از خط خارج شده است .
برای نوشتن چنین چیزی نیاز به نوشتن الگوریتمی دارد . که بسته به نوع چیدمان سنسور ها دارد . و در واقع بخش اصلی برنامه ربات مسیریاب همین بخش است .
من برای ربات خودم برنامه ای نوشتم که حتی اگر ربات را به زور از خط پرت کنید بیرون دوباره بر میگردد سرجای خود . قسمتی از برنامه الگوریتم رو قرار می دهم . ولی مطمئنا چیزه زیادی از آن متوجه نمی شوید چون چیدمان سنسور های من را دقیقا مطلع نیستید .
فقط توضیح کوتاهی در مورد آن می دهم .
تابعی به نام تشخیص آخرین وضعیت نوشته ام void last_act()
در حالاتیکه خط زیر هیچ کدام از سنسورها نیست این تابع را صدا می زنم .
در هر قسمت از شرط ها (کیس ها) دستوری به شکل var=in; قرار دادم . که مقدار پورت سنسور ها را درون متغیر var قرار می دهد .
سپس با دستور and & تشخیص می دهم که آخرین بار سنسور خط کدام سمت پیچیده است .
کد php:
void last_act()
{
chap= var&0b00110000;
rast= var&0b11000000;
vasat_1=var&0b01110000;
vasat_2=var&0b11100000;
if(vasat_1==0b01110000)
{
OCR1A=50;
OCR1B=50;
left_h();
}
if(vasat_2==0b11100000)
{
OCR1A=50;
OCR1B=50;
right_h();
}
if(vasat_1!=0b01110000 && vasat_2!=0b11100000 ){
if(chap!=0b00000000)
{
OCR1A=50;
OCR1B=50;
left_h();
}
if(rast!=0b00000000)
{
OCR1A=50;
OCR1B=50;
right_h();
}
}
}