در این پست از سایت اِمیک, یک پروژه ساده ولی بسیار جالب و کاربردی به نام پروژه AVR تشخیص رنگ سیاه از سفید قرار داده شده است. این پروژه می تواند دو رنگ سیاه و سفید را از یکدیگر تشخیص دهد. در این پروژه از یک جفت سنسور مادون قرمز استفاده شده است که وظیفه تشخیص رنگ سیاه از سفید را دارند.
این پروژه با وجود سادگی بسیار کاربردی می باشد. یکی از کاربردهای این پروژه در ربات های مسیریاب می باشد. به این صورت که ربات خط مشکی را از زمینه سفید تشخیص می دهد و خط را دنبال می کند. یا برعکس خط سفید را از زمینه مشکی می تواند تشخیص دهد.
بنابراین این یک پروژه آموزشی و کاربردی است و در آینده شما می توانید با تغییرات در این پروژه آن را تبدیل به یک پروژه حرفه ای تر و کاربردی تر کنید. در ادامه با این پروژه بیشتر آشنا خواهیم شد و در مورد عملکرد آن بیشتر توضیح خواهم داد. پروژه با استفاده از میکروکنترلر AVR انجام شده است. در زیر شماتیک این پروژه جالب را مشاهده می کنید.

همانطور که مشاهده می کنید, این پروژه شماتیک بسیار ساده ای دارد و در این پروژه از میکروکنترلر ATmega16 استفاده کرده ایم.
در این پروژه ما برای تشخیص رنگ سیاه از سفید از سنسور فرستنده و گیرنده مادون قرمز TCRT5000 استفاده کرده ایم. دو مقاومت R1 و R2 برای راه اندازی این سنسور می باشند. خازن C1 برای حذف نویز و نوسان از روی پین ورودی آنالوگ میکرو (پایه 40) می باشد. دو LED نیز به پایه های 14 و 15 میکرو متصل شده اند. مقاومت های سری با LED ها برای محدود کردن جریان LED ها و جلوگیری از سوختن آنها می باشند.
عملکرد پروژه به این صورت است که وقتی سطح سیاه رنگ جلوی سنسور باشد, LED قرمز روشن می شود. وقتی سطح سفید رنگ جلوی سنسور باشد, LED سبز روشن می شود. وقتی که هیچ سطح یا رنگی جلوی سنسور نباشد هر دو LED خاموش هستند. در انتهای مطلب می توانید کلیپ تست عملی پروژه را مشاهده کنید.
ما در این پروژه به وسیله ADC میکروکنترلر ولتاژ خروجی سنسور را اندازه گیری می کنیم. خروجی سنسور با توجه به اینکه سطح سیاه یا سطح سفید جلوی آن است, دارای ولتاژ متفاوتی می باشد. میکروکنترلر با اندازه گیری این ولتاژ می تواند تشخیص دهد که سطح با چه رنگی جلوی سنسور قرار گرفته و یکی از LED های قرمز یا سبز متصل به پایه های 14 و 15 را روشن کند.
توجه کنید که پایه های تغذیه میکروکنترلر (پایه 10 و 11) را که در شماتیک بالا نیست, فراموش نکنید به تغذیه 5 ولت متصل کنید و همچنین پایه های 30 و 32 میکرو را هم بدلیل استفاده از ADC باید به مثبت تغذیه متصل کنیم.

برنامه کدویژن:
در این پروژه فرکانس میکروکنترلر 1 مگاهرتز تنظیم شده است. در زیر برنامه نوشته شده به زبان C و کامپایلر کدویژن را مشاهده می کنید:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
////////// WWW.EMIC.IR ////////// #include <mega16a.h> #include <delay.h> //ايجاد مي شوند adc که توسط خود کدويژن با فعالسازي adc از خط 5 تا 14 دستورات مربوط به// #define ADC_VREF_TYPE ((0<<REFS1) | (0<<REFS0) | (0<<ADLAR)) unsigned int read_adc(unsigned char adc_input) { ADMUX=adc_input | ADC_VREF_TYPE; delay_us(10); ADCSRA|=(1<<ADSC); while ((ADCSRA & (1<<ADIF))==0); ADCSRA|=(1<<ADIF); return ADCW; } void main(void) { int ADC=0; //تعريف متغير// //ميکرو ورودي شده است A در زير پورت// DDRA=(0<<DDA7) | (0<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0); PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0); //ميکرو براي اتصال به ال اي دي ها خروجي شده اند D در زير پين 6 و 7 از پورت// DDRD=(1<<DDD7) | (1<<DDD6) | (0<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0); PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0); //که با توجه به تنظيمات ما در محيط کدويزارد ايجاد مي شوند adc از خط 30 تا 32 رجيسترهاي مربوط به// // ADC initialization // ADC Clock frequency: 500/000 kHz // ADC Voltage Reference: AREF pin // ADC Auto Trigger Source: ADC Stopped ADMUX=ADC_VREF_TYPE; ADCSRA=(1<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (1<<ADPS0); SFIOR=(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0); while (1) { ADC=read_adc(0); //ADC ميکرو که مي تواند عددي بين 0 تا 1023 باشد و ريختن ان در متغير A خواندن ولتاژ روي پين 0 از پورت// if((0<=ADC)&(ADC<=40)) { //بين 0 تا 40 باشد وارد شرط روبرو مي شويم ADC در صورتي که مقدار متغير// PORTD.6=0; //که ال اي دي قرمز به ان متصل است صفر مي شود D پين 6 از پورت// PORTD.7=0; //که ال اي دي سبز به ان متصل است صفر مي شود D پين 7 از پورت// } if((41<=ADC)&(ADC<=410)) { //بين 41 تا 410 باشد وارد شرط روبرو مي شويم ADC در صورتي که مقدار متغير// PORTD.6=1; //که ال اي دي قرمز به ان متصل است يک مي شود D پين 6 از پورت// PORTD.7=0; //که ال اي دي سبز به ان متصل است صفر مي شود D پين 7 از پورت// } if((411<=ADC)&(ADC<=1023)) { //بين 411 تا 1023 باشد وارد شرط روبرو مي شويم ADC در صورتي که مقدار متغير// PORTD.6=0; //که ال اي دي قرمز به ان متصل است صفر مي شود D پين 6 از پورت// PORTD.7=1; //که ال اي دي سبز به ان متصل است يک مي شود D پين 7 از پورت// } delay_ms(100); //ايجاد 100 ميلي ثانيه تاخير// } } |
توضیحات قسمت های مهم برنامه نوشته شده, اگر سوالی داشتید می توانید در قسمت نظرات مطرح کنید. از انتهای مطلب نیز می توانید فایل برنامه این پروژه با نرم افزار کدویژن را دانلود کنید.
کلیپ تست عملی پروژه :
پسورد فایل زیپ : www.emic.ir
نظر یادتون نره…




