معرفی و راه‌اندازی پتانسیومتر، انکودر و سروو موتور با آردوینو

شنبه, 01 خرداد 1395 16:14
این مورد را ارزیابی کنید
(9 رای‌ها)
  automee  
این مطلب متعلق به وبسایت اتومی است.
منبع

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

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

برد آردوینو و کابل رابط 

1 عدد
پتانسیومتر 10kΩ 1 عدد
انکودر نسبی 1 عدد
سروو موتور 1 عدد
خازن 470μF 1 عدد
برد بورد 1 عدد
سیم جامپر 1 بسته

معرفی پتانسیومتر 

پتانسیومتر یک قطعه آنالوگ است که بسته به کاربرد، از آن استفاده‌های مختلفی می‌شود. پتانسیومترها انواع مختلفی از جمله انواع دورانی و خطی دارند. استفاده از پتانسیومترهای دورانی معمول‌تر است. پتانسیومترها مقاومت‌های متغیری هستند که دارای سه پایه هستند؛ دو پایه برای مثبت و منفی و پایه دیگر برای تنظیم ولتاژ استفاده می‌شود. این کار با چرخاندن پیچ موجود بر روی پتانسیومتر صورت می‌گیرد.

 پتانسیومتر

 

مقاومت یک قطعه رسانا (مثلا یک سیم) با سطح مقطع ثابت به طول آن بستگی دارد. هرچه طول قطعه بیشتر شود، مقاومت قطعه هم بیشتر خواهد شد. رابطه پتانسیومتر1

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

 

 شماتیک پتانسیومتر

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

 

 مدار پتانسیومتر

 رابطه پتانسیومتر2

پتانسیومتر دورانی در صورتی که تک دور باشد (یک دور بچرخد) با چرخیدن به میزان ٠ تا ٣٦٠ درجه، خروجی ولتاژ ٠ تا ١٠٠ درصد را می‌دهد. البته این مقدار معمولا حدود ٣٠٠ درجه است. پتانسیومترهای دورانی متنوعی وجود دارند که همین کار را برای میزان چرخش‌های دیگر مثل ½، ٣، ١٠ و ٢٠ دور انجام می‌دهند. تعداد دور بیشتر پتانسیومتر باعث می‌شود تا دقت آن بیشتر باشد. پارامتر دیگری که در پتانسیومترهای مختلف، متفاوت است میزان مقاومت کل آن است که مقاومت 10kΩ مرسوم‌تر است.

کار با پتانسیومتر

مطابق شکل زیر، پایه مثبت و منفی پتانسیومتر را به 5V و GND و پایه Signal را به پین A0 آردوینو وصل کنید. 

 

 فریتزینگ پتانسیومتر

کد زیر را در نرم‌افزار آردوینو وارد کرده و اجرا کنید. سریال مانیتور را باز کرده و مقدار پتانسیومتر را بر حسب درصد مشاهده کنید.

/*
SanatBazar
Arduino Tutorial Series
Author: Davood Dorostkar
Website: www.sanatbazar.com

*/

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  int Potentiometer = analogRead(A0);
  Potentiometer = map(Potentiometer, 0, 1023, 0, 100);
  Serial.print("Rotation percentage ");
  Serial.println(Potentiometer);
}

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


معرفی انکودر

انکودر یک وسیله اندازه‌گیری حرکت دورانی یا خطی است. مثلا اگر انکودر را به یک موتور وصل کنید، انکودر به شما خواهد گفت که موتور چقدر چرخیده است؛ انکودر خطی کاربرد محدودی دارد و اکثرا از انکودر دورانی استفاده می‌شود. طرز کار انکودر بسیار ساده است و در عین حال دقت خیلی بالایی دارد. در مورد دقت انکودر ذکر همین نکته کافیست که در اندازه‌گیری‌های حساس ابزار دقیق از انکودر استفاده می‌شود. البته انکودرهای دقیق قیمت بالایی نیز دارند. مکانیزم‌های مختلفی برای ساخت انکودر ابداع شده است، مانند انکودر مکانیکی، مغناطیسی، نوری و…. امروزه انکودر نوری به دلیل دقت بالا و قیمت مناسب کاربرد بسیار بیشتری دارند و در این آموزش هم از این نوع استفاده شده است.

 

 انکودر

انکودر دو دسته کلی دارد: مطلق (Absolute) و نسبی (Incremental). انکودر مطلق طوری طراحی شده است که می‌تواند مقدار لحظه‌ای زاویه را بدهد. این ویژگی باعث می‌شود تا در صورت قطع شدن برق یا ریست کردن سیستم، مقدار قبلی زاویه همچنان در دسترس باشد و اصطلاحا انکودر مطلق دارای حافظه است. انکودر نسبی، فقط تغییرات زاویه نسبت به لحظه قبل را می‌دهد. بنابراین برای داشتن زاویه لحظه‌ای باید زاویه اولیه سنسور را در اختیار داشته باشید. طبیعتا با مشتق گرفتن از مقادیر انکودر می‌توان سرعت و شتاب زاویه‌ای را محاسبه کرد. انکودر در زمینه‌های متنوعی کاربرد دارد، از جمله در کنترل، رباتیک و همچنین در تجهیزاتی مانند رادارها یا ماوس رایانه استفاده می‌شود. مهمترین کاربرد انکودر، اندازه‌گیری لحظه‌ای زاویه و سرعت موتورهای موجود در مفاصل ربات‌ها است. انکودرها معمولا به روش نوری کار می‌‌کنند. یک پرتو نور توسط بخشی از انکودر که در محلی ثابت قرار دارد تابانیده می‌شود؛ در مقابل، بخش متحرک انکودر شامل یک صفحه روزنه‌دار بر روی شفت یا عضو دوار نصب می‌شود. در شکل زیر صفحه روزنه‌دار را برای یک انکودر مطلق (سمت راست) و یک انکودر نسبی (سمت چپ) مشاهده می‌کنید. 

 

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

 

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

 کار با انکودر

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

تعریف Interrupt در آردوینو

برای کار با انکودر باید ابتدا با مفهومی به نام Interrupt آشنا شوید. Interrupt قابلیتی است که به شما اجازه می‌دهد تا در صورتی که تغییری در سیگنال مورد نظرتان اتفاق افتاد، یک عمل خاص را انجام دهد. اگر می‌خواستید همین کار را به صورت دستی انجام دهید نیاز به کدزنی طولانی‌تری داشتید و بار اضافی نیز به پردازنده میکروکنترلر تحمیل می‌شد؛ در حالی که با استفاده از Interrupt تنها نیاز به یک خط کد دارید. اهمیت اصلی Interrupt این است که اجرای آن مستقل از برنامه اصلی بوده و روند اجرای برنامه را مختل نمی‌کند. این به شما اجازه می‌دهد که سیگنال تعریف شده برای Interrupt را در هر زمانی که ایجاد شد مستقل از اینکه برنامه در حال انجام چه کاری است دریافت کنید و هیچ داده‌ای را از دست ندهید. برای استفاده از Interrupt در بخش setup برنامه دستور زیر را وارد کنید:

attachInterrupt(digitalPinToInterrupt(pin), ISR, mode)

 بجای pin شماره پینی که سیگنال مورد نظرتان را به آن وصل کرده‌اید را بنویسید. دقت کنید که در آردوینو فقط بعضی از پینها قابلیت Interrupt شدن را دارند. مثلا در آردوینو UNO پینهای ٢ و ٣ Interrupt هستند. در دستور بالا بجای ISR، عملی که می‌خواهید انجام شود (می‌تواند یک تابع جداگانه باشد) و بجای mode یکی از حالتهای زیر را جایگذاری کنید:
