آردوینو درایور موتور پروژه های آردوینو

کنترل دور و جهت موتور از طریق ویندوز به کمک آردویینو و زبان #C-قسمت دوم

نوشته شده توسط معین صابری

در قسمت پیشین، به طراحی نرم افزار تحت ویندوز، به کمک زبان #C در محیط ویژوال استودیو به منظور کنترل دور موتور و جهت موتور پرداختیم. در این آموزش، بخش سخت افزاری پروژه را مطرح می نماییم. مشابه آموزش های پیشین، هسته پردازشی در این آموزش، برد آردویینو UNO در نظر گرفته شده است. این برد به کمک رابط سریال UART خود، به رایانه متصل شده و فرامین ارسالی از سوی ویندوز را دریافت می نماید. آردویینو پس از دریافت فرامین کنترلی موتور، آن ها را به کمک درایور موتور، بر موتور اعمال می نماید. در این آموزش به برنامه نویسی و طراحی مدار می پردازیم. در ادامه با مرجع تخصصی آردوینو به زبان فارسی دیجی اسپارک همراه باشید.

 


کاربرد کنترل موتور DC از طریق ویندوز


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

 


درایور موتور L298D


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

اتصال آرمیچر به آردوینو Arduino - دیجی اسپارک

 

به کمک مدار فوق می توانیم دور موتور را از طریق PWM کنترل نماییم. اما مدار فوق، تنها قادر است تا موتور را در یک جهت به گردش درآورد. به عبارت دیگر، مدار فوق، قابلیت کنترل دور موتور را دارد، اما قادر به کنترل جهت آن نیست. در صورتیکه در پروژه ای نیاز باشد تا علاوه بر دور، جهت نیز کنترل شود، می بایست از درایور موتور L298 استفاده نماییم. این درایور می تواند علاوه بر دور موتور، جهت آن را نیز کنترل نماید. ماژول این درایور ولتاژ های ۵ و ۱۲ را به عنوان ورودی می پذیرد. همچنین این درایور موتور قادر است تا جریانی تا حدود ۲  آمپر را از خود عبور دهد. از طرف دیگر، این ماژول دوکاناله بوده و می تواند دو موتور را به صورت جداگانه، درایو نماید.

پروژه کنترل موتور با درایور موتور L298 و جوی استیک آردوینو - دیجی اسپارک

جهت اطلاعات بیشتر در زمینه راه اندازی موتور با این درایور، این آموزش که پیشتر توسط همکارم منتشر شده است را مطالعه نمایید.

 


شماتیک و اتصالات


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

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

-پایه ENA ماژول به پایه ۳(در صورت وجود جامپر روی این پایه، آن را برداشته و پایه ENA را به پایه شماره ۳ آردویینو متصل نمایید)

-پایه IN1 ماژول به پایه شماره ۴ آردویینو

-پایه IN2 ماژول به پایه شماره ۵ آردویینو

-پایه GND ماژول علاوه بر GND تغذیه، به یکی از پایه های GND آردویینو متصل گردد.

-پایه OUT1 ماژول به یکی از پایه های تغذیه موتور و پایه OUT2 به پایه دیگر متصل گردد

توجه: برای تغذیه ماژول درایور موتور از یک آداپتور جداگانه ۵V (برای یک موتور ۵ ولتی) استفاده نموده و با توجه به تغذیه آردویینو از لپ تاپ، جهت حفاظت از پورت USB لپ تاپ، تغذیه ماژول درایور موتور و موتور الکتریکی از آردویینو متصل به رایانه، توصیه نمی گردد.

 


نحوه کنترل موتور از طریق ویندوز


همانطور که اطلاع دارید، برد آردویینو UNO یک رابط سریال به USB بر روی خود دارد، این رابط پایه های RX و TX (پایه های شماره ۰ و ۱ آردویینو) را به مبدل متصل می نماید. از طرفی دیگر، با اتصال برد آردویینو به رایانه از طریق کابل USB، یک پورت سریال به آردویینو اختصاص داده شده و به کمک این پورت می توانیم برنامه های خود را به آردویینو انتقال دهیم. در برنامه #C، به کمک پورت اختصاص داده شده توسط ویندوز، به آردویینو متصل شده و فرامین خود را به آن ارسال می نماییم، همانند اتصال دو دستگاه سریال به یکدیگر،  نرخ ارسال(baudrate) سمت ویندوز و آردویینو هر دو به مقدار ۱۱۵۲۰۰ تعیین می شود.

