آموزش راه اندازی روتاری انکودر Rotary Encoder با آردوینو

فهرست مطالب

ویژگی های روتاری انکودرهای HN3806-AB

روتاری انکودر نوری یک تجهیز الکترومکانیکی می‌باشد که دارای یک شفت درونی داخل یک محیط استوانه ای است که مانند یک موتور به نظر می‌رسد. صفحه دایره‌ای درون آن دارای دو شکاف می‌باشد. یک سنسور فرستنده نوری در یک طرف و یک سنسور دریافت‌کننده نوری در طرف دیگر صفحه قرار می‌گیرد و  زمانی که شکاف بین دو سنسور نور قرار میگیرد، ارتباط دو سنسور با هم برقرار می‌شود و در نهایت دریافت کننده به میکروکنترلر متصل می‌گردد.

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

روتاری انکودرهای سری HN3808-AB دارای دو فاز A و B می‌باشند و در مدلهای 100، 200، 360، 400 و 600  پالس بر دور موجود می‌باشند.

نکته

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

برای نمونه دیتاشیت روتاری انکودر نوری 400 پالس را می توانید از اینجا دانلود کنید.

معرفی پایه های (Pinout) روتاری انکودرهای HN3806-AB

روتاری انکودرهای  HN3806 دارای چهار سیم به رنگ های قرمز، مشکی، سبز، آبی و یک سیم بدون محافظ به نام shield می‌باشد. کاربرد و نام این پایه ها به شرح زیر است:

  • VCC: رنگ قرمز – تغذیه انکودر – 5 تا 24 ولت
  • GND: رنگ مشکی – زمین
  • Phase-A: رنگ سفید – خروجی اول انکودر
  • Phase-B: رنگ سبز – خروجی دوم انکودر

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

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

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

آردوینو UNO R3 × 1
روتاری انکودر HN3806-AB 100 پالس بر دور × 1
روتاری انکودر HN3806-AB 200 پالس بر دور ×
روتاری انکودر HN3806-AB 400 پالس بر دور ×
روتاری انکودر HN3806-AB 600 پالس بر دور ×

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

آردوینو IDE
توجه

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

راه اندازی روتاری انکودرهای HN3806 با آردوینو

گام اول: سیم بندی

مطابق مدار زیر، روتاری انکودر را به آردوینو وصل کنید. سیم های روتاری انکودر را مستقیم به آردینو متصل میکنیم.

گام دوم : کد

کد زیر را روی برد آردوینو آپلود کنید. این کد جهت چرخش موتور را مشخص میکند.

    /*
  HN3806-AB-Rotary-Encoder
  modified on 12 oct 2020
  by Amir Mohamad Shojaee @ Electropeak
  
Home
Based on electricdiylab.com Example */ //This variable will increase or decrease depending on the rotation of encoder volatile long x , counter = 0; void setup() { Serial.begin (9600); pinMode(2, INPUT_PULLUP); pinMode(3, INPUT_PULLUP); attachInterrupt(0, A, RISING); attachInterrupt(1, B, RISING); } void loop() { // Send the value of counter if( counter != x ){ Serial.println (counter); x = counter; } } void A() { if(digitalRead(3)==LOW) { counter++; }else{ counter--; } } void B() { if(digitalRead(2)==LOW) { counter--; }else{ counter++; } }

همانطور که مشاهده میکنید خروجی های سنسور به پین های اینتراپت 2 و 3 آردوینو متصل شده اند. دو تابع اینتراپت با لبه بالارونده وظیفه شمارش را بر عهده دارند. در حلقه اصلی نیز این اطلاعات در Serial Monitor  به نمایش گذاشته می‌شود. اگر در جهت عقربه های ساعت چرخیده شود، مقدار عدد کاهش و اگر در خلاف جهت عقربه های ساعت چرخیده شود، مقدار این عدد افزایشی خواهد بود.

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

آموزش های مشابه