LOW: اگر پین در وضعیت Low باشد Interrupt را فعال می‌کند.
CHANGE: اگر پین هر تغییر وضعیتی داد Interrupt را فعال می‌کند.
FALLING: اگر پین از وضعیت High به Low تغییر کرد Interrupt را فعال می‌کند.
RISING: اگر پین از وضعیت Low به High تغییر کرد Interrupt را فعال می‌کند.
HIGH: اگر پین در وضعیت High باشد Interrupt را فعال می‌کند (فقط برای بردهای Due، Zero و MKR1000)
در تعریف تابع ISR باید به چند نکته توجه داشته باشید. اول اینکه این تابع باید تا حد امکان کوتاه و سریع باشد. به علاوه بعضی دستورها مانند delay، micros و millis درون این تابع به درستی کار نمی‌کنند. همچنین اگر از متغیری درون ISR استفاده کرده‌اید که در برنامه اصلی استفاده می‌شود، آنرا به صورت volatile تعریف کنید. مثلا:

volatile  int encoderPosition = 0 

متغیرهای Global و Local

اگر ISR به صورت یک تابع مجزا تعریف شود، باید بدون ورودی و خروجی باشد. همچنین توجه کنید که متغیرهای مورد استفاده در تابع ISR باید به صورت Global تعریف شده باشند. متغیر Global متغیری است که خارج از هر تابع و حلقه‌ای در برنامه تعریف شده باشد و توسط هر تابع و حلقه‌ای در برنامه قابل دسترسی است. در مقابل آن متغیرهای Local هستند که درون یک تابع یا حلقه تعریف می‌شوند و سایر بخشهای برنامه به آن متغیر دسترسی ندارند. مثلا برنامه زیر را در نظر بگیرید:

int n;
void setup() {
}
void loop() {
  int m;
  for (int i = 0; i < 10; i++) {
    n = i + m;
  }
}

n یک متغیر Global است و بنابراین تمام بخشهای برنامه به آن دسترسی دارند. m یک متغیر Local است و قسمتهای داخلی حلقه loop از جمله حلقه for به آن دسترسی دارند. همچنین i یک متغیر Local است که فقط حلقه for و بخشهای داخلی آن به متغیر i دسترسی دارند.

راه‌اندازی انکودر

انکودرها رابط‌های مختلفی دارند. در اینجا ما یک انکودر نسبی معمولی که درون آن دو نوار تیره و روشن وجود دارد و با خروجی A و B مشخص می‌شود را بررسی می‌کنیم. برای درک بهتر عملکرد انکودر به شکل زیر توجه کنید.

فاز انکودرهمانطور که مشخص شده است، سیگنال A و B به اندازه ٩٠ درجه اختلاف فاز دارند. در هر سیکل چهار نقطه تغییر وضعیت وجود دارد. اگر در این شماتیک حرکت از چپ به راست را راستگرد و حرکت از راست به چپ را پادساعتگرد در نظر بگیریم، مجموعا ٨ نوع تغییر حالت خواهیم داشت. در شکل زیر خط‌چین‌های قرمز محل‌های تغییر حالت را نشان می‌دهد.


لبه های انکودر

 

 از آنجا که در هر نقطه حداکثر یکی از سیگنال‌های A یا  B تغییر می‌کند، با دانستن تغییرات احتمالی در یک سیگنال و همچنین وضعیت سیگنال دیگر، می‌توانیم حرکت انکودر را تشخیص دهیم. برای مثال اگر سیگنال A از حالت Low به High تغییر کرده و سیگنال B در حالت Low قرار داشته باشد، انکودر در وضعیت شماره ١ قرار دارد و بنابراین حرکتی معادل ¼ گام و در راستای ساعتگرد داشته‌ایم.

angle = (encoderPosition / 4) * (360 / 100)

این نوع انکودر دارای ٤ سیم شامل: مثبت(قرمز)، منفی(سیاه)، سیگنال A (سفید) و سیگنال B (سبز) است. سیم مثبت و منفی انکودر را به 5V و GND آردوینو و سیم A و B را به پین ٢ و ٣ دیجیتال وصل کنید.

فریتزینگ انکودر

  کد زیر  را در نرم‌افزار آردوینو بارگذاری کرده و اجرا کنید. پنجره سریال مانیتور را باز کرده و زاویه خوانده شده از انکودر را مشاهده کنید. در برنامه زیر دو تابع به نام doEncoderA و doEncoderB تعریف شده است. این دو تابع، توابعی هستند که در صورت اعمال سیگنال از سیم A یا B به Interrupt ها فعال شده و زاویه انکودر را یک واحد تغییر می‌دهند.

