انکودر چرخشی: نحوه عملکرد و راه اندازی آن با آردوینو

فهرست مطالب

مقدمه

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

آنچه در این آموزش یاد می گیرید

انکودر چرخشی چیست؟

به زبان ساده انکودر چرخشی وسیله ای الکترومکانیکی است که موقعیت زاویه شفت را به دیتای دیجیتال تبدیل می‌کند. انکودر چرخشی یک صفحه دایره ای دارد که روی آن سوراخ های یکسان و دو کانال A و B تعبیه شده است. با چرخش صفحه دایره ای، هنگامی که کانال A یا B از سوراخ ها عبور می کند اتصالی بین آن کانال و پایه ای مشترک برقرار می شود. این قطع و وصل شدن ها باعث ایجاد موجی مربعی در خروجی کانال می گردد که با شمارش این پالس ها، می‌توانیم میزان چرخش را بیابیم. از طرفی کانال A و B نسبت به یکدیگر 90 درجه اختلاف فاز دارند، پس باتوجه به اینکه پالس کدام کانال جلوتر است می توانیم جهت چرخش را نیز پیدا کنیم.
انکودر می تواند مستقیم برروی شفت موتور نصب شود یا به صورت یک ماژول ساخته شود. ماژول انکودر چرخشی رایج ترین و ساده ترین انکودر چرخشی است که شامل 5 پایه می باشد. دو پایه تغذیه انکودر را تامین می کند، پایه sw یک کلید فشاری روی ماژول است و پایه های CLK و DT کانال های A و B انکودر را نشان می دهند. اما مشخصات این ماژول:
  • قابلیت چرخش تا بینهایت
  • رزولوشن پالس: 20
  • ولتاژ تغذیه: 5 ولت

چگونه از انکودر چرخشی استفاده کنیم؟

برای استفاده از انکودر چرخشی باید تعداد پالس های کانال های A و B را بشماریم، برای این کار از یک آردوینو UNO کمک گرفتیم و با انجام سه پروژه تعیین موقعیت انکودر، کنترل نور LED و کنترل سرعت و چرخش موتور DC، نحوه کار با انکودر چرخشی را بررسی کردیم.

معرفی پایه ها (Pinout) ماژول انکودر چرخشی

ماژول انکودر چرخشی دارای 5 پایه به شرح زیر است.

  • CLK: خروجی A
  • DT: خروجی B
  • SW: خروجی کلید فشاری (در حالت عادی High بوده و در صورت فشار دادن چرخنده، Low می‌شود.)
  • VCC: تغذیه ماژول- 5 ولت
  • GND: زمین

پین اوت (Pinout) این ماژول را می‌توانید در تصویر زیر مشاهده کنید.

لوازمی که به آن احتیاج دارید

قطعات مورد نیاز

آردوینو UNO R3 × 1
ماژول سنسور چرخش -شافت انکودر- Rotary Encoder × 1
سیم جامپر × 1

نرم افزارهای مورد نیاز

آردوینو IDE

اندازه گیری موقعیت شفت انکودر چرخشی

کافی است پایه + را به 5v، پایه GND را به GND، پایه CLK را به پایه 6 و پایه DT را به  پایه 7 متصل کنید.

برای هر پروژه ای که با انکودر انجام می دهید لازم است موقعیت شفت را بدانید، موقعیت شفت بسته به میزان چرخش آن درصورتی که ساعتگرد چرخیده شود از 0 تا بی نهایت و در صورت چرخش پادساعتگرد از 0 تا منفی بی نهایت تغییر می کند. با آپلود کردن کد زیر روی بورد خود موقعیت شفت را در Serial Monitor مشاهده خواهید کرد و می توانید از این کد در تمام پروژه های خود با انکودر استفاده کنید.

/*
Rotary Encoder - get the position
modified on 23 Feb 2019
by Saeed Hosseini
Home
*/ #define encoderOutA 6 // CLK #define encoderOutB 7 // DT int counter = 0; int State; int old_State; void setup() { pinMode (encoderOutA, INPUT); pinMode (encoderOutB, INPUT); Serial.begin (9600); //Read First Position of Channel A old_State = digitalRead(encoderOutA); } void loop() { State = digitalRead(encoderOutA); if (State != old_State) { if (digitalRead(encoderOutB) != State) { counter ++; } else { counter --; } Serial.print("Position: "); Serial.println(counter); } old_State = State; // the first position was changed }
برای تعیین موقعیت انکودر باید کانال های A و B را به صورت ورودی به آردوینو متصل کنیم. در ابتدای کار مقدار اولیه کانال A را می خوانیم و ذخیره می کنیم.