Comments (22)

  • حکمتی Reply

    با عرض سلام
    مدار و کد بالا رو با انکودر HN3806-AB 200 و آردینو uno تست کردم (بدون هیچ تغییری) نتیجه برای من به شکل زیر بود:
    1
    2
    4
    6
    7
    8
    10
    همینطور که معلومه تعدادی از پالس های شمارش شده وسط لیست جا انداخته شده و مثل خروجی شما دقیق نیست. شفت انکودر رو چه آرام بچرخانیم و چه سریع همین اتفاق می افتند. در مواردی هم بدون تغییر جهت چرخش شفت، جهت شمارش به صورت لحظه ای معکوس میشود. (این حالت به خصوص با چرخش آهسته شفت بهتر دیده میشه)
    سوال اینه که آیا باید از انکودرهای دقیق تری استفاده کنیم یا مشکل جای دیگری است؟
    با تشکر از بخش تولید محتوای کافه ربات

    آوریل 16, 2021 at 11:37 ق.ظ
    • مهران ملکی Reply

      سلام.
      نه هیچکدوم از پالس‌ها جا نمیوفته و اصلا از نظر نرم‌افزاری و کدی که نوشته شده هم همچین چیزی امکان‌پذیر نیست. صرفا نمایش اون‌ها در سریال مانیتور جا ممکنه بیوفته. دلیلش هم استفاده از اینتراپت در نوشتن این کده. اینتراپت از نظر اولویت نسبت به تمامی خط‌های برنامه بالاتر هست و وقتی اتفاق میوفته اجرای کد متوقف شده و ابتدا به روتین اون اینتراپت پرداخته میشه و بعدش به ادامه‌ی برنامه. اتفاقی که برای شما رخ داده، به طور دقیق این هست که بین یک اجرای Serial.println (counter) با اجرای دفعه‌ی بعدش، دو بار اینتراپت رخ داده و در نتیجه متغیر counter دو واحد بهش اضافه شده. در نتیجه در اجرای Serial.println (counter) امکان داره که عددها با همدیگه الزاما یک واحد اختلاف نداشته باشند.

      آوریل 17, 2021 at 11:05 ق.ظ
      • حکمتی Reply

        سلام
        بله احتمالا همینطوره.
        بابت راهنمایی سپاسگزارم

        آوریل 17, 2021 at 1:03 ب.ظ
        • مهران ملکی Reply

          خواهش میکنم.

          آوریل 18, 2021 at 9:34 ق.ظ
  • مجید Reply

    سلام
    انکودر با برد نانو هم جواب میدهد؟
    من با برد UNO جواب گرفتم ولی با NANO موفق نشدم

    آگوست 10, 2021 at 6:53 ب.ظ
    • مهران ملکی Reply

      سلام.
      بله تفاوتی نداره. شما میتونید از همین کد و سیم‌بندی برای Arduino Nano هم استفاده کنید. در واقع Arduino Uno و Arduino Nano کاملا از نظر عملکرد مشابه همدیگه هستند و میکروکنترلر استفاده شده در آن‌ها هم یکسان و صرفا از نظر dip و smd بودن متفاوته.
      مشکلی که ممکنه در استفاده از Aduino Nano داشته باشید این هست که درایور CH340 که در این برد استفاده شده رو در سیستمتان به درستی نصب نداشته باشید. اگر در device manager، قسمت PORTS، پورتی که مربوط به برد Arduino Nano هست رو مشاهده نمیکنید و یا در کنار اون یک علامت تعجب زرد رنگ میبینید، به این معنا هست که باید درایور CH340 رو نصب کنید. برای نصب این درایور میتونید از آموزش زیر کمک بگیرید:
      “https://thecaferobot.com/learn/how-to-install-ch340-driver/”

      آگوست 14, 2021 at 12:14 ب.ظ
    • مصطفی Reply

      سلام میشه این انکودر را به ورودی، های اسپید لوگو زیمنس هم وصل کرد؟

      فوریه 23, 2023 at 1:05 ب.ظ
      • علی عبدالملکی Reply

        سلام
        بله امکان پذیر هست که از ورودی های DI لوگو زیمنس استفاده کنید

        فوریه 27, 2023 at 9:19 ق.ظ
  • ندا شهبازی Reply

    سلام وقتتون بخیر
    من انکدر رو به آردوینو وصل کردم و کدها رو هم نوشتم و آپلود کردم منتهی هیچ چیزی در serial monitor نشون نمیده
    ممنون میشم راهنمایی بفرمایید که چرا این مشکل رخ می دهد.

    مارس 29, 2023 at 7:47 ب.ظ
    • محمد دمیرچی Reply

      با سلام
      پایه های دیتا انکودر را با یک مقاومت در حدود 1 الی 10 کیلو به VCC وصل کنید و تست کنید.
      انشالله مشکل حل شود.
      فقط از چه پایه هایی برای خواندن انکودر استفاده میکنید؟؟

      آوریل 8, 2023 at 4:58 ب.ظ
  • روحینا Reply

    سلام وقتتون بخیر
    چه برنامه ای باید اضافه کنیم تابا فشردن انکودر عدد صفر را به ما بدهد؟

    آگوست 13, 2023 at 5:46 ب.ظ
    • محمد دمیرچی Reply

      با سلام
      کافی است یک شرط if در کد خود قرار بدهید به صورتی که وقتی پایه مورد نظر high یا low شد مقدار counter را برابر 0 قرار بدهد.

      آگوست 14, 2023 at 1:09 ب.ظ
      • یعقوب Reply

        سلام ممنون از آموزش خوب شما میخواستم یک انکودر به یک موتور dc متصل کنم که با چرخش موتور انکودر زاویه چرخش آن را از یک تا ۳۶۰ بدهد و بعد یک دور دوباره صفر شود و با توجه به زاویه موتور یک ماژول جرقه کار کند مثلاً در زاویه های ۹۰ ، ۱۸۰ ، ۲۷۰ و ۳۶۰ یک جرقه بزند در واقع موتور چهار زمانه را شبیه سازی کنم و اردوینو مثل ecu عمل کند.

        اکتبر 7, 2023 at 3:03 ب.ظ
  • mostafa Reply

    با درود من یه انکودر 600 پالس دارم چه تغییری تو برنامه بدم که بتونه این اعداد رو به واحد میلیمتر و اعشارش نشون بده ؟ میخوام خط کش دیجیتال باهاش درست کنم

    سپتامبر 18, 2023 at 6:23 ب.ظ
    • محمد دمیرچی Reply

      با سلام
      انکودر 600 پالس دارای دقت 0.6 درجه می شود. حال شما یک قلطک بر روی شفت قرار میدهید این که محیط این قلطک چقدر می باشد بستگی به مدل انتخابی شما می باشد و با توجه به این محیط میتوانید اندازه گیری را انجام بدهید.
      به عنوان مثال، شما قلطکی با محیط 3 سانتی متر داشته باشید. در نتیجه به ازای هر 600 پالس شما 3 سانت جلو رفته اید. در نتیجه هر پالس می شود 0.005 سانتی متر که با اعمال این ضریب به عدد پالس های خوانده شده شما می توانید میزان مسافت را اندازه گیری کنید.

      سپتامبر 19, 2023 at 10:22 ق.ظ
  • امین Reply

    سلام با برد آردینو لیُوناردو سازگار هست ؟

    سپتامبر 29, 2023 at 9:01 ب.ظ
    • امین Reply

      لیُوناردو R3

      سپتامبر 29, 2023 at 9:02 ب.ظ
      • محمد دمیرچی Reply

        بلی

        سپتامبر 30, 2023 at 5:08 ب.ظ
  • akbarabadi Reply

    سلام
    برای راه اندازی باید یک مقاومت به خروجی پالس متصل کنین
    حدود 4.7 کیلو
    بری سیم سبز مقاومت به سر منفی بخوره و برای سیم سفید به سر مثبت یا 5 ولت متصل بشه
    من به پایه دیجیتال زذم
    count = digitalRead(sens);
    Serial.println (count);
    //Serial.println (x);
    if (count ==1){
    //delay(10);
    while (count ==1){
    count = digitalRead(sens);
    delay(10);
    }
    counter++ ;//delay(10);

    }

    اکتبر 15, 2023 at 2:06 ب.ظ
    • محمد دمیرچی Reply

      با سلام
      این مقاومت هر 2 باید به VCC یا همان 5 ولت وصل بشوند.
      مقدار مقاومت نیز بین 1 الی 10 کیلو هر مقداری باشد جواب میدهد.
      از دستور INPUT_PULLUP نیز در برنامه آردوینو نیز می توانید استفاده کنید ولی پیشنهاد نمیکنم.
      و با استفاده از کد داخل آموزش می توانید استفاده کنید.
      کد شما نیز یک جهت می باشد از این رو برای تشخیص جهت بهتر می باشد این موارد را انجام بدهید.

      اکتبر 17, 2023 at 8:02 ق.ظ
  • مهدی Reply

    سلام خسته نباشید چه راهی برای اتصال همزمان دو انکودر و به دست آوردن دو متغیر وجود دارد

    ژانویه 21, 2024 at 7:19 ب.ظ
    • محمد دمیرچی Reply

      با سلام
      در صورتی که فقط میخواهید از یک جهت این 2 انکودر استفاده کنید می توانید سیم یکی از انکودر ها را قطع کنید و انکودر دوم خود را جای گزین این پایه بکنید و در کد نیز متغییر شمارنده را 2 عدد جدا بکنید و هر 2 را ++ کنید تا به این صورت شمارش هر 2 را داشته باشید.
      در صورت که جهت را نیز میخواهید – مورد اول اینکه از میکروکنترلی باید استفاده کنید که حداقل 4 عدد پایه اینتراپت (وقفه) داشته باشند که آردوینو uno فقط 2 عدد دارد ( میتوانید از آردوینو mega یا ESP32 یا STM32 استفاده کنید)
      همین مغییر ها و فانکشن ها را دوباره باید تکرار کنید و نام گذاری مجدد کنید و به پایه های مربوطه لینک کنید.

      ژانویه 22, 2024 at 12:53 ب.ظ

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

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