شما به اینترنت متصل نیستید.
معرفی و راه‌اندازی پتانسیومتر، انکودر و سروو موتور با آردوینو
نویسنده:
امتیاز دهید

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

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

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

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

برد آردوینو UNO R3
برد آردوینو و کابل رابط
1 عدد
پتانسیومتر 10kΩ
1 عدد
انکودر نسبی
1 عدد
سروو موتور SG90
سروو موتور
1 عدد
خازن 470μF
1 عدد
برد بورد
1 عدد
سیم جامپر(1بسته)
1 عدد

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

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

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

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

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

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

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

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

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

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

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

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

مشاهده تصویر
فریتزینگ پتانسیومتر

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

/*
automee
Arduino Tutorial Series
Author: Davood Dorostkar
Website: www.automee.ir

*/

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 ها فعال شده و زاویه انکودر را یک واحد تغییر می‌دهند.

/*
automee
Arduino Tutorial Series
Author: Davood Dorostkar
Website: www.automee.ir

*/

#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)

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

/*
automee
Arduino Tutorial Series
Author: Davood Dorostkar
Website: www.automee.ir

*/

#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)

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

/*
automee
Arduino Tutorial Series
Author: Davood Dorostkar
Website: www.automee.ir

*/

#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 است که با استفاده از آن می‌توانید زاویه لحظه‌ای موتور را بخوانید. سعی کنید کدی بنویسید که مقداری را از پتانسیومتر خوانده و به سروو موتور دستور حرکت بدهد و در نهایت زاویه لحظه‌ای سروو موتور را خوانده و نمایش دهد. برنامه زیر این کار را برایتان انجام می‌دهد. می‌توانید آن را با کد خودتان مقایسه کنید.

/*
automee
Arduino Tutorial Series
Author: Davood Dorostkar
Website: www.automee.ir

*/

#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());
}

نتیجه‌گیری

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

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

معرفی و راه‌اندازی ماژول فاصله‌سنج التراسونیک با آردوینو
معرفی و راه‌اندازی ماژول فاصله‌سنج التراسونیک با آردوینو
در این آموزش به معرفی و نحوه راه اندازی سنسور التراسونیک به کمک آردوینو در شرایط کاری مختلف خواهیم پرداخت.
زمان مطالعه: 16 دقیقه
آیا این مطلب برایتان مفید بود؟
بله خیر
تاکنون هیچ نظری ثبت نشده است.
برای ثبت نظر وارد حساب کاربری خود شوید.