کنترل موتور DC با آي سي درايور موتور L293D و آردوينو

4
619
نحوه کنترل موتور DC با استفاده از آي سي درايور موتور L293D و آردوينو

اگر در فکر ساخت یک ربات جدید هستید، لازم است نحوه کنترل موتور DC را یاد بگیرید. یکی از آسان‌ترین و ارزان‌ترین ابزار‌‌های کنترل موتور‌های DC بكارگيري آي سي درايور موتور L293D با استفاده از آردوینو است. این درایور مي‌تواند همزمان سرعت و جهت دوران دو موتور DC را کنترل کند. بعلاوه، با استفاده از آن مي‌توان یک استپ موتور تك قطبي نظير ۲۸BYJ-48 يا يك استپ موتور دو قطبي نظیر NEMA 17 را نیز کنترل نمود.

کنترل استپ موتور تك قطبي نظير 28BYJ-48 يا يك استپ موتور دو قطبي نظیر NEMA 17 با استفاده از آي سي درايور موتور L293D

کنترل موتور DC

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

  • تکنیک PWM: برای کنترل سرعت
  • تکنیک H-Bridge: برای کنترل جهت چرخش موتور

تکنیک PWM برای کنترل سرعت

کنترل سرعت موتور DC از طریق تغییر ولتاژ تغذیه موتور امکان پذیر است. یک تکنیک مرسوم برای این کار استفاده از روش مدولاسیون عرض پالس (PWM) است. در این تکنیک مقدار متوسط ولتاژ ورودی از طریق ارسال یکسری پالس‌‌های صفر و یک (ON-OFF) تنظیم مي‌شود. مقدار متوسط ولتاژ، متناسب با عرض پالس که duty cycle ناميده مي‌شود، خواهد بود. با افزایش duty cycle مقدار متوسط ولتاژ تغذیه اعمال شده به موتور DC بیشتر خواهد شد و در نتیجه سرعت دوران شافت موتور افزایش خواهد یافت. بطور برعکس، کم کردن duty cycle سبب کاهش متوسط ولتاژ تغذیه و در نتیجه کاهش سرعت دور موتور مي‌شود. در شکل زیر تکنیک PWM و ارتباط مقادير مختلف duty cycle  با مقدار متوسط ولتاژ تغذیه نشان داده شده است.

تکنیک PWM و ارتباط مقادير مختلفduty cycle  با مقدار متوسط ولتاژ تغذیه

تکنیک H-Bridge برای کنترل جهت چرخش موتور

کنترل جهت دوران شافت یک موتور DC از طریق تغییر پلاریته ولتاژ تغذیه آن امکان‌پذیر است. تکنیک مرسوم برای این کار استفاده از H-Bridge یا مدار پل H است. مدار پل H متشکل از چهار عدد سوئیچ است که موتور در مرکز آن‌ها قرار مي‌گيرد و بدین ترتیب ساختاری شبیه H تشکیل مي‌‌دهد. با بسته شدن همزمان دو سوئیچ خاص مي‌توان پلاریته ولتاژ تغذیه اعمالی به موتور و در نتیجه جهت چرخش شافت موتور را تغییر داد. در انیميشن زیر نحوه عملکرد مدار پل H نشان داده شده است.

آي سي درايور موتور L293D

پین های آي سي درايور موتور L293D که یک H-bridge دو کاناله است.

آي سي یک درایور موتور H-bridge دو کاناله است كه قابليت كنترل مستقل دو عدد موتور DC يا كنترل يك استپ موتور را دارد. لذا برای بکارگیری در ربات‌‌های دوچرخ ایده آل است.

تغذيه الكتريكي

تغذیه الکتریکی در آی سی درایور موتور L293D از طریق دو پین Vcc1 و Vcc2 انجام می شود.

