جستجو
برای جستجو متن مورد نظر وارد کنید و Enter بزنید برای بستن Esc بزنید.
با وجود پیشرفت ساخت صفحات (touch) لمسی در بسیاری از پروژه ها به علت افزایش قیمت محصول نمی توان از صفحات لمسی استفاده نمود زیرا این صفحات به تنهایی قابلیت استفاده را ندارند و نیازمند یک نمایشگر در کنار خود هستند.
و از طرفی در بسیاری از پروژه ها نیاز به کلید برای انتخاب کردن یا تعیین وضعیت دستگاه توسط کاربر حیاتی می باشد. بنابراین انواع مختلفی از کلیدها با اندازه و مدل های مختلف موجود می باشد که انتخاب کلید مناسب برای راحتی کار کردن توسط کاربر امری مهم می باشد.
در اینجا به معرفی کلید روتاری می پردازیم , روتاری یک کلید چرخشی بدون محدودیت در تعداد چرخش می باشد و این حالت چرخش دوطرفه (از راست به چپ و بالعکس) با زاویه چرخش بی نهایت ان را گزینه ای عالی در پروژه هایی که کاربر باید بین منوهای طراحی شده دستگاه جابجا شود یا بین محدوده ای از گزینه ها یکی را انتخاب نماید می کند.
حال فرض کنیم که برای بالا و پایین شدن ایتم های یک منو در نمایشگر از دو میکروسوئیچ استفاده نماییم در اینصورت کاربر نیاز دارد در حین کار و جابجایی بین ایتم های منو از دو کلید مجزا استفاده نماید که در صورت طولانی بودن ایتم ها اذیت کننده خواهد شد.مشکل بعدی نیاز به Debounce (حذف اثر لرزش کلید) کردن کلیدها می باشد.
یا مثلا اگر قرار بود از پتانسیومتر یا ولوم برای انتخاب بین ایتم ها استفاده می کردیم یک مشکل بزرگ به وجود می امد و علتش این است در صورت ریست میکروکنترلر یا اتصال مجدد تغذیه ان پتانسیومتر یا ولوم در وضعیت قبلی خود باقی خواهند ماند در صورتی که میکروکنترلر بعد از راه اندازی می خواهد اولین ایتم منو را نمایش بدهد.
یا در مثالی دیگر برای کنترل حجم صدای یک دستگاه (در صورتی که صوت توسط میکروکنترلر یا یک ایسی با رابط دیجیتال تولید می شود) در اینصورت برای کنترل دقیق حجم صدا بر روی 50 درصد باید با دقت کاربر پتانسیومتر را در مرکز خود قرار دهد.
ماژول های روتاری در مدل 4 پایه و 5 پایه هستند که در مدل 5 پایه یک کلید فشاری وجود دارد که پایه ان لحاظ شده است.
و دو پایه تغذیه مثبت و زمین وجود دارد که باید به ولتاژ 5 ولت و زمین مدار متصل شوند.
دو پایه مهم CLOCK و DATA که وضعیت چرخش روتاری را مشخص می کنند و در حالت عادی در وضعیت یک منطقی قرار دارند و باید به پایه های ورودی میکروکنترلر متصل شوند.
در تصویر زیر نمونه ای از ترتیب پایه های یک ماژول روتاری را مشاهده می نمایید.
در صورت چرخش روتاری پایه های دیتا و کلاک 90 درجه با هم اختلاف فاز دارند و از روی همین اختلاف فاز می توان جهت چرخش را فهمید.
در ادامه برنامه راه اندازی ماژول روتاری در اردوینو را توضیح می دهیم :
#define C 2
پایه کلاک ماژول متصل به پایه شماره 2 که شما می توانید از هر پایه ی دیگر استفاده نمایید.
#define D 3
پایه دیتا ماژول متصل به پایه شماره 3 که شما می توانید از هر پایه ی دیگر استفاده نمایید.
void setup() {
pinMode(C, INPUT_PULLUP);
pinMode(D, INPUT_PULLUP);
قرار دادن پایه های مورد نظر در حالت ورودی و همچنین فعال کردن مقاومت pullup داخلی میکروکنترلر تا در صورت خرابی یا مشکل در اتصال روتاری میکروکنترلر در وضعیت اشتباه قرار نگیرد.
Serial.begin(9600);
فعال کردن پورت سریال میکروکنترلر و تنظیم بادریت ان بر روی 9600
Serial.println("Test:");
پرینت کردن عبارت یا جمله دلخواه بر روی پورت سریال
}
void loop() {
خواندن وضعیت پایه ها در حلقه بی نهایت تا جهت چرخش پایه ها را متوجه شویم. در هر جایی از برنامه که کاربر دستگاه باید گزینه ای را انتخاب یا تغییر دهد نیاز به خواندن پایه ها داریم و در اینجا برای تست برنامه ان را در حلقه loop قرار داده ایم.
نکته : پایه های کلاک و دیتای ماژول در حالت عادی در وضعیت یک منطقی هستند.
if((digitalRead(C) == LOW) && (digitalRead(D) == HIGH)) {
اگر پایه کلاک در وضعیت صفر منطقی قرار گرفت و پایه دیتا در وضعیت یک منطقی بود یعنی ابتدا پایه کلاک تغییر کرده است و سپس پایه دیتا به صفر منطقی تغییر حالت می دهد.
while(digitalRead(D) == HIGH);
این حلقه منتظر می ماند تا پایه دیتا نیز به صفر منطقی تغییر حالت دهد (شرط حلقه زمانی شکسته می شود که پایه از یک به صفر منطقی تغییر حالت دهد).در پایین دوباره منتظر می مانیم تا پایه دیتا از حالت صفر منطقی خارج شود و به حالت عادی برگردد.
for(int i = 0; i < 5; i++){
در این حلقه for هر یک میلی ثانیه (به تعداد 5 بار,علت این کار حذف خطا می باشد) وضعیت پایه دیتا را چک می کنیم و تا وقتی در حالت صفر منطقی قرار دارد متوقف می شویم.
delay(1);
while(digitalRead(D) == LOW);
}
در اینجا دیگر منتظر نمانده ایم تا پایه کلاک نیز از صفر منطقی خارج شود و علت این است چون پایه کلاک زودتر از پایه دیتا در حالت صفر منطقی قرار گرفت و با بررسی پایه دیتا حتما پایه کلاک نیز به حالت عادی خود (یک منطقی) برگشته است.
در ادامه متوجه شده ایم که کاربر روتاری را به سمت چپ چرخانده است و طبق نیاز برنامه باید کدهای خود را اعمال نماییم.
Serial.println("Left");
}
عکس این ماجرا برای پایه دیتا اتفاق خواهد افتاد.
else if((digitalRead(C) == HIGH) && (digitalRead(D) == LOW)) {
در صورتی که ابتدا پایه دیتا در حالت صفر منطقی قرار گرفت.
while(digitalRead(C) == HIGH);
منتظر تا وقتی که پایه کلاک به صفر منطقی تغییر وضعیت دهد.
for(int i = 0; i < 5; i++){
منتظر تا وقتی که پایه کلاک در حالت صفر منطقی قرار دارد.
delay(1);
while(digitalRead(C) == LOW);
}
در اینجا حرکت ماژول روتاری به راست را تشخیص داده ایم و طبق نیاز برنامه باید کدهای خود را اعمال نماییم.
Serial.println("Right");
}
}