خانه » نحوه کار روتاری انکودر و ارتباط آن با آردوینو
آخرین بروز رسانی: 30 بهمن 1401

نحوه کار روتاری انکودر و ارتباط آن با آردوینو

از روتاری انکودرها در تعداد بی­شماری از دستگاه ­های رایج که هر روز می­بینیم استفاده می­شود. رمزگذارهای چرخشی از آنچه فکر می‌کنیم به ما نزدیک‌تر هستند، از چاپگرها و لنزهای عکاسی گرفته تا ماشین‌های CNC و روباتیک. به عنوان مثال، بیشترین استفاده از روتاری انکودر در زندگی روزمره، دکمه­ کنترل صدای رادیوی ماشین است. رمزگذار چرخشی نوعی حسگر موقعیت است که موقعیت زاویه­ های (چرخش) یک شفت را به سیگنال خروجی تبدیل میکند که از این سیگنال برای تعیین جهت چرخش شفت استفاده می­شود.

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

اجزای مورد نیاز

شما به اجزای زیر نیاز دارید:

مقایسه­ روتاری انکودرها و پتانسیومترها

روتاری انکودر را میتوان معادل مدرن پتانسیومتر دیجیتالی دانست. انکودرها نسبت به پتانسیومترها تطبیق پذیرتر هستند. آنها می­توانند بدون توقف 360 درجه بچرخند در حالی که پتانسیومترها فقط می­توانند به اندازه­ی ۴/۳ دایره بچرخند. پتانسیومترها در شرایطی استفاده می­شوند که هدف، دانستن موقعیت دقیق شفت پتانسیومتر باشد. در حالی که از انکودرهای چرخشی در موقعیت­هایی استفاده می­شود که هدف، تغییر موقعیت بر تشخیص موقعیت دقیق برتری دارد.

روتاری انکودر چگونه کار می کنند؟

داخل انکودر، یک دیسک شیاردار قرار دارد که به پایه­ زمین مشترک C متصل شده ­است. همچنین شامل دو پایه تماس A و B است که در زیر نشان داده شده است.

هنگامی که شفت را می­چرخانید، A و B به ترتیبی خاص با توجه به جهتی که شفت را می­چرخانید، با پایه­ مشترک زمین C  تماس پیدا می­کنند. هنگامی که دو پایه­ی A و B در تماس با زمین مشترک قرار می­گیرند، سیگنال­هایی تولید میکنند که این سیگنال­ها با یکدیگر، به اندازه­ 90 درجه اختلاف فاز دارند. این اختلاف فاز به این علت است که یک پایه قبل از پایه­ دیگر با زمین مشترک تماس پیدا می­کند، این روش کدگذاری مربعی نام دارد.

هنگامی که شفت را در جهت عقربه­های ساعت بچرخانید، پایه­ی A قبل از پایه­ی B به زمین متصل می­شود و هنگامی که شفت را خلاف جهت عقربه­های ساعت بچرخانید، پایه­ی B قبل از پایه­ی A به زمین متصل می­شود.

با ردیابی زمانی که هر پین به زمین متصل یا از زمین جدا می­شود، می­توانید تعیین کنید که شفت در چه جهتی می­چرخد. این کار به سادگی با مشاهده­ وضعیت پایه­ B در زمانی که پایه­ A تغییر حالت می­دهد ممکن است.

وقتی حالت A تغییر می کند:

اگر B != A: شفت در جهت عقربه ­های ساعت چرخانده شده است.

اگر B = A: شفت در خلاف جهت عقربه­های ساعت چرخانده شده است.

پایه­ های روتاری انکودر

پایه ­های روتاری انکودر به شرح زیر است:

GND  پایه­ اتصال به زمین است.

VCC  پایه­ ولتاژ تغذیه مثبت است که معمولاً بین 3.3 – 5 ولت است.

SW  پایه­ خروجی دکمه (فعال در حالت low) است. هنگامی که دکمه فشار داده می­شود، ولتاژ در حالت low قرار می­گیرد.

DT (خروجی B) مشابه خروجی CLK است، اما با اختلاف فاز 90 درجه از CLK عقب است. این خروجی برای تعیین جهت چرخش استفاده می­شود.

CLK (خروجی A) پالس خروجی اولیه، برای تعیین میزان چرخش است. هر بار که شفت در هر جهت، حتی به اندازه­ی یک کلیک چرخانده ­شود، خروجی “CLK” یک چرخه­ بالارونده (HIGH) و سپس پایین­ رونده(LOW) را طی می­کند.

اتصالروتاری انکودر به آردوینو

اکنون که همه چیز را در مورد رمزگذار چرخشی می­دانیم، زمان استفاده از آن فرا رسیده است! بیایید روتاری انکودر را به آردوینو وصل کنیم. اتصالات بسیار ساده هستند. با اتصال پایه­ +V ­به پایه­ ۵ ولت ماژول  آردوینو و پایه GND به زمین شروع کنید. حالا پایه ­های CLK و DT را به ترتیب به پایه­ های دیجیتال #2 و #3 وصل کنید. در آخر پایه SW را به پایه دیجیتال شماره 4 وصل کنید. تصویر زیر اتصالات نهایی را نشان می­دهد.