آي سي درايور موتور L293D داراي دو پين تغذيه ورودي ‘Vcc1’ و  ‘Vcc2’ است. Vcc1 برای تغذیه مدارات منطقی داخلي استفاده مي‌شود که اندازه آن ۵ ولت است. از طریق پین Vcc2 ولتاژ الکتریکی مورد نیاز برای درایو موتورهاي DC به مدار پل H داده مي‌شود که بین ۴٫۵ تا ۳۶ ولت مي‌تواند تغییر کند. هر دوي آن‌ها به يك زمين مشترك GND متصل مي‌شوند.

ترمينال‌هاي خروجي

ترمینال های خروجی در آی سی درایور L293D

كانال‌هاي خروجي درایور L293D براي دو موتور A و B عبارتند از پين‌هاي (OUT1,OUT2) و (OUT3,OUT4). مي‌توان دو موتور DC با ولتاژ كاري ۴٫۵ تا ۳۶ ولت را به اين كانال‌هاي خروجي متصل نمود. هر كانال خروجي مي‌تواند جرياني حداكثر تا ۶۰۰ ميلي آمپر را براي موتور DC تامين نمايد. هرچند، مقدار جريان موتور به منبع تغذيه سيستم بستگي دارد.

پین‌‌های کنترلی

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

  • پین‌‌های کنترل جهت دوران       
پین‌‌های ورودی برای کنترل جهت دوران موتورها در آی سی درایور L293D

با استفاده از پین‌‌های کنترل جهت مي‌توان نحوه دوران شافت موتور DC را در دو جهت مستقیم یا عقبگرد کنترل نمود. این پین‌‌ها در حقیقت سوئیچ‌‌های مدار پل H  داخلي آی سی L293D را کنترل مي‌کنند. برای هر کانال خروجی دو پین کنترل جهت وجود دارد. پین‌‌های IN1 و IN2 جهت دوران موتور A  و پین‌‌های IN3 و IN4 جهت دوران موتور B را کنترل مي‌کنند. کنترل جهت دوران از طریق اعمال منطق High (5 ولت) یا منطق Low (صفر ولت) به پين‌هاي كنترلي طبق چارت زیر مي‌باشد.

ورودی ۱ورودی ۲جهت دوران موتور
Low  (صفر ولت)Low  (صفر ولت)موتور خاموش
High  (5 ولت)Low  (صفر ولت)دوران در جهت مستقیم
Low  (صفر ولت)High  (5 ولت)دوران در جهت معکوس
High  (5 ولت)High  (5 ولت)موتور خاموش

  • پین‌‌های کنترل سرعت  
دو پین ورودی کنترل سرعت ENA و ENB برای روشن و خاموش کردن موتورهاي DC

دو پین کنترل سرعت ENA و ENB برای روشن و خاموش کردن موتورهاي DC و همچنین کنترل سرعت دوران موتور‌های A و B  بکار گرفته مي‌شوند. اعمال منطق High (5 ولت) به اين پين‌ها سبب روشن شدن موتور مربوطه و اعمال منطق Low باعث متوقف شدن موتور مي‌شود. کنترل سرعت دوران از طریق اعمال پالس PWM انجام ‌پذیر است.

اتصال آي سي درايور موتور L293D به آردوینو UNO

اکنون با داشتن اطلاعات مورد نیاز در مورد آي سي درایور، در مورد نحوه بکارگیری آن بوسیله آردوینو برای کنترل موتور DC صحبت خواهیم کرد.

در ابتدا منبع تغذیه موتور‌های DC را وصل مي‌کنیم. در این‌جا ما از موتور‌ گیربکس DC (موتور TT) که بطور معمول در ربات‌‌های دوچرخ بکارگرفته مي‌شوند، استفاده مي‌کنیم. ولتاژ این موتور‌ها بین ۳ تا ۹ ولت است. بنابراین یک منبع تغذیه خارجی ۹ ولت به پين Vcc2 متصل مي‌کنیم. براي تامين تغذيه الكتريكي مورد نياز مدارات داخلي آي سي نيز يك ولتاژ ۵ ولت به پين Vcc1 وصل مي‌كنيم. زمين همه تغذيه‌ها را به هم متصل مي‌كنيم.