کنترل نور LED با چرخش شفت انکودر چرخشی

سیم بندی

کد

/*
Rotary Encoder - LED Brightness Control
modified on 23 Feb 2019
by Saeed Hosseini
Home
*/ #define encoderOutA 6 // CLK #define encoderOutB 7 // DT #define LED 9 // LED , must connect to pwm pin int brightness = 0; int State; int old_State; void setup() { pinMode (encoderOutA, INPUT); pinMode (encoderOutB, INPUT); pinMode (LED, OUTPUT); Serial.begin (9600); //Read First Position of Channel A old_State = digitalRead(encoderOutA); } void loop() { State = digitalRead(encoderOutA); if (State != old_State) { if (digitalRead(encoderOutB) != State) { brightness ++; } else { brightness --; } if (brightness >= 255) brightness = 255; if (brightness <= 0) brightness = 0; Serial.print("brightness: "); Serial.println(brightness); } old_State = State; // the first position was changed analogWrite(LED , brightness); }
در این پروژه ابتدا موقعیت شفت را بدست می آوریم و با توجه به آن نور LED را به کمک PWM کم یا زیاد می کنیم. لازم به ذکر است از آنجایی که PWM مقداری از 0 تا 255 می گیرد درنتیجه موقعیت شفت را بصورت نرم افزاری در این محدوده قرار می دهیم.

کنترل سرعت و جهت چرخش یک موتور DC با استفاده از وقفه

سیم بندی

کد

ابتدا کتابخانه Adafruit_Motor_Shield_library را بر آردوینوی خود نصب کنید.

سپس کد زیر را بر روی آردوینو خود آپلود کنید.

/*
  Rotary Encoder - Controlling a DC Motor using L293D Shield
  modified on 23 Feb 2019
  by Saeed Hosseini
  
Home
*/ #include <AFMotor.h> #define CLK 2 #define DT 5 #define SW 3 AF_DCMotor motor(1, MOTOR12_64KHZ); int motor_dir = 0; int State; int old_State, change; volatile int motor_speed = 0; volatile boolean buttonState = false; void setup() { Serial.begin(9600); pinMode(CLK, INPUT); pinMode(DT, INPUT); pinMode(SW, INPUT_PULLUP); old_State = digitalRead(CLK); attachInterrupt (digitalPinToInterrupt(CLK), encoder_detect, CHANGE); attachInterrupt (digitalPinToInterrupt(SW), button_detect, FALLING); } void loop() { if (!buttonState) { if (motor_speed > 0) { motor.setSpeed(motor_speed); motor.run(FORWARD); Serial.print("Move Forward: "); Serial.println(motor_speed); } else if (motor_speed < 0) { motor.setSpeed((motor_speed) * (-1)); motor.run(BACKWARD); Serial.print("Move Backward: "); Serial.println(motor_speed); } } if (buttonState == true || motor_speed == 0) { motor.run(RELEASE); Serial.println("Break"); } } void encoder_detect () { buttonState = false; State = digitalRead(CLK); if (State != old_State) { if (digitalRead(DT) != State) { motor_speed ++; if (motor_speed >= 255) motor_speed = 255; } else { motor_speed --; if (motor_speed <= -255) motor_speed = -255; } } old_State = State; } void button_detect() { buttonState = true; }

از این مطلب خوشتان آمد؟

آخرین مطالت و آموزش ها را در ایمیلتان دریافت کنید:

مطالب بیشتر