/*
SanatBazar
Arduino Tutorial Series
Author: Davood Dorostkar
Website: www.sanatbazar.com

*/

#define encoderPinA 2
#define encoderPinB 3
volatile int encoderPosition = 0;
float angle = 0.0;

void setup()
{
  pinMode(encoderPinA, INPUT);
  pinMode(encoderPinB, INPUT);
  attachInterrupt(digitalPinToInterrupt(2), doEncoderA, CHANGE);
  attachInterrupt(digitalPinToInterrupt(3), doEncoderB, CHANGE);
  Serial.begin(9600);
}

void loop()
{
  // Encoder has 100 steps per revolution.
  // 4 pulses form a step.
  angle = (encoderPosition / 4) * (360 / 100);
  Serial.print("Angle= ");
  Serial.print(angle);
  Serial.println(" deg");
}

void doEncoderA()
{
  if (digitalRead(encoderPinA) == HIGH)
  {

    if (digitalRead(encoderPinB) == LOW)
    {
      encoderPosition++; // CW
    }
    else
    {
      encoderPosition--; // CCW
    }
  }
  else
  {
    if (digitalRead(encoderPinB) == HIGH)
    {
      encoderPosition++; // CW
    }
    else
    {
      encoderPosition--; // CCW
    }
  }
}
void doEncoderB()
{
  if (digitalRead(encoderPinB) == HIGH)
  {
    if (digitalRead(encoderPinA) == HIGH)
    {
      encoderPosition++; // CW
    }
    else
    {
      encoderPosition--; // CCW
    }
  }
  else
  {
    if (digitalRead(encoderPinA) == LOW)
    {
      encoderPosition++; // CW
    }
    else
    {
      encoderPosition--; // CCW
    }
  }
}

 معرفی سروو موتور

سروو موتور (Servo Motor) یک مجموعه است که از موتور الکتریکی DC، گیربکس، پتانسیومتر و کنترلر تشکیل شده است. البته بعضی از سرووها بدون گیربکس هستند. هرچند برای استفاده از سروو موتور دانستن عملکرد داخلی آن الزامی نیست اما کمک می‌کند درک بهتری از آن داشته باشید. در کنار هم قرار گرفتن این اجزا باعث شده است تا بتوانید زاویه موتور را با دقت مناسبی کنترل کنید.


سروو موتور

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

 اجزای سروو موتور

 گیربکس مجموعه‌ای از چرخدنده‌ها است که دور موتور را کاهش داده و در عوض قدرت خروجی را افزایش می‌دهد. محور خروجی گیربکس، به عنوان خروجی کل مجموعه سروو موتور شناخته می‌شود. پتانسیومتر سروو موتور نیز به خروجی گیربکس متصل است و زاویه آنرا اندازه می‌گیرد. بنابراین زاویه موتور اصلی مستقیما اهمیتی ندارد و چیزی که اهمیت دارد خروجی گیربکس است که همان محوری است که از موتور خارج شده و شما با آن کار می‌کنید. میزان زاویه سروو موتورها معمولا بین ٠ تا ١٨٠ می‌تواند باشد اما سروو موتورهای ٣٦٠ درجه هم موجود است. البته با کمی تغییر می‌توانید یک سروو موتور ١٨٠ درجه را ٣٦٠ درجه کنید.

PWM