اکنون پین‌‌های ورودی و فعال‌ساز (یعنی پین‌‌های ENA، IN1، IN2، IN3، IN4 و ENB) آي سي L293D را به ۶ پین خروجی دیجیتال آردوینو (خروجی‌‌های ۳، ۴، ۵، ۷، ۸ و ۹) متصل مي‌كنيم. دقت کنید که پین‌‌های شماره ۹ و شماره ۳ آردوینو مربوط به PWM  هستند.

در مرحله آخر یک موتور به ترمينال A  (Out1 و Out2) و موتور دیگر به ترمينال B  (Out3 و Out4) وصل مي‌شوند.

با انجام مراحل فوق، چیزی شبیه به شکل زیر خواهیم داشت.

شماتیک مدار اتصال آي سي درايور موتور L293D به آردوینو UNO

کد برنامه آردوینو ( کنترل موتور DC با  آي سي درايور موتور L293D )

در اين بخش نحوه کنترل سرعت و جهت دوران موتور DC  با استفاده از آي سي درايور موتور L293D توسط آردوينو شرح داده مي‌شود که مي‌توان آن را به عنوان يك مثال پایه‌ای برای کاربرد‌های عملی بیشتر بکار گرفت.

// Motor A connections
 int enA = 9;
 int in1 = 8;
 int in2 = 7;
 // Motor B connections
 int enB = 3;
 int in3 = 5;
 int in4 = 4;
 void setup() {
     // Set all the motor control pins to outputs
     pinMode(enA, OUTPUT);
     pinMode(enB, OUTPUT);
     pinMode(in1, OUTPUT);
     pinMode(in2, OUTPUT);
     pinMode(in3, OUTPUT);
     pinMode(in4, OUTPUT);
     // Turn off motors - Initial state
     digitalWrite(in1, LOW);
     digitalWrite(in2, LOW);
     digitalWrite(in3, LOW);
     digitalWrite(in4, LOW);
 }
 void loop() {
     directionControl();
     delay(1000);
     speedControl();
     delay(1000);
 }
 // This function lets you control spinning direction of motors
 void directionControl() {
     // Set motors to maximum speed
     // For PWM maximum possible values are 0 to 255
     analogWrite(enA, 255);
     analogWrite(enB, 255);
     // Turn on motor A & B
     digitalWrite(in1, HIGH);
     digitalWrite(in2, LOW);
     digitalWrite(in3, HIGH); 
     digitalWrite(in4, LOW); 
     delay(2000);
     // Now change motor directions
     digitalWrite(in1, LOW);
     digitalWrite(in2, HIGH);
     digitalWrite(in3, LOW);
     digitalWrite(in4, HIGH);
     delay(2000); 
    // Turn off motors
    digitalWrite(in1, LOW);
    digitalWrite(in2, LOW);
    digitalWrite(in3, LOW);
    digitalWrite(in4, LOW);
 }
 // This function lets you control speed of the motors
 void speedControl() {
     // Turn on motors
     digitalWrite(in1, LOW);
     digitalWrite(in2, HIGH);
     digitalWrite(in3, LOW);
     digitalWrite(in4, HIGH);
    // Accelerate from zero to maximum speed 
    for (int i = 0; i < 256; i++) {     
      analogWrite(enA, i);
      analogWrite(enB, i);     
      delay(20); 
} 
    // Decelerate from maximum speed to zero
    for (int i = 255; i >= 0; --i) { 
      analogWrite(enA, i);
      analogWrite(enB, i); 
      delay(20);
 } 
     // Now turn off motors
     digitalWrite(in1, LOW);
     digitalWrite(in2, LOW); 
     digitalWrite(in3, LOW);
     digitalWrite(in4, LOW);
 }

توضیح کد برنامه نویسی

کد آردوینو نیاز به هیج کتابخانه‌ای ندارد. در ابتدای کد مشخص مي‌‌کنیم که پین‌‌های آردوینو به کدام یک از پین‌‌های آي سي L293D  متصل هستند.

