ربات مسیریاب پس فایندر (ساختار ؛ عملکرد و کاربرد ها) رباتیک _ الکترونیک

پژوهشگر و نویسنده: (  افشین رشید )

نکته: ربات مسیریاب نوعی از ربات است که وظیفه اصلی آن تعقیب کردن مسیری به رنگ مثال سیاه در زمینه ای به رنگ متفاوت مشخصی مثال سفید است. یکی از کاربردهای عمده این ربات، حمل ونقل وسایل و کالاهای مختلف در کارخانجات، بیمارستانها، فروشگاهها، کتابخانه ها و ... میباشد.

ربات تعقیب خط تا حدی قادر به انجام وظیفه کتابداری کتابخانه ها میباشد. به این صورت که بعد از دادن کد کتاب، ربات با دنبال کردن مسیری که کد آن را تعیین میکند، به محلی که کتاب در آن قرار گرفته میرود و کتاب را برداشته و به نزد ما میآورد. مثال دیگر کاربرد این نوع ربات در بیمارستان های پیشرفته است، کف بیمارستانهای پیشرفته خط کشی هایی به رنگهای مختلف به منظور هدایت رباتهایی پس فایندر به محل های مختلف مثال رنگ قرمز به اتاق جراحی یا آبی به اتاق زایمان ، وجود دارد. بیمارانی که توانایی حرکت کردن و جا به جا شدن را ندارند و باید از ویلچر استفاده کنند، این ویلچیر نقش ربات تعقیب خط را دارد، و بیمار را از روی مسیر مشخص به محل مطلوب میبرد. الگوریتم مسیر یابی باید طوری نوشته شود تا ربات بتواند هر گونه مسیری را، با هر اندازه پیچ و خم دنبال کند، به طوری که خطای آن مینیمم باشد. تجربه نشان میدهد که بهترین روش برای یافتن و دنبال کردن مسیر، استفاده از 4 سنسور است. البته با استفاده از حداقل 2 سنسور نیز میتوان ربات مسیریاب ساخت، ولی با کم کردن سنسور ضریب اطمینان ربات نیز کاهش مییابد. وظیفه سنسورهای 1 و 2 تشخیص پیچ های مسیر و سنسور 3 مقدار چرخش ربات به جهات مختلف را تعیین میکند.


رباتی که در اینجا تصمیم به توضیح نحوه ساخت آنرا داریم بروی زمینه سفید بدنبال خط مشکی حرکت میکند. میکروکنترلر مورد استفاده در ربات ATmega می باشد. و کدهای برنامه ربات با استفاده از نرم افزار BASCOM ایجاد شده اند.ربات شامل دو موتور در طرفین خود می باشد، که جهت حرکت به جلو هر دو موتور را روشن می کند، زمان دور زدن به چپ موتور سمت چپ خاموش و موتور سمت راست روشن می شود و برای دور زدن به سمت راست موتور سمت راست خاموش و موتور سمت چپ روشن می شود.

 البته موتورهای‌بکار رفته DC موتور بوده و جهت کاهش سرعت و در نتیجه کنترل دقیق تر ربات از موتورهایی با گیربکس سرخود استفاده شده، در صورتی که به این نوع موتور دسترسی ندارید میتوانید از موتورهای اسباب بازی گیربکس دار استفاده کنید، در غیر این صورت بایستی خودتان گیربکس را بسازید دقت داشته باشید که دور نهایی چرخش چرخهای روبات 61 دور بر دقیقه باشد . برای تشخیص مسیر از دو LED پر نور استفاده شده که سطح مسیر حرکت را روشن می کنند و انعکاس نور به فتورزیستورهای قرار گرفته در زیر روبات برخورد میکند. اگر روبات روی خط باشد مقدار نور منعکس شده حداقل بوده و در نتیجه مقدار مقاومت آن افزایش میابد و ولتاژ دو سر آن افزایش می یابد و میکروکنترلر از روی این تغییر ولتاژ متوجه وجود خط می گردد.در غیر این صورت نور منعکس شده زیاد بوده، مقدار مقاومت فتورزییستور کاهش میابد و ولتاژ دوسر آن کاهش میابد. پس همانطور که ذکر شد میکرو کنترلر تغییرات ولتاژ فتورزیستور را احساس میکند. من برای این کار از مبدل های درونی آنالوگ به دیجیتال میکرو استفاده کردم. البته دو عدد فتورزیستور به همراه دو LED جهت تشخیص طرفین مسیر استفاده شده است.

نقشه شماتیک ربات مسیریاب پس فایندر 

برنامه نویسی  ربات مسیریاب پس فایندر در محیط #C یا JAVA 