سروو موتور معمولا دارای ٣ سیم است: مثبت(قرمز)، منفی(سیاه یا قهوه‌ای) و سیگنال PWM (زرد یا نارنجی). مدولاسیون پهنای پالس یا PWM (مخفف Pulse-Width Modulation) یک روش برای پیاده‌سازی سیگنال آنالوگ در بستر دیجیتال است است که در بسیاری از تجهیزات مورد استفاده قرار می‌گیرد. در آردوینو PWM یک عدد ٨ بیتی (از ٠ تا ٢٥٥) به یک سیگنال ٥٠٠ هرتز (دوره تناوب ٢ میلی‌ثانیه) تبدیل شده و فرستاده می‌شود. این سیگنال در هر دوره تناوب خود شامل بخش High و بخش Low است. هرچه عدد اولیه به ٢٥٥ نزدیکتر باشد، عرض قسمت High سیگنال بیشتر و عرض قسمت Low آن کمتر می‌شود. عرض بخش High معمولا بین ١ میلی‌ثانیه برای مقدار ٠ و ٢ میلی‌ثانیه برای مقدار ٢٥٥ تعیین می‌شود. برای مثال اگر عدد ١٢٧ را به خروجی PWM بدهید یک سیگنال متناوب که عرض قسمت High آن ١.٥ میلی‌ثانیه است، تولید شده و سروو موتور به اندازه ٩٠ درجه خواهد چرخید.

 PWM

 

کار با سروو موتور

ابتدا سیم مثبت(قرمز) و منفی(مشکی) سروو موتور را به ترتیب به 5V و GND آردوینو و سیم سیگنال(نارنجی) را به یکی از پین‌های PWM آردوینو (در این آموزش به پین ٣)  وصل کنید. ممکن است هنگامی که سروو موتور را به مدار متصل می‌کنید حرکت‌های نامنظم و ناخواسته داشته باشد. این اتفاق به این دلیل است که موتور در لحظه ابتدایی جریان زیادی می‌کشد. کشیدن توان زیاد می‌تواند باعث ریست شدن آردوینو یا حتی آسیب به آن شود. برای جلوگیری از این اتفاق، یک خازن (مثلا ٤٧٠ میکروفاراد) را بین پایه مثبت و منفی مدار وصل کنید. خازن مثل یک ضربه‌گیر عمل کرده، توان اضافی را در خود ذخیره می‌کند و توان مصرفی ناگهانی را تامین می‌کند و باعث می‌شود تا به مدار آردوینو فشاری وارد نشود.

  فریتزینگ سروو موتور

 

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

روش اول

ابتدا کار با کتابخانه سروو موتور را توضیح می‌دهیم. خوشبختانه کتابخانه‌ Servo به صورت پیش‌فرض در نرم‌افزار آردوینو وجود دارد. این کتابخانه کار با سروو موتور را بسیار ساده کرده است. برای فراخوانی این کتابخانه همانطور که در آموزش نرم‌افزار آردوینو توضیح داده شده است، می‌توانید از مسیر Sketch → Include library → Servo استفاده کنید یا عبارت زیر را در ابتدای کدتان وارد کنید:

#include <Servo.h>

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

Servo servo

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

servo.attach(pin)

که مشخص می‌کند کدام پین آردوینو به سیگنال سروو موتور وصل شده است و

servo.write(angle)

که به سروو موتور دستور زاویه را برحسب درجه بین ٠ و ١٨٠ می‌دهد.
حالا کد زیر را در نرم‌افزار کپی کرده و اجرا کنید. خواهید دید که موتور یک نیم‌دایره را طی کرده، ٢ ثانیه صبر کرده و سپس نیم‌دایره را در جهت عکس طی می‌کند.

/*
SanatBazar
Arduino Tutorial Series
Author: Davood Dorostkar
Website: www.sanatbazar.com

*/

#include <Servo.h>
Servo servo;
void setup()
{
  servo.attach(3);
}
void loop()
{
  for (int i = 0; i < 180; i++)
  {
    servo.write(i);
  }
  delay(2000);
  for (int i = 180; i < 0; i--)
  {
    servo.write(i);
  }
  delay(2000);
}

