آموزش کنترل موتور DC با آردوینو

در این جلسه به آموزش کنترل موتور DC با آردوینو می‌پردازیم. نگاه کلی‌ای به تکنولوژی‌های اساسی جهت کنترل موتور DC خواهیم داشت و سپس دو مثال می‌زنیم که از طریق آنها کنترل موتور DC با استفاده از درایور L298N و بُرد آردوینو شرح داده می‌­شود.

آموزش کنترل موتور DC با آردوینو

کنترل PWM موتور DC

PWM یا مدولاسیون پهنای باند تکنیکی است که به ما امکان تغییر مقدار متوسط ولتاژ که به دستگاه الکترونیکی داده می‌­شود، از طریق خاموش و روشن کردن منبع تغذیه با سرعت بسیار زیاد را می­‌دهد. مقدار میانگین ولتاژ به دوره کاری (duty cycle) و یا به عبارت دیگه به نسبت مقدار زمانی که سیگنال در حالت روشن است به مقدار زمان خاموش بودن آن در یک دوره تناوب، بستگی دارد.

                                                            مدولاسیون پهنای باند

آموزش کنترل موتور DC با آردوینو

در نتیجه، بسته به اینکه اندازه موتور چقدر باشد، به سادگی می­‌توانیم خروجی یک PWM آردوینو را به بیس یک ترانزیستور و یا به گیت یک ماسفت (MOSFET) متصل کرده و سرعت موتور را از طریق خروجی PWM کنترل کنیم. PWM آردوینوی کم مصرف، گیت ماسفت را که موتور فوق قوی از طریق آن درایو می‌­شود، توسط سیگنال مربوطه مرتبا خاموش و روشن می­‌کند.

آموزش کنترل موتور DC با آردوینو

تذکر: زمین الکتریکی آردوینو و همچنین زمین منبع تغذیه موتور باید به یکدیگر متصل شوند.

کنترل پل H موتور DC

از طرف دیگر، برای کنترل کردن جهت چرخش تنها نیاز است که جهت جریان شارش یافته در موتور را برعکس کنیم و رایج‌ترین روش انجام این کار، استفاده از پل H یا H-Bridge است.

یک مدار پل H شامل چهار عنصر سوئیچینگ، تعدادی ترانزیستور یا ماسفت است . همچنین موتور در مرکز این ساختار H شکل قرار می‌­گیرد. با فعال‌سازی همزمان دو تا از عناصر سوئیچینگ، می‌توانیم جهت جریان را تغییر دهیم. بدین ترتیب جهت چرخش موتور تغییر خواهد کرد.

                                                                 پل – H

آموزش کنترل موتور DC با آردوینو

در نتیجه اگر این دو روش یعنی PWM و پل H را ترکیب کنیم، کنترل کامل بر موتور DC حاصل می‌­شود. درایورهای متنوعی برای موتور DC وجود دارد که این ویژگی را داشته باشند و L298N یکی از آنها است.

درایور L298N

L298N یک درایور پل H دوگانه است که امکان کنترل سرعت و جهت دو موتور DC متفاوت را به طور همزمان، فراهم می‌­کند. این ماژول می‌تواند موتور‌های DC با ولتاژ 5 الی 35 ولت و همچنین جریان بیشینه تا 2 آمپر را هدایت کند.

آموزش کنترل موتور DC با آردوینو

بیایید نگاه دقیق‌تری به پایه‌های خروجی ماژول L298N داشته باشیم و روش کارکرد آن را توضیح دهیم. ماژول دو پایانه منحنی برای موتور A و B و همچنین یک بلوک پایانه منحنی دیگر برای پین زمین الکتریکی، تغذیه Vcc برای موتور و یک پین 5 ولت که می‌تواند ورودی و یا خروجی باشد، دارد.

آموزش کنترل موتور DC با آردوینو

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

باید توجه داشته باشیم که این تراشه باعث افت ولتاژ حدود 2 ولت می‌­شود. در واقع اگر از منبع تغذیه 12 ولتی استفاده کنیم، ولتاژ در پایانه‌های موتور 10 ولت خواهد بود. این بدان معناست که ما نمی­‌توانیم بیشینه سرعت موتور DC 12 ولتی را داشته باشیم.

مطلب پیشنهادی:  آموزش راه اندازی ماژول +nRF24L01

آموزش کنترل موتور DC با آردوینو

سپس پین‌های کنترلی منطقی را مشاهده می­‌کنیم. فعال‌ساز‌های A و B جهت فعال‌سازی کنترل کننده سرعت موتور به کار می‌­روند. اگر یک سیم اتصال به این پین متصل باشد، موتور فعال‌سازی شده و با بیشینه سرعت شروع به کار می­‌کند. همچنین اگر سیم اتصال را قطع کنیم، می­‌توانیم یک ورودی PWM به این پین متصل کرده و به این صورت سرعت موتور را کنترل کنیم. اگر این پین را به زمین مدار متصل کنیم، موتور متوقف خواهد شد.