برد آردوینو اونو Uno Arduino - دیجی اسپارک

 


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


در زیر، کدهای پروژه کنترل دور موتور و جهت موتور از طریق ویندوز را مشاهده می نمایید. این کدها بایستی روی برد آردوینو آپلود شوند.

#define pwm 3 //تعیین پایه ۳ آردویینو برای پالس pwm
#define L   4 //تعیین پایه شماره ۴ برای یک جهت از موتور
#define R   5 //تعیین پایه شماره ۵ برای جهت دیگر موتور
void setup() {
  Serial.begin(115200); //تعیین نرخ انتقال ۱۱۵۲۰۰
  pinMode(pwm, OUTPUT);
  pinMode(L, OUTPUT);
  pinMode(R, OUTPUT);
  digitalWrite(L, LOW);
  digitalWrite(R, LOW);
  analogWrite(pwm, 0);
}

void loop() {
  String data;//ذخیره داده دریافتی از سوی ویندوز  
  String command = "";  //متغیر جهت ذخیره فرمان چپ گرد/ راستگرد و یا پالس

  while (data.indexOf("!") == -1) {   //انتهای پیام ارسالی علامت ! قرار می گیرد، بنابراین تا دریافت پیام جدید، منتظر این کاراکتر می مانیم
    if (Serial.available() > 0)
      data.concat(char(Serial.read()));   //دریافت کاراکتر به کاراکتر داده و ذخیره آن در رشته data
  }
 for (int i = 0; i < data.length(); i++) {
    if (data.charAt(i) == 'L'){   //درصورت مشاهده عبارت L، یعنی فرمان چپ گرد از سوی ویندوز ارسال شده است
      command = "L";
      break;
    }
    else if (data.charAt(i) == 'R'){   //دریافت فرمان راستگرد 
      command = "R";
      break;
    }
    }
 
  if (command == "L") {
    digitalWrite(L, HIGH);  //برای چرخیدن موتور در جهت چپگرد، پایه چپ را یک  منطقی و راست را صفر می کنیم
    digitalWrite(R, LOW);
  }
  else if ( command == "R") {   //برای جهت راستگرد موتور، پایه چپ را صفر و پایه راست را یک منطقی می نماییم
    digitalWrite(L, LOW);
    digitalWrite(R, HIGH);
  }
  else{
    analogWrite(pwm, map(data.toInt(), 0, 10, 0, 255));  //فرمانی غیر از چپ و راست یعنی پالس PWM دریافت شده است، از آنجاییکه ولوم نرم افزار #C عددی بین ۰ تا ۱۰ تولید می کند، این عدد را به ۰ تا ۲۵۵ نگاشت می کنیم
  }
  data = ""; //پاکسازی متغیر data برای استفاده دفعات بعدی 
}

 

 


تحلیل کدهای برنامه


در ابتدای برنامه، پایه ۳ و ۴ و ۵ به ترتیب برای کنترل دور و جهت چپ و راست انتخاب می شوند، از آنجاییکه قرار است داده ها از سمت ویندوز با نرخ انتقال ۱۱۵۲۰۰ ارسال شده و آردویینو با سریال سخت افزاری داده ها را دریافت نماید، بنابرانی نرخ انتقال با دستور زیر تعیین می گردد.

Serial.begin(115200)

در برنامه، منتطر دریافت داده ای هستیم که انتهای آن ! قرار گرفته شده باشد، چراکه با توجه به کد نرم افزار ویندوزی، انتهای هر پیام ارسالی این علامت قرار می گیرد، بنابراین، در صورت دریافت پیام از سوی ویندوز، سه حالت وجود دارد:

-فرمان چپ گرد: !L

-فرمان راست گرد : !R

-دور موتور: !عدد

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

راه اندازی موتور DC با درایور موتور L298 از طریق ویندوز - دیجی اسپارک

 


وسایل مورد نیاز


برد آردویینو UNO (به کمک کابل USB، تغذیه تامین شده و فرامین کنترلی موتور از ویندوز دریافت می گردد)

