در این پست از سایت اِمیک, ماژول جوی استیک (Joystick) دو محوره را با استفاده از میکروکنترلر AVR راه اندازی خواهیم کرد. این ماژول کاربردهای مختلفی دارد و می توان از ان در پروژه های مختلف استفاده کرد, به عنوان مثال در پروژه های رباتیک برای کنترل حرکت ربات, کنترل ماشین های CNC و یا در دسته های بازی و غیره از جوی استیک استفاده می شود. در ادامه با این ماژول بیشتر اشنا خواهیم شد.
ماژول جوی استیک (Joystick) :
ماژول جوی استیک دو محوره قابلیت حرکت در تمام زوایا در راستای محور X , Y را دارد. این ماژول دارای دو خروجی انالوگ برای محورهای X و Y می باشد. در این ماژول از دو پتانسیومتر (یکی برای محور X و یکی برای محور Y) استفاده شده که با تغییر اهرام جوی استیک مقدار انها تغییر می کند و از این طریق می توان تشخیص داد که اهرام جوی استیک در چه جهتی در حال حرکت است. این ماژول علاوه بر دو خروجی انالوگ دارای یک خروجی دیجیتال نیز می باشد که مربوط به خروجی سوئیچ ماژول است. با فشار دادن اهرام جوی استیک, وضعیت خروجی سوئیچ یا کلید فشاری تغییر می کند.

همانطور که در تصویر بالا مشاهده می کنید این ماژول دارای 5 پایه به صورت زیر می باشد:
پایه GND که باید به منفی تغذیه (زمین) متصل شود
پایه 5V+ که به مثبت تغذیه (VCC) متصل می شود
پایه VRx که خروجی انالوگ محور X می باشد
پایه VRy که خروجی انالوگ محور Y می باشد
و پایه SW که خروجی سوئیچ ماژول است
برای راه اندازی ماژول ما باید با استفاده از ADC میکروکنترلر مقدار ولتاژ انالوگ هر دو خروجی VRx و VRy را اندازه گیری کنیم که این ولتاژها متناسب با جهت قرار گیری اهرام جوی استیک می باشند. همانطور که گفته شد با فشار دادن اهرام جوی استیک به سمت داخل یک سوئیچ یا کلید فشاری تغییر وضیعیت می دهد. در حالتی که اهرام فشار داده نشده خروجی سوئیچ (SW) یک منطقی یا HIGH است با فشار دادن اهرام خروجی ان به صفر منطقی یا LOW تغییر وضعیت می دهد.
راه اندازی ماژول جوی استیک با میکروکنترلر AVR :
در پروژه ای که در ادامه مشاهده می کنید ما با استفاده از یک میکروکنترلر AVR جهت حرکت اهرام ماژول جوی استیک را تشخیص داده و بر روی یک LCD کاراکتری نمایش می دهیم. همچنین با فشار دادن سوئیچ ماژول عبارت PUSH بر روی LCD نمایش داده می شود. در انتهای مطلب کلیپ تست پروژه را می توانید مشاهده کنید.

در این پروژه از میکروکنترلر ATmega16 و یک ماژول جوی استیک دو محوره استفاده شده و برای نمایش متن هم از یک ال سی دی کاراکتری 2*16 استفاده شده است. در ادامه شماتیک این پروژه را مشاهده می کنید:

همانطور که مشاهده می کنید پایه SW (سوئیچ) به پین PA0 یا پین 40 میکرو متصل شده و پایه های VRy و VRx نیز به پین های PA1 یا پین 39 و PA2 یا پین 38 از میکروکنترلر متصل شده اند. دقت کنید که حتما پایه های 30 و 32 میکروکنترلر را به دلیل استفاده از ADC به VCC متصل کنید.
پایه های تغذیه میکروکنترلر (پایه های 10 و 11) که در تصویر بالا وجود ندارند را فراموش نکنید به تغذیه 5 ولت متصل کنید. پتانسیومتر RV1 به منظور تنظیم روشنایی یا کنتراست LCD استفاده شده است.
برنامه کدویژن :
در این پروژه فرکانس میکروکنترلر 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 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
////////// WWW.EMIC.IR ////////// #include <mega16a.h> #include <delay.h> #include <alcd.h> //ايجاد مي شوند adc که توسط خود کدويژن با فعالسازي adc از خط 6 تا 15 دستورات مربوط به// #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 X, Y, P ; 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) | (1<<PORTA0); DDRD=(1<<DDD7) | (1<<DDD6) | (1<<DDD5) | (1<<DDD4) | (1<<DDD3) | (1<<DDD2) | (1<<DDD1) | (1<<DDD0); PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0); //که با توجه به تنظيمات ما در محيط کدويزارد ايجاد مي شوند adc از خط 27 تا 29 رجيسترهاي مربوط به// 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); lcd_init(16); while (1) { Y=read_adc(1); //مي ريزد Y دستور روبرو عددي بين 0 تا 1023 که بيانگر مقدار ولتاژ انالوگ روي پين مورد نظر از ميکروکنترلر است را درون متغير// X=read_adc(2); //مي ريزد X دستور روبرو عددي بين 0 تا 1023 که بيانگر مقدار ولتاژ انالوگ روي پين مورد نظر از ميکروکنترلر است را درون متغير// P=PINA.0; //ميکرو A با پين 0 از پورت P برابر قرار دادن متغير// lcd_gotoxy(0,0); //تعريف شده است که با توجه به جهت حرکت جوي استيک يکي از انها اتفاق مي افتد if در زير تعدادي شرط// if((480<=X)&(530>=X)&(480<=Y)&(530>=Y)) { lcd_putsf("WWW.EMIC.IR"); } if((531<=X)&(480<=Y)&(530>=Y)) { lcd_putsf("UP"); } if((X<=479)&(480<=Y)&(530>=Y)) { lcd_putsf("Down"); } if((480<=X)&(530>=X)&(531<=Y)) { lcd_putsf("Right"); } if((480<=X)&(530>=X)&(Y<=479)) { lcd_putsf("Left"); } if((531<=X)&(531<=Y)) { lcd_putsf("UP and Right"); } if((531<=X)&(Y<=479)) { lcd_putsf("UP and Left"); } if((X<=479)&(531<=Y)) { lcd_putsf("Down and Right"); } if((X<=479)&(Y<=479)) { lcd_putsf("Down and Left"); } if(P==0) { lcd_gotoxy(0,1); lcd_putsf("PUSH"); } delay_ms(300); lcd_clear(); } } |
توضیحات قسمت های مهم برنامه نوشته شده, اگر سوالی داشتید می تونید در قسمت نظرات مطرح کنید.
- در صورتی که با دستورات مربوط به نوشتن متن روی LCD کاراکتری و راه اندازی ان اشنا نیستسد این پست را مطالعه کنید.
- در صورتی که با ADC در میکروکنترلر AVR و نحوه راه اندازی ان اشنا نیستید این پست را مطالعه کنید.
کلیپ تست عملی پروژه :
پسورد فایل زیپ : www.emic.ir
نظر یادتون نره …





کتابخانه ماژول جوی استیک رو از کجا میتونم دانلود کنم؟
سلام
نرم افزار پروتئوس ماژول جوی استیک داره ؟
سلام
می شد خط زیر را تضیح دهید؟
if((480=X)&(531<=Y)) {
lcd_putsf("Right");
}
عالییییییییی
واقعا ممنون از سایت خوب و مفیدتون
مطالب بسیار مفید و آموزنده
سایتتون خیلی خوبه برای انتخاب پروژه م خیلی کمک کرد ممنونم
بسیار متشکرم
سلام پروژه خیلی خوبیه .فقط یه توضیح از بدست آوردن اعداد 530و480 واین ها میتونید بدید؟
سلام, ADC میکروکنترلر ولتاژ 0 تا 5 ولت را بصورت عددی بین 0 تا 1023 به ما می دهد و این اعداد بیانگر مقدار ولتاژ انالوگ می باشند مثلا 530 برابر 2.58 ولت می باشد. پست “راه اندازی ADC در میکروکنترلر AVR” را مطالعه کنید فرمول تبدیل اعداد به ولتاژ گفته شده