Comments (10)

  • علی محبی Reply

    با سلام
    در برنامه دوم ال ای دی به صورت ورودی تعریف شده که اشتباه می باشد باید خروجی تعریف شود
    با تشکر

    ژانویه 18, 2021 at 6:56 ب.ظ
    • مهران ملکی Reply

      سلام.
      بله درست می فرمایید. کد اصلاح شد.
      البته نکته ای که وجود داره اینه که تو دستورهای analogRead و analogWrite برای آردوینو مهم نیست که پایه مربوطه ورودی تعریف شده باشه یا خروجی. یعنی همون کد قبلی با تعریف ورودی هم در نهایت به درستی کار میکنه. ولی نحوه کدنویسی اصولی اینه که پایه مربوطه برای analogRead ورودی و برای analogWrite خروجی تعریف بشه.

      ژانویه 19, 2021 at 10:39 ق.ظ
      • میثم شاهدی Reply

        سلام
        خسته نباشید
        مهندس من میخوام 2 عدد led تعریف کنم و با جرخاندن شفت به سمت زیاد led یک روشن و خاموش بشه و با چرخاندن برعکس led دو خاموش و روشن بشه و در نهایت بین 2 برد وای فای esp32 8266 این ارتباط رو بدم که یک برد به انکودر و سمت دیگه led ها اگه امکانش هست راهنمایی فرمایید.

        آگوست 20, 2021 at 4:16 ب.ظ
        • مهران ملکی Reply

          سلام.
          کد مربوط به بخش “اندازه گیری موقعیت شفت انکودر چرخشی” میتونه خیلی بهتون کمک کنه. در ایتدا برای تعریف دو led که کافیه 2 پایه دیجیتال رو به عنوان خروجی تعریف کنید. برای تنظیم اینکه کدوم led خاموش و روشن بشه هم میتونید در کدی که گفتم، خطوط 25 و 28 رو به صورت مناسب تغییر بدید. خط 25 برای چرخاندن شفت به سمت زیاده که میتونید برای led 1 استفاده کنید و خط 28 هم برای برعکس چرخاندن شفته و میتونید برای led 2 استفاده کنید. این برای زمانی هست که بخواید با وصل کردن انکودر و ledها به یک آردوینو این کار رو انجام بدید.
          برای حالتی که بخواید روی دو برد esp این کار رو انجام بدید، میتونید این ارتباط رو هم از طریق وای‌فای و هم بلوتوث انجام بدید. برای این کار باید نحوه ارتباط و ارسال اطلاعات بین دو esp رو به طور کامل یاد بگیرید که برای این موضوع من این دو لینک رو بهتون پیشنهاد میکنم:
          “https://www.youtube.com/watch?v=2z7Ow4PjJRc”
          “https://randomnerdtutorials.com/esp-now-two-way-communication-esp32/”

          آگوست 21, 2021 at 12:33 ب.ظ
  • محمد سیدی Reply

    با سلام و ادب
    من میخواستم که توسط این ماژول درجه محوری که موتور dc به اون متصل است رو اندازه گیری و و توسط نود ام سیو تعیین کنم
    با توجه به این موضوع کد های مربوط به آن به چه صورتی باید باشد.
    ممنون میشم راهنمایی کنید ………

    فوریه 5, 2022 at 11:29 ق.ظ
    • مهران ملکی Reply

      سلام.
      برای این کار، لازمه که در ابتدا موتور DC رو با ماژول انکودر از طریق کوپلینگ متصل کنید. در ادامه برای اندازه‌گیری درجه محور موتور DC میتونید از کد بخش “اندازه گیری موقعیت شفت انکودر چرخشی” استفاده کنید. در اون کد موقعیت محور بدست میاد. و از اونجایی که رزولوشن این انکودر 20 (هر دور کامل، 20 واحد) هست، در موقعیت بدست اومده توسط کد هر واحد معادل 18درجه هست. در مورد استفاده از کد برای ماژول NodeMCU هم میتونید همین کد رو بدون تغییر خاصی استفاده کنید.

      فوریه 6, 2022 at 10:11 ق.ظ
      • مصطفی Reply

        سلام.چه راهی برای کنترل سرعت آرمیچر بدون استفاده از آردوینو هستش؟مثلا استفاده همین آنکودر به تنهایی؟فقط کم و زیاد شدن سرعت مهم باشه؟

        آگوست 3, 2023 at 8:14 ق.ظ
        • محمد دمیرچی Reply

          با سلام
          تغییر سرعت موتور یکی از گزینه های استفاده از این انکودر می باشد.
          می توانید از درایور موتور هایی که ولم دارند برای کنترل سرعت موتور استفاده کنید و نیازی نیست که از آردوینو برای کنترل استفاده کنید.
          برای مثال می توانید از این مدل استفاده کنید
          ماژول کنترلر سرعت موتور 1803BK – DC

          آگوست 5, 2023 at 12:35 ب.ظ
  • بابک سلامی Reply

    با سلام

    ممنون از زحمات شما و مطالب مفید تون

    همنشینی با عالم باعث افزایش علم میشود.

    سایه تون مستدام

    آوریل 13, 2022 at 4:33 ق.ظ
    • مهران ملکی Reply

      سلام.
      ممنون از نظر پر محبت شما. خوشحالیم که کمک‌کننده بوده براتون

      آوریل 13, 2022 at 9:43 ب.ظ

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.