ماژول درایور موتور L298

منبع تغذیه ۵ ولت

موتور DC (در این آموزش از یک موتور DC کوچک ۵ ولتی استفاده نموده ایم.)

 


جمع بندی


در این آموزش که در دو قسمت منتشر شد، به طراحی نرم افزاری، تحت ویندوز پرداختیم تا به کمک آن، یک موتور الکتریکی را کنترل نماییم. برای کنترل موتور از برد آردویینو uno و برای فرمان به موتور از درایور موتور L298 استفاده کردیم. از آنجاییکه برد آردویینو می تواند با اتصال به رایانه از طریق کابل USB، به ارسال و دریافت داده بپردازد، برنامه ای تحت زبان برنامه نویسی #C طراحی نموده و فرامین راست گرد، چپ گرد و دور  را به کمک پورت سریال آردویینو، به موتور خود ارسال می نماییم.

کنترل دور موتور آرمیچر با برد آردوینو از طریق ویندوز - دیجی اسپارک

 

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

 

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

معین صابری

کارشناسی ارشد رشته معماری سیستم های کامپیوتری

مالي که ز تو کس نستاند، علم است
حرزي که تو را به حق رساند، علم است
جز علم طلب مکن تو اندر عالم
چيزي که تو را ز غم رهاند، علم است
(شیخ بهایی)

تبادل نظر و رفع عیب با ثبت دیدگاه

۱۶ دیدگاه

  • سلام ببخشید من یک اشتباهی در سیم کشی انجام دادم به جای اینکه سیم vcc رو به پین ۵ولت متصل کنم به gndمتصل کردم و بجای اینکه gndرو بهgndمتصل کنم به ۵ولت متصل کردم
    دقیقا بر عکس
    میخواستم بدونم به اردوینو یا سروو موتور اسیبی نرسیده

    • سلام
      منظور شما اینست که سیم های تغذیه درایور موتور را اشتباه متصل کرده اید؟
      تغذیه درایور موتور را چگونه تامین کرده بودید؟

  • سلام خوبی میشه شماره واتس اپ‌بدی برای یه پروژه‌واقعا به کمکت نیاز دارم کد نویسی کردم ارور میده

    • سلام
      تنها سوالات مربوط به هر پست در انتهای آن پرسیده می شود. همچنین تنها راه پاسخ گویی به سوالات مرتبط، تنها از طریق ثبت نظر در انتهای هر مطلب است.

  • سلام وقت بخیر
    میخوام اطلاعات سرعت موتور رو با انکودر محاسبه کنم تو متلب نشون بدم.
    بعدش دوباره من مقداری که مدنظرمه سرعت رو تغییر بدم.
    از چه کدهایی استفاده کنن؟
    چه قطعاتی پیشنهاد میکنید؟
    موتور انکودر دار؟
    چه مدل درایو موتور؟
    مقاومت؟

    • سلام
      متاسفانه در این زمینه اطلاای ندارم، پیشنهاد می کنم دیگر دوستان در این زمینه بیان نظر نمایند.

  • سلام
    میخوام اطلاعات سرعت موتور dc رو با انکودر به دست بیارم(نمایش بدم تو متلب).
    و بعدش به سرعتی که مدنظرخودمه تغییرش بدم به وسیله متلب.
    از چه قطعاتی باید استفاده کنم؟
    آردینو uno?
    موتور dc انکودر دار؟
    مقاومت؟
    درایو موتور؟

  • سلام وقت بخیرعذر در مورد برنامه نویسی یک موتور به صورت ماژول بلوتوث چپ گرد راست گرد کنیم طریقه برنامه نویسی میاساخواستم ؟ باسپاس

  • سلام آیا می شود با همون ترانزیستو tip120 یک led 10v را هم راه اندازی کرد که بتونیم در اون با آردوینو شدت نور led رو کنترل کنیم و اگر ممکن نیست میتونید یک ترانزیستور یا ماسفت مناسب برای این کار معرفی بکنید؟؟؟

    • سلام
      بله امکان پذیر است
      باید به پارامترهایی نظیر جریان عبوری از ماسفت و میزان ولتاژ قابل تحمل آن دقت کنید.