// Motor A connections
 int enA = 9;
 int in1 = 8;
 int in2 = 7;
 // Motor B connections
 int enB = 3;
 int in3 = 5;
 int in4 = 4;

در بخش setup كد، همه پین‌‌های کنترلی موتور به عنوان خروجی‌‌های دیجیتال تعریف مي‌شوند و مقدار اولیه آن‌‌ها بصورت Low تنظیم مي‌شود تا هر دو موتور در آغاز، خاموش شوند.

void setup() {
     // Set all the motor control pins to outputs
     pinMode(enA, OUTPUT);
     pinMode(enB, OUTPUT);
     pinMode(in1, OUTPUT);
     pinMode(in2, OUTPUT);
     pinMode(in3, OUTPUT);
     pinMode(in4, OUTPUT);
     // Turn off motors - Initial state
     digitalWrite(in1, LOW);
     digitalWrite(in2, LOW);
     digitalWrite(in3, LOW);
     digitalWrite(in4, LOW);
 }

در بخش loop، دو تابعی که قبلا توسط کاربر تعریف شده اند درون یک حلقه نرم افزاری با فاصله زمای یک ثانیه (هزار ميلي ثانیه) فراخوانی مي‌شوند.

 void loop() {
     directionControl();
     delay(1000);
     speedControl();
     delay(1000);
 }

این توابع عبارتند از:

  • ()directionControl : این تابع هر دو موتور را به مدت ۲ ثانیه با حداکثر سرعت دوران در جهت مستقیم روشن مي‌کند. سپس، به مدت ۲ ثانیه نیز در جهت معکوس موتور‌ها را مي‌چرخاند و در نهایت دو موتور را متوقف مي‌کند.
void directionControl() {
     // Set motors to maximum speed
     // For PWM maximum possible values are 0 to 255
     analogWrite(enA, 255);
     analogWrite(enB, 255);
     // Turn on motor A & B
     digitalWrite(in1, HIGH);
     digitalWrite(in2, LOW);
     digitalWrite(in3, HIGH); 
     digitalWrite(in4, LOW); 
     delay(2000);
     // Now change motor directions
     digitalWrite(in1, LOW);
     digitalWrite(in2, HIGH);
     digitalWrite(in3, LOW);
     digitalWrite(in4, HIGH);
     delay(2000); 
    // Turn off motors
    digitalWrite(in1, LOW);
    digitalWrite(in2, LOW);
    digitalWrite(in3, LOW);
    digitalWrite(in4, LOW);
 }
  • ()speedControl : این تابع سرعت دوران هر دو موتور را از مقدار صفر تا حداکثر سرعت افزایش مي‌دهد که این کار از طریق تولید سیگنال‌‌های PWM توسط تابع ()analogWrite انجام مي‌شود. پس از آن، مجددا سرعت دوران موتور‌‌ها از مقدار حداکثر تا رسیدن به صفر کاهش یافته و در نهایت دو موتور خاموش مي‌شوند.
void speedControl() {
     // Turn on motors
     digitalWrite(in1, LOW);
     digitalWrite(in2, HIGH);
     digitalWrite(in3, LOW);
     digitalWrite(in4, HIGH);
    // Accelerate from zero to maximum speed 
    for (int i = 0; i < 256; i++) {     
      analogWrite(enA, i);
      analogWrite(enB, i);     
      delay(20); 
} 
    // Decelerate from maximum speed to zero
    for (int i = 255; i >= 0; --i) { 
      analogWrite(enA, i);
      analogWrite(enB, i); 
      delay(20);
 } 
     // Now turn off motors
     digitalWrite(in1, LOW);
     digitalWrite(in2, LOW); 
     digitalWrite(in3, LOW);
     digitalWrite(in4, LOW);
 }

4 دیدگاه‌ها

ارسال یک پاسخ

لطفا دیدگاه خود را وارد کنید!
لطفا نام خود را در اینجا وارد کنید