کد آردوینو خواندن مقدار روتاری انکودر

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

اگر دستورات را درست وارد کرده باشید باید خروجی­ های مشابه با خروجی زیر را در مانیتور سریال خود مشاهده کنید.

اگر جهت چرخش نشان داده شده در مانیتور خروجی برعکس آن چیزی است که انتظار داشتید، جای پایه­های CLK (خروجی A) و DT (خروجی B) را جابه­جا کنید.

توضیح کد:

دستورات با تعریف آن پایه‌هایی از آردوینو که پایه‌های CLK، DT و SW انکودر به آن‌ها متصل هستند، آغاز می‌شود.

پس از این دستورات، در خطوط بعدی، چند عدد صحیح تعریف شده­اند.

  • متغیر counter هر بار که شفت یک بار چرخانده می­شود، شمارش را انجام می­دهد و مقدارش تغییر می­کند.
  • متغیرهای currentStateCLK و lastStateCLK وضعیت خروجی CLK را در خود ذخیره میکنند و برای تعیین میزان چرخش استفاده می­شوند.
  • رشته­ای به نام currentDir برای چاپ جهت چرخش فعلی بر روی نمایشگر سریال استفاده می­شود.
  • متغیر lastButtonPress برای decounce سوییچ(دکمه) استفاده می­شود.

در قسمت setup ابتدا اتصالات انکودر چرخشی را به عنوان ورودی پیکربندی می­کنیم، سپس مقاومت pullup ورودی را روی پایه­ی SW فعال می­کنیم. همچنین مانیتور سریال را راه اندازی کردیم. در نهایت مقدار فعلی پین CLK را می­خوانیم و آن را در متغیر lastStateCLK ذخیره می­کنیم.

در قسمت تکرار برنامه، مجددا وضعیت CLK را بررسی کرده و با مقدار lastStateCLK مقایسه می­کنیم. اگر مقدار این دو متغیر متفاوت باشند به این معنی است که شفت چرخیده است. همچنین برای واکنش به یک تغییر حالت و جلوگیری از شمارش مضاعف، مقدار متغیرcurrentStateCLK  را بررسی مینماییم تا متوجه شویم که برابر با ۱ است یا خیر.

در داخل دستور if، جهت چرخش را بررسی می­کنیم. برای انجام این کار به سادگی با خواندن پایه­ی DT  و مقایسه­ی آن با وضعیت فعلی پایه­ی CLK می­توان جهت چرخش را متوجه شد.

  • اگر این دو مقدار خوانده شده متفاوت باشند، به این معنی است که شفت در خلاف جهت عقربه های ساعت چرخانده شده است. پس مقدار متغییر counter را کاهش داده و currentDir را برابر با “CCW” قرار می­دهیم.
  • اگر این دو مقدار برابر باشند، به این معنی است که شفت در جهت عقربه ­های ساعت چرخیده است. پس مقدار متغییر counter را افزایش داده و currentDir را برابر با “CW” قرار می­دهیم.

سپس نتایج را با استفاده از دستورات زیر، روی مانیتور سریال چاپ می­کنیم.

خارج از دستور if، مقدار متغییر lastStateCLK را با توجه به وضعیت فعلی CLK به روز می­کنیم.

در ادامه بایستی منطق خواندن و نویز گیری از فشردن دکمه (debouncing) را در دستورات بیاوریم. ابتدا وضعیت فعلی دکمه را می­خوانیم، هرگاه در حالت Low قرار گرفت، 50 میلی­ ثانیه صبر می­کنیم، این کار به منظور debouncing دکمه می­باشد.

اگر دکمه برای بیش از 50 میلی ثانیه در حالت LOW باقی بماند، به این معنی است که دکمه واقعا فشرده شده است. بنابراین پیام “Button pressed!” را روی مانیتور سریال نمایش می­دهیم.

کد آردوینو استفاده از وقفه

برای اینکه انکودر چرخشی کار کند، باید به طور مداوم تغییرات سیگنال­های DT و CLK را بررسی کنیم.

یکی از راه‌های اطلاع از زمان وقوع این تغییرات، پایش مداوم آن‌ها است (مانند دستورات مثال قبلی). با این حال، این راه حل پیشنهاد نمی­شود، زیرا:

  • ار آنجا که باید به بررسی مداوم مقادیر فوق بپردازیم تا متوجه تغییر مقدار متغیر ها شویم؛ اگر سطح سیگنال تغییر نکند، سایر دستورات موجود در کد به درستی اجرا نمی­شوند و برنامه در حلقه­ی چک کردن مداوم متغییرها گیر می­کند.
  • از زمانی که رویداد رخ می­دهد تا زمانی که به بررسی سیگنالها بپردازیم تاخیر وجود خواهد داشت و اگر در این زمان نیاز به واکنش سریع داشته باشیم، این واکنش به تأخیر می­افتد.
  • اگر فاصله­ی زمانی بین تغییرات سیگنال­ها کوتاه باشد، ممکن است یک تغییر حالت سیگنال را به طور کامل از دست بدهیم.

