از روتاری انکودرها در تعداد بیشماری از دستگاه های رایج که هر روز میبینیم استفاده میشود. رمزگذارهای چرخشی از آنچه فکر میکنیم به ما نزدیکتر هستند، از چاپگرها و لنزهای عکاسی گرفته تا ماشینهای CNC و روباتیک. به عنوان مثال، بیشترین استفاده از روتاری انکودر در زندگی روزمره، دکمه کنترل صدای رادیوی ماشین است. رمزگذار چرخشی نوعی حسگر موقعیت است که موقعیت زاویه های (چرخش) یک شفت را به سیگنال خروجی تبدیل میکند که از این سیگنال برای تعیین جهت چرخش شفت استفاده میشود.
دو نوع روتاری انکودر وجود دارد: مطلق و افزایشی. روتاری انکودر مطلق، موقعیت دقیق شفت را بر حسب درجه گزارش میکند در حالی که روتاری انکودر افزایشی، تعداد حرکتهای شفت را گزارش میدهد. انکودر چرخشی استفاده شده در این آموزش از نوع افزایشی میباشد.
اجزای مورد نیاز
شما به اجزای زیر نیاز دارید:
- آردوینو UNO اونو × ۱
- روتاری انکودر مدل ky-040 یا مدل 111 × ۱
- برد بورد × ۱
مقایسه روتاری انکودرها و پتانسیومترها
روتاری انکودر را میتوان معادل مدرن پتانسیومتر دیجیتالی دانست. انکودرها نسبت به پتانسیومترها تطبیق پذیرتر هستند. آنها میتوانند بدون توقف 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 دیدگاه