بعضی مواقع ممکن است حین کار با سروو موتور متوجه شوید که سروو دقیقا زاویه خواسته شده را دنبال نمی‌کند؛ مثلا به جای اینکه به زاویه ١٨٠ درجه به زاویه ١٦٠ درجه برود. علت این موضوع این است که بعضی از سروو موتورها با دستور write به درستی کار نمی‌کنند. برای این موارد باید از دستور دیگری به نام ()writeMicroseconds استفاده کنید. با استفاده از این دستور پهنای سیگنال را برحسب میکروثانیه وارد می‌کنید. به این ترتیب به صورت مستقیم PWM را پیاده‌سازی می‌کنید. مثلا در حالت عادی (2000)writeMicroseconds به معنای پهنای سیگنال کامل و (1000)writeMicroseconds به معنای پهنای سیگنال صفر است. می‌دانید که دستور write نیز در واقع همین کار را انجام می‌دهد. پس مشکل از کجاست؟ دو دلیل برای این مشکل وجود دارد. اول اینکه ممکن است بعضی سازنده‌های سروو موتور پهنای سیگنال متفاوتی (نسبت به ١٠٠٠-٢٠٠٠ میکروثانیه) در نظر گرفته باشند. در این صورت پهناهای مختلفی را امتحان کنید تا حد پائین و بالای موتور را پیدا کنید (روش حل اول). دلیل دوم این است که دستور write به صورت پیش‌فرض محدوده پهنای سیگنال را بین ٥٤٤-٢٤٠٠ میکروثانیه در نظر می‌گیرد! اگر می‌خواهید از دستور write استفاده کنید و با این مشکل روبرو نشوید، می‌توانید به جای دستور (attach(pin از دستور (attach(pin, min, max استفاده کنید و در آن مقادیر پائین و بالای پهنای سیگنال را وارد کنید.

روش دوم

در روش دوم بدون استفاده از کتابخانه، سروو موتور را کنترل می‌کنیم. قبل از هر چیز با دستور define آشنا شوید. با استفاده از دستور define می‌توانید یک عدد، متن یا یک تابع را معادل با یک کلمه تعریف کنید. در این صورت در طول برنامه، هر جایی که کامپایلر به کلمه تعریف شده برسد، معادل آن را جایگذاری می‌کند. این کار از نوشتن عبارت‌ها و مقادیر تکراری جلوگیری کرده و اشتباهات را کم می‌کند. در عین حال سرعت کدزنی را هم افزایش می‌دهد، چرا که با تغییر مقدار تعیین شده، این مقدار در تمام برنامه تغییر می‌کند و نیازی به عوض کردن دستی آنها نیست. استفاده از دستور define به صورت زیر است:

#define parameter 10

در مثال بالا هر جایی که عبارت parameter دیده شود، بجای آن عدد ١٠ قرار خواهد گرفت.
همانطور که گفتیم سروو موتور از سیگنال PWM برای تعیین زاویه استفاده می‌کند که بین ٠ تا ٢٥٥ متغیر است. برای ارسال یک عدد با PWM از دستور زیر استفاده می‌کنیم:

analogWrite(pin,value)

همچنین برای استفاده از PWM باید پین مورد نظر را در setup به عنوان خروجی تعریف کرده باشید:

pinMode(pin,OUTPUT)

کد زیر  را در نرم‌افزار کپی کرده و اجرا کنید. خواهید دید که مانند حالت قبل موتور یک نیم‌دایره را طی کرده، ٢ ثانیه صبر کرده و سپس نیم‌دایره را در جهت عکس طی می‌کند.

/*
SanatBazar
Arduino Tutorial Series
Author: Davood Dorostkar
Website: www.sanatbazar.com

*/

#define servo 3
void setup()
{
  pinMode(servo, OUTPUT);
}
void loop()
{
  for (int i = 0; i < 255; i++)
  {
    analogWrite(servo, i);
  }
  delay(2000);
  for (int i = 255; i < ; i--)
  {
    analogWrite(servo, i);
  }
  delay(2000);
}

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

/*
SanatBazar
Arduino Tutorial Series
Author: Davood Dorostkar
Website: www.sanatbazar.com

*/

#include <Servo.h>
Servo servo;
#define Pot A0

void setup()
{
  Serial.begin(9600);
  servo.attach(3);
}

void loop()
{
  int angle = analogRead(Pot);
  servo.write(map(angle, 0, 1023, 0, 180));
  Serial.println(servo.read());
}

نتیجه‌گیری

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

خواندن 18345 دفعه
داوود درستکار

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

کاربرانی که در این گفتگو شرکت کرده اند

نظرات (22)

  1. javanali

سلام
وقت بخیر
آیا امکان راه اندازی دو تا انکودر با بردآردوینو Uno هست؟

 
  1. پشتیبانی    javanali

سلام دوست عزیز

شما می تونید از همون برد آردوینو Uno با استفاده از Pin Change interrupts و کتابخونه اینتراپت استفاده کنید و دو انکودر رو راه اندازی کنید. به لینک زیر مراجعه کنید:

https://bit.ly/33M97MN

موفق باشید

 
  1. Shayan

سلام
امکانش هست که بعد از پروگرام کردن آردوینو اونو از کامپیوتر جدا کرد و بدون اتصال به کامپیوتر از اون استفاده کرد؟؟

 
  1. پشتیبانی    Shayan

سلام شایان عزیز
بله می تونید بعد از پروگرم کردن بردتون از منبع تغذیه مناسب مثل 9 ولت برای برد استفاده کنید.
موفق باشید

 
  1. S

باسلام و احترام و خسته نباشید
برای پروژه ردیاب خورشیدی با آردوینو تمام وسایل بالا لازم است؟ باتشکر

 
  1. پشتیبانی    S

با سلام
به آموزش "ساخت دنبال کننده خورشید با آردوینو و با کمترین هزینه" در لینک زیر مراجعه کنید. لیست تمامی قطعات بیان شده:
https://bit.ly/2ErGWZR
با تشکر

 
  1. S

باسلام و احترام عذرخواهی میکنم بابت سوالهای متعدد. و ممنون از پاسخگوییتان
برای ساخت پروژه ردیاب خورشیدی با آردوینو چه نوع ماژول انکوردری و خازن چند ولت لازم است؟
سوال دوم اینکه از بعد از وصل کردن و لحیم مقاومت ها و ال دی آر ها. برای راه اندازی...

باسلام و احترام عذرخواهی میکنم بابت سوالهای متعدد. و ممنون از پاسخگوییتان
برای ساخت پروژه ردیاب خورشیدی با آردوینو چه نوع ماژول انکوردری و خازن چند ولت لازم است؟
سوال دوم اینکه از بعد از وصل کردن و لحیم مقاومت ها و ال دی آر ها. برای راه اندازی موتورها و برنامه نویسی آردوینو از کجا باید شروع کرد. متشکرم

ادامه مطلب
 
  1. پشتیبانی    S

سلام دوست عزیز
برای آموزش "ساخت دنبال کننده خورشید با آردوینو و با کمترین هزینه" موجود در سایت صنعت بازار, از سروو موتور استفاده شده و نیازی به استفاده از انکودر نیست. در نهایت پس از مواردی که ذکر کردید, همانطور که در آموزش عنوان شده, نیاز است تا...

سلام دوست عزیز
برای آموزش "ساخت دنبال کننده خورشید با آردوینو و با کمترین هزینه" موجود در سایت صنعت بازار, از سروو موتور استفاده شده و نیازی به استفاده از انکودر نیست. در نهایت پس از مواردی که ذکر کردید, همانطور که در آموزش عنوان شده, نیاز است تا برنامه را توسط Arduino IDE پروگرم و اجرا کنید.
موفق باشید

ادامه مطلب
 
  1. S

باسلام و احترام و تشکر از پاسخگوییتان ممنون میشوم بفرمایید نوع سروو موتور برای ردیاب خورشیدی 180 درجه باشد یا 360 درجه ؟

 
  1. پشتیبانی    S

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

 
  1. Y

سلام میشه یه توضیح کلی از کاربرد انکودر بگید و اینکه آیا کاربرد زیادی داره یا نه چون من زیاد چیزی متوجه نشدم از متن بالا در مورد انکودر و اینکه بعضی جاها تو کدها دو تا علامت بعلاوه و یا منها میزارین چی کار می‌کنه ؟
لطفاً سریع جواب بدید

 
  1. پشتیبانی    Y

سلام دوست عزیز
توضیحات انکودر که کاملا در این آموزش داده شده. از نظر کاربرد به عنوان مثال در کنترل موقعیت یک ربات برای اینکه متوجه بشید لینک ربات در چه موقعیتی قرار گرفته نیاز دارید تا میزان چرخش موتور متصل به آن را در لحظه بدونید که از انکودر...

سلام دوست عزیز
توضیحات انکودر که کاملا در این آموزش داده شده. از نظر کاربرد به عنوان مثال در کنترل موقعیت یک ربات برای اینکه متوجه بشید لینک ربات در چه موقعیتی قرار گرفته نیاز دارید تا میزان چرخش موتور متصل به آن را در لحظه بدونید که از انکودر استفاده میشه. کاربرد خیلی خیلی زیادی داره.
علامت ++ یا -- به ترتیب در هر حلقه یک واحد به اون متغیر اضافه یا از اون کم میشه.
موفق باشید

ادامه مطلب
 
  1. امیر

سلام وقت بخیر . خیلی خوب و با محتوا آموزش دادین . من تازه اردوینو را شروع کردم ولی قبلاً با pic و avr کار کردم . اما در اردوینو تایمر ها و CCP ها چگونه هستند؟ مثلا میخواهیم تایمری جدا گانه کار کند و pwm هم جداگانه کار میکند و یا خواندن عرض پالس...

سلام وقت بخیر . خیلی خوب و با محتوا آموزش دادین . من تازه اردوینو را شروع کردم ولی قبلاً با pic و avr کار کردم . اما در اردوینو تایمر ها و CCP ها چگونه هستند؟ مثلا میخواهیم تایمری جدا گانه کار کند و pwm هم جداگانه کار میکند و یا خواندن عرض پالس بطور جداگانه ؟ من میخواهم پروژه ای انجام بدم که عرض پالس را بخواند و متناسب یک pwm راه‌اندازی و کار کند و بدون وقفه باشد . 09121549501 مهرانفر

ادامه مطلب
 
  1. پشتیبان    امیر

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

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

ادامه مطلب
 
  1. Sama

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

 
  1. پشتیبان    Sama

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

 
  1. میلاد

سلام من یه سروو گرفتم اما وقتی وصل میکنم به اردینو میلرزه و نهایتا ۱۰ درجه نوسان میکنه . استپر ۳۶۰ درجه که امتحان کردم درست بود چرخش داشت سرعت رو با پتانسیومتر کم و زیاد هم میکردم. اما ۱۸۰ درجه رو که وصل کردم یا میلرزید یا مداوم تو ۱۰ درجه نوسان...

سلام من یه سروو گرفتم اما وقتی وصل میکنم به اردینو میلرزه و نهایتا ۱۰ درجه نوسان میکنه . استپر ۳۶۰ درجه که امتحان کردم درست بود چرخش داشت سرعت رو با پتانسیومتر کم و زیاد هم میکردم. اما ۱۸۰ درجه رو که وصل کردم یا میلرزید یا مداوم تو ۱۰ درجه نوسان میکرد. ممنون میشم راهنمایی کنید

ادامه مطلب
 
  1. مهدی    پشتیبان

سلام. تغذیه موتور رو از ۵ ولت آردوینو نگیر . یا اگه گرفتی یه خازن ۱۰۰۰ میکرو بزار بین مثبت و منفی تغذیه .

 
  1. میلاد    پشتیبان

نه متاسفانه همون کد رو با سروو موتور 360 درجه و اتصال پتانسومتر راه انداختم. میچرخید سمت و سرعتش هم میشد با پتانسومتر تغیر داد . اما سروو 180 کار نمیکنه

 
  1. پشتیبان    میلاد

با این توضیحات به نظر میرسه که موتورتون خراب شده.

 
هیچ نظری در اینجا وجود ندارد

نظر خود را اضافه کنید.

ارسال نظر بعنوان یک مهمان
پیوست ها (0 / 3)
مکان خود را به اشتراک بگذارید

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

ما را دنبال کنید:

Copyright © 2017-2018 | Sanatbazar.com