ویژگی های روتاری انکودرهای HN3806-AB
روتاری انکودر نوری یک تجهیز الکترومکانیکی میباشد که دارای یک شفت درونی داخل یک محیط استوانه ای است که مانند یک موتور به نظر میرسد. صفحه دایرهای درون آن دارای دو شکاف میباشد. یک سنسور فرستنده نوری در یک طرف و یک سنسور دریافتکننده نوری در طرف دیگر صفحه قرار میگیرد و زمانی که شکاف بین دو سنسور نور قرار میگیرد، ارتباط دو سنسور با هم برقرار میشود و در نهایت دریافت کننده به میکروکنترلر متصل میگردد.
از روتاری انکودر معمولا برای تعیین موقعیت شفت موتور، جهت چرخش آن و همچنین سرعت آن استفاده میشود.
روتاری انکودرهای سری HN3808-AB دارای دو فاز A و B میباشند و در مدلهای 100، 200، 360، 400 و 600 پالس بر دور موجود میباشند.
نکته
با تحلیل دو سیگنال خروجی A و B میتوان به نحوه عملکرد آن پی برد. اگر چرخش در جهت عقربه های ساعت باشد، سیگنال A از سیگنال B جلوتر خواهد بود و بالعکس.
برای نمونه دیتاشیت روتاری انکودر نوری 400 پالس را می توانید از اینجا دانلود کنید.
HN3806-AB Rotary Encoder Datasheet
معرفی پایه های (Pinout) روتاری انکودرهای HN3806-AB
روتاری انکودرهای HN3806 دارای چهار سیم به رنگ های قرمز، مشکی، سبز، آبی و یک سیم بدون محافظ به نام shield میباشد. کاربرد و نام این پایه ها به شرح زیر است:
- VCC: رنگ قرمز – تغذیه انکودر – 5 تا 24 ولت
- GND: رنگ مشکی – زمین
- Phase-A: رنگ سفید – خروجی اول انکودر
- Phase-B: رنگ سبز – خروجی دوم انکودر
پین اوت (Pinout) این سنسور را می توانید در تصویر زیر مشاهده کنید.
لوازمی که به آن احتیاج دارید
قطعات مورد نیاز
نرم افزارهای مورد نیاز
توجه
از هر کدام یک از انواع روتاری انکودرها برای ادامه این آموزش میتوانید استفاده کنید.
راه اندازی روتاری انکودرهای 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)
با عرض سلام
مدار و کد بالا رو با انکودر HN3806-AB 200 و آردینو uno تست کردم (بدون هیچ تغییری) نتیجه برای من به شکل زیر بود:
1
2
4
6
7
8
10
همینطور که معلومه تعدادی از پالس های شمارش شده وسط لیست جا انداخته شده و مثل خروجی شما دقیق نیست. شفت انکودر رو چه آرام بچرخانیم و چه سریع همین اتفاق می افتند. در مواردی هم بدون تغییر جهت چرخش شفت، جهت شمارش به صورت لحظه ای معکوس میشود. (این حالت به خصوص با چرخش آهسته شفت بهتر دیده میشه)
سوال اینه که آیا باید از انکودرهای دقیق تری استفاده کنیم یا مشکل جای دیگری است؟
با تشکر از بخش تولید محتوای کافه ربات
سلام.
نه هیچکدوم از پالسها جا نمیوفته و اصلا از نظر نرمافزاری و کدی که نوشته شده هم همچین چیزی امکانپذیر نیست. صرفا نمایش اونها در سریال مانیتور جا ممکنه بیوفته. دلیلش هم استفاده از اینتراپت در نوشتن این کده. اینتراپت از نظر اولویت نسبت به تمامی خطهای برنامه بالاتر هست و وقتی اتفاق میوفته اجرای کد متوقف شده و ابتدا به روتین اون اینتراپت پرداخته میشه و بعدش به ادامهی برنامه. اتفاقی که برای شما رخ داده، به طور دقیق این هست که بین یک اجرای Serial.println (counter) با اجرای دفعهی بعدش، دو بار اینتراپت رخ داده و در نتیجه متغیر counter دو واحد بهش اضافه شده. در نتیجه در اجرای Serial.println (counter) امکان داره که عددها با همدیگه الزاما یک واحد اختلاف نداشته باشند.
سلام
بله احتمالا همینطوره.
بابت راهنمایی سپاسگزارم
خواهش میکنم.
سلام
انکودر با برد نانو هم جواب میدهد؟
من با برد UNO جواب گرفتم ولی با NANO موفق نشدم
سلام.
بله تفاوتی نداره. شما میتونید از همین کد و سیمبندی برای 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/”
سلام میشه این انکودر را به ورودی، های اسپید لوگو زیمنس هم وصل کرد؟
سلام
بله امکان پذیر هست که از ورودی های DI لوگو زیمنس استفاده کنید
سلام وقتتون بخیر
من انکدر رو به آردوینو وصل کردم و کدها رو هم نوشتم و آپلود کردم منتهی هیچ چیزی در serial monitor نشون نمیده
ممنون میشم راهنمایی بفرمایید که چرا این مشکل رخ می دهد.
با سلام
پایه های دیتا انکودر را با یک مقاومت در حدود 1 الی 10 کیلو به VCC وصل کنید و تست کنید.
انشالله مشکل حل شود.
فقط از چه پایه هایی برای خواندن انکودر استفاده میکنید؟؟
سلام وقتتون بخیر
چه برنامه ای باید اضافه کنیم تابا فشردن انکودر عدد صفر را به ما بدهد؟
با سلام
کافی است یک شرط if در کد خود قرار بدهید به صورتی که وقتی پایه مورد نظر high یا low شد مقدار counter را برابر 0 قرار بدهد.
سلام ممنون از آموزش خوب شما میخواستم یک انکودر به یک موتور dc متصل کنم که با چرخش موتور انکودر زاویه چرخش آن را از یک تا ۳۶۰ بدهد و بعد یک دور دوباره صفر شود و با توجه به زاویه موتور یک ماژول جرقه کار کند مثلاً در زاویه های ۹۰ ، ۱۸۰ ، ۲۷۰ و ۳۶۰ یک جرقه بزند در واقع موتور چهار زمانه را شبیه سازی کنم و اردوینو مثل ecu عمل کند.
با درود من یه انکودر 600 پالس دارم چه تغییری تو برنامه بدم که بتونه این اعداد رو به واحد میلیمتر و اعشارش نشون بده ؟ میخوام خط کش دیجیتال باهاش درست کنم
با سلام
انکودر 600 پالس دارای دقت 0.6 درجه می شود. حال شما یک قلطک بر روی شفت قرار میدهید این که محیط این قلطک چقدر می باشد بستگی به مدل انتخابی شما می باشد و با توجه به این محیط میتوانید اندازه گیری را انجام بدهید.
به عنوان مثال، شما قلطکی با محیط 3 سانتی متر داشته باشید. در نتیجه به ازای هر 600 پالس شما 3 سانت جلو رفته اید. در نتیجه هر پالس می شود 0.005 سانتی متر که با اعمال این ضریب به عدد پالس های خوانده شده شما می توانید میزان مسافت را اندازه گیری کنید.
سلام با برد آردینو لیُوناردو سازگار هست ؟
لیُوناردو R3
بلی
سلام
برای راه اندازی باید یک مقاومت به خروجی پالس متصل کنین
حدود 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);
}
با سلام
این مقاومت هر 2 باید به VCC یا همان 5 ولت وصل بشوند.
مقدار مقاومت نیز بین 1 الی 10 کیلو هر مقداری باشد جواب میدهد.
از دستور INPUT_PULLUP نیز در برنامه آردوینو نیز می توانید استفاده کنید ولی پیشنهاد نمیکنم.
و با استفاده از کد داخل آموزش می توانید استفاده کنید.
کد شما نیز یک جهت می باشد از این رو برای تشخیص جهت بهتر می باشد این موارد را انجام بدهید.
سلام خسته نباشید چه راهی برای اتصال همزمان دو انکودر و به دست آوردن دو متغیر وجود دارد
با سلام
در صورتی که فقط میخواهید از یک جهت این 2 انکودر استفاده کنید می توانید سیم یکی از انکودر ها را قطع کنید و انکودر دوم خود را جای گزین این پایه بکنید و در کد نیز متغییر شمارنده را 2 عدد جدا بکنید و هر 2 را ++ کنید تا به این صورت شمارش هر 2 را داشته باشید.
در صورت که جهت را نیز میخواهید – مورد اول اینکه از میکروکنترلی باید استفاده کنید که حداقل 4 عدد پایه اینتراپت (وقفه) داشته باشند که آردوینو uno فقط 2 عدد دارد ( میتوانید از آردوینو mega یا ESP32 یا STM32 استفاده کنید)
همین مغییر ها و فانکشن ها را دوباره باید تکرار کنید و نام گذاری مجدد کنید و به پایه های مربوطه لینک کنید.