آموزش کنترل موتور DC با آردوینو

سپس، پین‌های ورودی 1 و 2 برای کنترل جهت چرخش موتور A و ورودی‌های 3 و 4 برای موتور B استفاده می­‌شوند. با استفاده از این پین‌ها ما در واقع سوئیچ‌های پل H درون تراشه L298N را کنترل می­‌کنیم. اگر ورودی 1 غیرفعال و ورودی 2 فعال باشد، موتور در جهت رو به جلو حرکت می­کند و همینطور برعکس یعنی اگر ورودی 1 فعال و ورودی 2 غیرفعال باشد، موتور در خلاف جهت حرکت خواهد کرد.

در حالتی که هر دو ورودی مشابه یکدیگر باشند، چه هر دو فعال و چه غیرفعال، موتور متوقف خواهد شد. پین‌های ورودی 3 و 4 نیز عملکرد مشابهی برای موتور B خواهند داشت.

آردینو و L298N

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

آموزش کنترل موتور DC با آردوینو

پس یک درایور L298N، یک موتور DC، یک پانسیومتر، یک کلید فشاری و همچنین یک برد آردینو نیاز داریم.

  • L298N
  • موتور DC با گشتاور زیاد 12 ولتی ۲ عدد
  • چرخ تایر پلاستیکی (فک کنم بهش چرخ هرزگرد هم میگن عکس را ببینید.)
  • برد آردوینو
  • برد بورد و سیم‌های اتصال

کد آردوینو کنترل موتور DC با آردوینو

در اینجا کد مربوط به این پروژه را مشاهده می­‌کنید.

/*  Arduino DC Motor Control - PWM | H-Bridge | L298N  -  Example 01

    by Dejan Nedelkovski, www.HowToMechatronics.com
*/

#define enA 9
#define in1 6
#define in2 7
#define button 4

int rotDirection = 0;
int pressed = false;