یک راه حل مناسب برای این مشکل، استفاده از وقفه است.

با وقفه­ها، نیازی به بررسی مداوم رویدادها نداریم. در این روش میکروکنترلر میتواند آزادانه به انجام سایر دستورات برسد.

نحوه­ی اتصال به آردوینو

از آنجایی که اکثر بردهای آردوینو(از جمله آردوینو UNO) فقط دو وقفه­ی خارجی دارند، فقط می‌توانیم تغییرات سیگنال‌های DT و CLK را به طور مداوم بررسی کنیم. بنابراین در اتصالاتی که قبل­تر آورده شد، پین SW را جدا کنید.

بنابراین، اکنون برای استفاده از وقفه، باید اتصالات را به شکل زیر تغییر دهیم:

برخی از بردها (مانند آردوینوMega 2560 ) وقفه­های خارجی بیشتری دارند. اگر یکی از این بردها را دارید، می‌توانید اتصال پین SW نگه دارید و دستورات زیر را برای بررسی دکمه به آن اضافه نمایید.

کد آردوینو

در اینجا کد مربوط به نحوه­ی خواندن انکودر چرخشی با استفاده از وقفه آورده شده است.

توجه داشته باشید که حلقه­ اصلی این برنامه خالی است، بنابراین آردوینو مشغول انجام هیچ کاری نخواهد بود. حالا سعی کنید شفت را بچرخانید. در نهایت خروجی­ای شبیه خروجی زیر را در مانیتور سریال خواهید دید.

توضیح کد:

این برنامه پین دیجیتال 2 (مرتبط با وقفه 0) و پین دیجیتال 3 (مرتبط با وقفه 1) را برای متوجه شدن تغییر این مقادیر بررسی می­کند.این اتفاق زمانی رخ می­دهد که شفت را می چرخانید، به عبارت دیگر، با این کار میکروکنترلر به دنبال تغییر ولتاژ از HIGH به LOW یا LOW به HIGH است .

هنگامی که تغییری رخ می­دهد، در حقیقت وقفه­ای رخ داده است؛ پس تابع updateEncoder()(معروف به روال سرویس وقفه یا ISR ) فراخوانی می­شود. دستورات داخل این تابع اجرا می­شوند و سپس برنامه به همان کاری که قبلا انجام می­داد برمی­گردد.

وظیفه­ی انجام این عملیات بر عهده­ی دو خط دستور زیر می­باشد. تابع attachInterrupt() به آردوینو می­گوید که کدام پین را مانیتور کند، کدام ISR را در هنگام راه اندازی وقفه اجرا کند و به دنبال چه نوع تحریکی(trigger) باشد.

کنترل موتور سروو با رمزگذار چرخشی

برای پروژه­ی بعدی از یک رمزگذار چرخشی برای کنترل موقعیت یک موتور سروو استفاده خواهیم کرد. این پروژه میتواند در بسیاری از کاربردها مفید باشد، به عنوان مثال، اگر می­خواهید با یک بازوی رباتیک کار کنید، به شما کمک میکند تا به طور دقیق موقعیت بازو و دسته آن را تعیین کنید.

نحوه­ی اتصال موتور سروو به آردوینو

بیایید یک موتور سروو به پروژه خود اضافه کنیم. سیم قرمز موتور سروو را به منبع 5 ولت خارجی، سیم سیاه/قهوه ­ای را به زمین و سیم نارنجی/زرد را به پین 9 فعال PWM وصل کنید. البته می­توانید از خروجی 5 ولت آردوینو نیز استفاده کنید، اما توجه داشته باشید که سروو ممکن است در خط 5 ولت، نویز الکتریکی ایجاد کند که ممکن است به برد آردوینوی شما آسیب برساند. بنابراین توصیه می­شود که از منبع تغذیه­ خارجی استفاده کنید.

کد آردوینو

در اینجا دستوراتی برای کنترل دقیق سروو موتور با رمزگذار چرخشی ارائه شده است. هر بار که شفت به اندازه­ی یک کلیک بچرخد، موقعیت بازوی سروو یک درجه تغییر می­کند.

توضیح کد:

اگر این کد را با دستورات مثالی که در بالا آورده شد مقایسه کنید، به جز چند مورد تفاوت، شباهت­های زیادی خواهید دید. در ابتدا کتابخانه­ از پیش آماده شده­ سروو آردوینو را اضافه می­کنیم و یک شی سروو برای نمایش موتور سروو خود ایجاد می­کنیم.

در تنظیمات، شی سروو را به پایه 9 (که پایه کنترل سروو موتور به آن متصل است) وصل می­کنیم.

در حلقه، شمارنده را به محدوده 0 تا 179 محدود می­کنیم، زیرا یک سروو موتور فقط مقداری بین این محدوده را می پذیرد.

در نهایت از مقدار شمارنده برای تعیین موقعیت سروو موتور استفاده می شود.

دسته‌بندی: آموزش آردوینو

مقالات مرتبط رو حتما ببینید

نظر شما برای ما با ارزشه

0 دیدگاه