برنامه نویسی  ربات مسیریاب پس فایندر در محیط #C یا JAVA میتواند شامل چند بخش باشد که آنها را توضیح می دهیم ، خواندن وضعیت از سنسور ها ، تصمیم گیری پردازش اطلاعات ، فرمان دادن به موتور ها میباشد.

خواندن وضعیت از سنسور ها

#include <mega16.h>

#include <delay.h>

// Alphanumeric LCD Module functions

#asm

 .equ __lcd_port=0x15 ;PORTC

#endasm

#include <lcd.h>

// Declare your global variables here

bit bk,j;

void motor(float p1,float p2)

{

 if(p1>=0)OCR1AL=(int)p1;else OCR1AL=-(int)p1;

 if(p2>=0)OCR1BL=(int)p2;else OCR1BL=-(int)p2;

 if(p1>0)

 {

 PORTD.0=1;

 PORTD.1=0;

 }else

 {

 PORTD.0=0;

 PORTD.1=1;

 } 

 if(p2>0)

 {

 PORTD.2=1;

 PORTD.3=0;

 }else

 {

 PORTD.2=0;

 PORTD.3=1;

 }

}

void main(void)

{

// Declare your local variables here

// Input/Output Ports initialization

// Port A initialization


 تصمیم گیری پردازش اطلاعات

// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 

// State7=P State6=P State5=P State4=P State3=P State2=P State1=P State0=P 

PORTA=0xFF;

DDRA=0x00;

// Port B initialization

// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 

// State7=P State6=P State5=P State4=P State3=P State2=P State1=P State0=P 

PORTB=0xFF;

DDRB=0x00;

// Port C initialization

// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 

// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 

PORTC=0x00;

DDRC=0x00;

// Port D initialization

// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out 

Func0=Out 

// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 

PORTD=0x00;

DDRD=0xFF;

// Timer/Counter 0 initialization

// Clock source: System Clock

// Clock value: Timer 0 Stopped

// Mode: Normal top=FFh

// OC0 output: Disconnected

TCCR0=0x00;

TCNT0=0x00;

OCR0=0x00;

// Timer/Counter 1 initialization

// Clock source: System Clock

// Clock value: 31.250 kHz

// Mode: Fast PWM top=00FFh

// OC1A output: Non-Inv.

// OC1B output: Non-Inv.

// Noise Canceler: Off

// Input Capture on Falling Edge

// Timer 1 Overflow Interrupt: Off

// Input Capture Interrupt: Off

// Compare A Match Interrupt: Off

// Compare B Match Interrupt: Off

TCCR1A=0xA1;

TCCR1B=0x0C;

TCNT1H=0x00;

TCNT1L=0x00;

ICR1H=0x00;

ICR1L=0x00;

OCR1AH=0x00;

OCR1AL=0x00;

OCR1BH=0x00;

OCR1BL=0x00;

فرمان دادن به موتور ها

motor(-200*j,200*j);

 lcd_gotoxy(0,1);

 lcd_putsf("Right 60 ");

 delay_ms(300);

 continue;

 }

 if((PINA.5==1&&!bk)||(PINA.5==0&&bk))//MOSTAGHIM

 {

 motor(200*j,200*j);

 lcd_gotoxy(0,1);

 lcd_putsf("Straight");

 delay_ms(10);

 continue;

 }

 if(PINA.4+PINA.3+PINA.2+PINA.1+PINA.0>=2&&PINB.4+P

INB.3+PINB.2+PINB.1+PINB.0>=2)bk=1;else bk=0;

 if((PINB.4==1&&!bk)||(PINB.4==0&&bk))

 {

 motor(200*j,-200*j);

 lcd_gotoxy(0,1);

 lcd_putsf("Left 5 ");

 }

 if((PINB.3==1&&!bk)||(PINB.3==0&&bk))

 {

 motor(200*j,-80*j);

 lcd_gotoxy(0,1);

 lcd_putsf("Left 4 ");

 }

 if((PINB.2==1&&!bk)||(PINB.2==0&&bk))

 {

 motor(200*j,-30*j);

 lcd_gotoxy(0,1);

 lcd_putsf("Left 3 ");

 }

 if((PINB.1==1&&!bk)||(PINB.1==0&&bk))

 {

 motor(200*j,0*j);

 lcd_gotoxy(0,1);

 lcd_putsf("Left 2 ");

 }

 if((PINB.0==1&&!bk)||(PINB.0==0&&bk))

 {

 motor(200*j,30*j);

 lcd_gotoxy(0,1);

 lcd_putsf("Left 1 ");

 }

 if((PINA.0==1&&!bk)||(PINB.0==0&&bk))

 {

نویسنده: (افشین رشید )