Mohsen Khoshnazar Homepage

Mohsen Khoshnazar Homepage
سلام به همه.
سعی می کنم تجربیات خودم رو در این وبلاگ قرار بدم تا دیگر علاقه مندان نیز بتوانند از آنها استفاده کنند.
موفق باشید:)

Telegram Channel: mohsenteq
Instagram: mohsenteq
Site: www.mteq.ir
دنبال کنندگان ۱ نفر
این وبلاگ را دنبال کنید
آخرین نظرات
جمعه, ۲۱ ارديبهشت ۱۳۹۷، ۱۱:۲۲ ق.ظ

طراحی اکشن برای بازوی رباتیک با آردوینو

سلام به همه.

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

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

   چون تعداد سروها و حرکات دست پیچیده است، استفاده از ژوئیستیک و حرکت دادن تک تک سروها کاری مشکل و بی‌نتیجه خواهد بود؛ از این رو برای بازو و کلن برای ربات‌]ای انسان‌نما، اکشن تعریف می‌شود. هر اکشن مجموعه‌ای از حرکات سروموتورها است. مثلاً فرض کنید می‌خواهیم بازو بالا رود و برای ربات برای اپراتور دست تکان بدهد. مراحل زیر باید انجام شود:

  • سرو موتور شماره 1 بازو را بالا ببرد (یعنی از زاویه صفر به زاویه 180 درجه برود).

  • سرو موتور شماره 2 از زاویه صفر تا زاویه 60 درجه حرکت کند.

  • سروموتور شماره 2 از زاویه 60 به زاویه صفر حرکت کند.

  • مراحل 2 و 3 به تعداد دلخواه تکرار شوند.

  • سرو موتور شماره 2 به زاویه صفر برگردد.

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

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

   در این مدار، از پتانسیومتر 10 کیلو اهمی استفاده کردیم و پایه وسط آن به پایه A03 میکرو نانو متصل شده است. همچنین پایه سیگنال سروموتور نیز به پایه D05 میکرو وصل شده است. برای نمایش مقدار زیاویه نیز از خواندن پورت سریال در کامپایلر آردوینو استفاده کرده‌ایم. و اما کد مربوط به این قسمت رو باهم بررسی کنیم.

#include <Servo.h>

Servo sMotor;
const int pinPot = A3;

int preVal = 0;
const int error = 2;

void setup() {
  sMotor.attach(5);
  Serial.begin(9600);
}

void loop() {
  digitalWrite(LED_BUILTIN, LOW); 
  int newVal = analogRead(pinPot);
  newVal = map(newVal, 0, 1023, 0, 180);
  
  if (abs(newVal - preVal) >= error){
    digitalWrite(LED_BUILTIN, HIGH);
    Serial.println(newVal);
    
    preVal = newVal;
    sMotor.write(newVal);  
    delay(5);
 }
}

   ابتدا کتابخانه مربوط به کنترل سروموتورها را در برنامه وارد می‌کنیم. سپس یک سروموتور تعریف می‌کنیم. پایه مربوط به ورودی پتانسیومتر را پین A03 در نظر می‌گیریم. متغیر preVal مقدار قبلی خوانده شده از پتانسیومتر را در خود ذخیره می‌کند. مقدار ثابت error نیز میزان تفاضل بین مقدار فعلی و مقدار قبلی پتانسیومتر را نشان می‌دهد.

   در قسمت setup پین خروجی سیگنال کنترلی سروموتور را پین D05 تعریف می‌کنیم. دقت کنید که سروموتورها باید حتماً به پین‌]ای مربوط به PWM میکرو متصل شوند. همچنین پورت سریال را برای خواندن و نمایش مقادیر آماده می‌کنیم.

   در حلقه اصلی برنامه مقدار پتانسیومتر را در هر لحظه خوانده و آن را به مقداری بین صفر تا 180 تبدیل می‌کنیم. با این کار زاویه حرکت سروموتور بدست می‌آید. سپس در صورتی که قدر مطلق تفاضل بین مقدار خوانده شده کنونی (newVal) و مقدار خوانده شده قبلی (preVal) بیشتر از مقدار error باشد، LED روی پایه 13 روشن، مقدار زاویه به کاربر نمایش و به سروموتور منتقل می‌شود.

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

   حالا نوبت به قسمت دوم برنامه می‌رسد. در اینجا سروموتورها را به ترتیب به پایه‌های D06، D05، D05 و D09 متصل می‌کنیم. توصیه می‌شود که برای تغذیه سروها از یک منبع تغذیه آزمایشگاهی یا سوئیچینگ استفاده کنید تا به رگولاتور روی برد میکرو نانو فشار نیاید.

   اکنون قسمت دوم برنامه را نگاه کنیم.

#include <Servo.h>

Servo servo_motor_1, servo_motor_2, servo_motor_3, servo_motor_4;

int s1[] = {180, 0, 0, 0, 0, 0, 0, 0, 0, 180};
int s2[] = {70, 20, 110, 20, 110, 20, 110, 20, 110, 70};
int s3[] = {90, 90, 90, 90, 90, 90, 90, 90, 90, 90};
int s4[] = {60, 60, 60, 60, 60, 60, 60, 60, 60, 60};

void setup() {
  servo_motor_1.attach(3);
  servo_motor_2.attach(5);
  servo_motor_3.attach(6);
  servo_motor_4.attach(9);

  servo_motor_1.write(s1[0]);
  servo_motor_2.write(s2[0]);
  servo_motor_3.write(s3[0]);
  servo_motor_4.write(s4[0]);
}

void loop() {
  delay(1000);
  for(int i = 0; i < 10; i++){
    servo_motor_1.write(s1[i]);
    servo_motor_2.write(s2[i]);
    servo_motor_3.write(s3[i]);
    servo_motor_4.write(s4[i]);
    delay(400);   
  }
  delay(1000);
}

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

موفق باشید.


دریافت
حجم: 10 مگابایت
توضیحات: Robotic Arm

نظرات (۰)

هیچ نظری هنوز ثبت نشده است

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی