در این سری از آموزش های آردوینو نحوه استفاده از روتاری انکودر (Rotary Encoder) و اتصال آن به برد آردوینو را آموزش داده ایم. روتاری انکودر یک وسیله الکترومکانیکی است که موقیعت زاویه ای حرکت یک شفت و یا محور را به کد آنالوگ و یا دیجیتال تبدیل می کند. در اتوماسیون صنعتی از این وسیله که به عنوان یک سنسور رمزگذار چرخشی دوار معرفی شده است؛ به عنوان یک سنسور تشخیص زاویه، سرعت، طول، موقیعت و شتاب به کار می رود.
روتاری انکودر Rotary Encoder
روتاری انکودر؛ دارای دو نوع مطلق و نسبی (افزایشی) می باشد. خروجی انکودر مطلق نشان دهنده موقیعت شفت است، که به طور دائم موقعیت را به عنوان یک پیغام دیجیتالی 0 و 1 گزارش می دهد. خروجی انکودر افزایشی اطلاعات مربوط به حرکت شفت در هر زمان را به صورت سرعت، فاصله و موقیعت پردازش نشان می دهد.
ساختار روتاری انکودر افزایشی
انکودر افزایشی یک سنسور رمزگذار چرخشی است که وظیفه آن هم تعیین مقدار جابه جایی شفت و کنترل زاویه (جهت چرخش) می باشد. این انکودر دو موج مربعی که اختلاف فاز هر کدام 90 درجه هستند، تولید می کند. معمولا دو موج مربعی با کانال A و B مشخص می شوند همانند شکل زیر:
به طور کلی تشخیص جهت راست و جهت چپ در برنامه SCM بسیار دشوار است. با این حال برای تعیین جهت چرخش چپ و راست با استفاده از اسیلسکوپ به راحتی می توانیم تفاوت فاز بین دو سیگنال خروجی را مشاهده کنیم. زمانی که کلید در جهت عقربه های ساعت چرخانده شود، هر دو کانال (سیگنال) A و B در حالت 1 قرار میگیرند. اگر کلید در جهت خلاف عقربه های ساعت چرخانده شود هر دو کانال A و B در حالت 0 قرار می گیرند.
توضیحات در مورد سنسور روتاری انکودر و نحوه اتصال مدار
انکودر دارای سه پایه B, C و A و دو عدد سوئیچ داخلی همانند شکل زیر است. به طوری که یکی ازسوئیچ ها، پین A را به پین C وصل و سوئیچ دیگر پین B را به C اتصال می دهد. در صورتی که هر دو سوئیچ در حالت بسته باشند، چرخاندن انکودر در جهت عقربه های ساعت یا در خلاف عقربه های ساعت باعث باز شدن سوئیچ ها می شود و اگر هر دو سوئیچ در حالت باز باشند، چرخاندن انکودر در جهت و یا خلاف جهت عقربه های ساعت، باعث بسته شدن سوئیچ ها می شود.
دانلود دیتا شیت Rotary Encoder
لیست قطعات مورد نیاز
برد آردوینو Arduino UNO R3 مدل DIP | 1 عدد |
ماژول روتاری انکودر سوئیچ دار مدل KY-040 | 1 عدد |
برد بورد (پروجکت برد) مدل GL | 1 عدد |
سیم جامپر برد بوردی مدل دو سر نری (سری 40تایی) | 1 عدد |
نحوه اتصال ماژول به برد آردوینو
به راحتی و با توجه به شکل ابتدا پین های منفی و مثبت انکودر را به پایه های +5ولت و زمین آردوینو متصل کنید. سپس پین های CLK و DT را بترتیب به پایه های دیجتال شماره 2 و 3 برد آردوینو اتصال دهید. و پین SW ماژول را به شماره پایه 4 آردوینو متصل کنید.
برنامه نویسی پروژه
قبل از برنامه نویسی در نرم افزار آردوینو ابتدا کتابخانه Rotary Encoder را از لینک زیر دانلود نموده و طبق توضیحات زیر، آن را به زیرمجموعه های کتابخانه خود در نرم افزار آردوینو اضافه کنید.
دانلود کتابخانه Rotary Encoder
نصب کتابخانه روتاری انکودر
لازم به ذکر است که نرم افزار برنامه نویسی آردوینو به صورت پیش فرض توانایی پشتیبانی از Rotary Encoder را ندارد بنابراین ما باید library (کتابخانه یا برنامه) مورد نیاز را بر روی آن نصب کنیم. این فرآیند بسیار ساده و راحت است که در زیر نحوه استفاده از آن را توضیح داده ایم.
1. در مرحله اول ابتدا آخرین (جدیدترین) نسخه کتابخانه (Rotary Encoder) را از لینک فوق دانلود کنید.
2. پس از دانلود فایل، نرم افزار آردوینو را باز کنید.
3. مسیر زیر را دنبال کنید و در پنجره باز شده فایل کتابخانه Rotary Encoder را که قبلا دانلود کرده اید را انتخاب نمائید:
…Sketch > Include Library > Add .ZIP Library
بعد از اتصال قطعات به یکدیگر و نصب کتابخانه، کدهای زیر را در نرم افزار آردوینو کپی نموده سپس به برد آردوینو آپلود کنید.
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 |
const int clkPin= 2; //the clk attach to pin 2 const int dtPin= 3; //the dt pin attach to pin 3 const int swPin= 4 ;//the sw pin attach to pin 4 int encoderVal = 0; void setup() { //set clkPin,dePin,swPin as INPUT pinMode(clkPin, INPUT); pinMode(dtPin, INPUT); pinMode(swPin, INPUT); digitalWrite(swPin, HIGH); Serial.begin(9600); // initialize serial communications at 9600 bps } void loop() { int change = getEncoderTurn();// encoderVal = encoderVal + change; if(digitalRead(swPin) == LOW)//if button pull down { encoderVal = 0; } Serial.println(encoderVal); } int getEncoderTurn(void) { static int oldA = HIGH; //set the oldA as HIGH static int oldB = HIGH; //set the oldB as HIGH int result = 0; int newA = digitalRead(clkPin);//read the value of clkPin to newA int newB = digitalRead(dtPin);//read the value of dtPin to newB if (newA != oldA || newB != oldB) //if the value of clkPin or the dtPin has changed { // something has changed if (oldA == HIGH && newA == LOW) { result = (oldB * 2 - 1); } } oldA = newA; oldB = newB; return result; } |
ویدیوی ضبط شده از نحوه عملکرد پروژه