void setup() {
  pinMode(enA, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(button, INPUT);
  // Set initial rotation direction
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
}

void loop() {
  int potValue = analogRead(A0); // Read potentiometer value
  int pwmOutput = map(potValue, 0, 1023, 0 , 255); // Map the potentiometer value from 0 to 255
  analogWrite(enA, pwmOutput); // Send PWM signal to L298N Enable pin

  // Read button - Debounce
  if (digitalRead(button) == true) {
    pressed = !pressed;
  }
  while (digitalRead(button) == true);
  delay(20);

  // If button is pressed - change rotation direction
  if (pressed == true  & rotDirection == 0) {
    digitalWrite(in1, HIGH);
    digitalWrite(in2, LOW);
    rotDirection = 1;
    delay(20);
  }
  // If button is pressed - change rotation direction
  if (pressed == false & rotDirection == 1) {
    digitalWrite(in1, LOW);
    digitalWrite(in2, HIGH);
    rotDirection = 0;
    delay(20);
  }
}

شرح کد

ابتدا باید پین‌ها و تعدادی متغیر که برای نوشتن این برنامه به آنها نیاز داریم را تعریف کنیم. در بخش تنظیمات، باید حالت اولیه پین‌ها و همچنین جهت چرخش موتور را مشخص کنیم. در بخش loop، ابتدا مقدار پتانسیومتر را می‌خوانیم و سپس مقدار خوانده شده را که عددی در بازه 0 تا 1023 است به مقداری در بازه 0 تا 255 که معادل 0 تا 100 درصد برای چرخه تناوب سیگنال PWM می‌­باشد، تبدیل می­‌کنیم. سپس با استفاده از تابع ()analogWrite مقدار سیگنال PWM را به پین فعال­‌ساز بورد L298N که در واقع موتور را درایو می­‌کند، می‌­فرستیم.

سپس چک می­‌کنیم که آیا کلید فشرده شده است و اگر این اتفاق افتاده بود، جهت چرخش موتور را با تنظیم ورودی‌های 1 و 2 به صورت برعکس همدیگر تغییر می‌­دهیم. کلید فشاری به عنوان یک دکمه ضامن عمل می­‌کند و هر بار آن را بفشاریم، جهت چرخش موتور مجددا عوض خواهد شد.

خودرو رباتیکی کنترل شونده با L298N

به محض اینکه این کار را یاد گرفتیم، می­توانیم خودرو رباتیکی خود را با آردوینو بسازیم. مدار شماتیک این پروژه در زیر آورده شده است.

مطلب پیشنهادی:  قطعات و اجزای بردهای آردوینو

آموزش کنترل موتور DC با آردوینو

قطعاتی که به آنها نیاز داریم عبارت اند از: دو عدد موتور DC، یک درایور L298N، یک بورد آردوینو و یک فرمان هدایت کننده.

برای تامین برق مورد نیاز، از سه باتری 3.7V Li-ion استفاده می‌کنیم تا بتوانند در مجموع 11V مورد نیاز را تامین کنند. ما شاسی خودرو را از تخته‌ی سه لا با ضخامت 3 میلی‌متر ساختیم و با استفاده از بست‌های فلزی، موتور را به آن متصل کردیم. چرخ‌ها را به موتور و همچنین یک چرخ گردان نیز به جلوی شاسی خودرو اضافه کردیم.

آموزش کنترل موتور DC با آردوینو

حالا نگاهی به کد آردوینو می‌­اندازیم و می­‌بینیم چگونه عمل می­‌کند. (کد به صورت کامل در زیر موجود است)

int xAxis = analogRead(A0); // Read Joysticks X-axis
int yAxis = analogRead(A1); // Read Joysticks Y-axis

پس از تعریف بخش حلقه، با خواندن مقادیرمحورهای x و y مربوط به فرمان شروع می­‌کنیم. این فرمان در واقع از دو پتانسیومتر تشکیل شده است که به ورودی آنالوگ آردوینو متصل شده‌اند و مقداری بین 0 تا 1023 دارند. وقتی فرمان در حالت مرکزی آن قرار گیرد، مقدار هر دو پتانسیومتر حدود 512 است.

آموزش کنترل موتور DC با آردوینو

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

سپس مقادیر کم شونده از 470 تا 0 را به یک موج PWM با مقادیر افزاینده از 0 تا 255 که در واقع سرعت موتور است، تبدیل می­‌کند.

// Y-axis used for forward and backward control
  if (yAxis < 470) {
    // Set Motor A backward
    digitalWrite(in1, HIGH);
    digitalWrite(in2, LOW);
    // Set Motor B backward
    digitalWrite(in3, HIGH);
    digitalWrite(in4, LOW);
    // Convert the declining Y-axis readings for going backward from 470 to 0 into 0 to 255 value for the PWM signal for increasing the motor speed
    motorSpeedA = map(yAxis, 470, 0, 0, 255);
    motorSpeedB = map(yAxis, 470, 0, 0, 255);
  }

به طور مشابه اگر فرمان را در جهت محور y رو به جلو حرکت دهیم، مقدار متغیر بیشتر از 550 می‌­شود. در این حالت موتور‌ها را در حالت حرکت به سمت جلو قرار داده و مقادیر خوانده شده از 550 تا 1023 را به بازه 0 تا 255 برای موج PWM تبدیل می­‌کند. اگر فرمان در حالت مرکزی خودش بماند، سرعت موتور‌ها برابر صفر خواهد شد.

حالا بیایید عملکرد محور x را برای کنترل خودرو در جهت چپ یا راست بررسی کنیم.

// X-axis used for left and right control
  if (xAxis < 470) {
    // Convert the declining X-axis readings from 470 to 0 into increasing 0 to 255 value
    int xMapped = map(xAxis, 470, 0, 0, 255);
    // Move to left - decrease left motor speed, increase right motor speed
    motorSpeedA = motorSpeedA - xMapped;
    motorSpeedB = motorSpeedB + xMapped;
    // Confine the range from 0 to 255
    if (motorSpeedA < 0) {
      motorSpeedA = 0;
    }
    if (motorSpeedB > 255) {
      motorSpeedB = 255;
    }
  }

به طور مشابه، اول باید مقادیر خوانده شده از روی محور x را به مقادیر متناظر برای سرعت که بین 0 تا 255 است، تبدیل کنیم. برای حرکت به سمت چپ ما از این مقدار خوانده شده برای کاهش سرعت موتور سمت چپی و افزایش موتور سمت راستی استفاده می‌کنیم.

در اینجا به دلیل وجود توابع محاسباتی، از دو عبارت if جهت تعریف سرعت موتورها در بازه 0 تا 255 استفاده شده است.

آموزش کنترل موتور DC با آردوینو

همچنین برای هدایت کردن خودرو به سمت راست نیز از روش مشابهی استفاده می­‌شود. بسته به ولتاژ اعمالی و خود موتور، در سرعت‌های کم موتور قادر به شروع حرکت نیست و صدای ناچیزی تولید می­‌کند. در مورد پروژه ما، اگر مقدار سیگنال PWM کمتر از 70 باشد، این اتفاق رخ می­‌دهد یعنی موتور قادر به حرکت نخواهد بود. از این رو با استفاده از آن دو عبارت if بازه سرعت از 70 تا 255 در نظر گرفته شد.

مطلب پیشنهادی:  برنامه نویسی آردوینو – عملگرها

در نهایت، مقادیر سرعت موتور‌ها و یا سیگنال PWM را به پین‌های فعال‌ساز درایور L298N ارسال می­‌شود.

// Prevent buzzing at low speeds (Adjust according to your motors. My motors couldn't start moving if PWM value was below value of 70)
  if (motorSpeedA < 70) {
    motorSpeedA = 0;
  }
  if (motorSpeedB < 70) {
    motorSpeedB = 0;
  }
  analogWrite(enA, motorSpeedA); // Send PWM signal to motor A
  analogWrite(enB, motorSpeedB); // Send PWM signal to motor B

در زیر کد کامل پروژه‌ی ربات خودرو با آردینو در دسترس است.

/* Arduino DC Motor Control - PWM | H-Bridge | L298N Example 02 - Arduino Robot Car Control by Dejan Nedelkovski, www.HowToMechatronics.com */ #define enA 9 #define in1 4 #define in2 5 #define enB 10 #define in3 6 #define in4 7 int motorSpeedA = 0; int motorSpeedB = 0; void setup() { pinMode(enA, OUTPUT); pinMode(enB, OUTPUT); pinMode(in1, OUTPUT); pinMode(in2, OUTPUT); pinMode(in3, OUTPUT); pinMode(in4, OUTPUT); } void loop() { int xAxis = analogRead(A0); // Read Joysticks X-axis int yAxis = analogRead(A1); // Read Joysticks Y-axis // Y-axis used for forward and backward control if (yAxis < 470) { // Set Motor A backward digitalWrite(in1, HIGH); digitalWrite(in2, LOW); // Set Motor B backward digitalWrite(in3, HIGH); digitalWrite(in4, LOW); // Convert the declining Y-axis readings for going backward from 470 to 0 into 0 to 255 value for the PWM signal for increasing the motor speed motorSpeedA = map(yAxis, 470, 0, 0, 255); motorSpeedB = map(yAxis, 470, 0, 0, 255); } else if (yAxis > 550) { // Set Motor A forward digitalWrite(in1, LOW); digitalWrite(in2, HIGH); // Set Motor B forward digitalWrite(in3, LOW); digitalWrite(in4, HIGH); // Convert the increasing Y-axis readings for going forward from 550 to 1023 into 0 to 255 value for the PWM signal for increasing the motor speed motorSpeedA = map(yAxis, 550, 1023, 0, 255); motorSpeedB = map(yAxis, 550, 1023, 0, 255); } // If joystick stays in middle the motors are not moving else { motorSpeedA = 0; motorSpeedB = 0; } // X-axis used for left and right control if (xAxis < 470) { // Convert the declining X-axis readings from 470 to 0 into increasing 0 to 255 value int xMapped = map(xAxis, 470, 0, 0, 255); // Move to left - decrease left motor speed, increase right motor speed motorSpeedA = motorSpeedA - xMapped; motorSpeedB = motorSpeedB + xMapped; // Confine the range from 0 to 255 if (motorSpeedA < 0) { motorSpeedA = 0; } if (motorSpeedB > 255) { motorSpeedB = 255; } } if (xAxis > 550) { // Convert the increasing X-axis readings from 550 to 1023 into 0 to 255 value int xMapped = map(xAxis, 550, 1023, 0, 255); // Move right - decrease right motor speed, increase left motor speed motorSpeedA = motorSpeedA + xMapped; motorSpeedB = motorSpeedB - xMapped; // Confine the range from 0 to 255 if (motorSpeedA > 255) { motorSpeedA = 255; } if (motorSpeedB < 0) { motorSpeedB = 0; } } // Prevent buzzing at low speeds (Adjust according to your motors. My motors couldn't start moving if PWM value was below value of 70) if (motorSpeedA < 70) { motorSpeedA = 0; } if (motorSpeedB < 70) { motorSpeedB = 0; } analogWrite(enA, motorSpeedA); // Send PWM signal to motor A analogWrite(enB, motorSpeedB); // Send PWM signal to motor B }

به انتهای اموزش این پروژه رسیدیم. در قسمت‌های بعدی به این پروژه بخش‌های جدید شامل بلوتوث و وسایل رادیویی جهت فعال‌سازی گوشی هوشمند و کنترل از راه دور اضافه خواهد شد.

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

همچنین لطفا اپلیکیشن اندویدی ما را هم نصب کنید.

دانلود اپلیکیشن میکرو دیزاینر الکترونیک

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

6 دیدگاه

  1. سیداحمد محمدی

    سلام جمله زکات علم آموزش به دیگران است از اینکه با من هم عقیده هستید خوشحالم در مورد عیوب اتو مبیل های for weel drive هر سوعالی باشد تلفنی پاسخ گو هستم

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

  3. سلام
    من موتور 24 ولت دارم
    باید چه کنم