اگر در فکر ساخت یک ربات جدید هستید، لازم است نحوه کنترل موتور DC را یاد بگیرید. یکی از آسانترین و ارزانترین ابزارهای کنترل موتورهای DC بكارگيري آي سي درايور موتور L293D با استفاده از آردوینو است. این درایور ميتواند همزمان سرعت و جهت دوران دو موتور DC را کنترل کند. بعلاوه، با استفاده از آن ميتوان یک استپ موتور تك قطبي نظير 28BYJ-48 يا يك استپ موتور دو قطبي نظیر NEMA 17 را نیز کنترل نمود.
کنترل موتور DC
برای کنترل کامل یک موتور DC لازم است سرعت و جهت دوران موتور قابل کنترل باشد. این کنترل از ترکیب دو تکنیک زیر قابل دستیابی است:
- تکنیک PWM: برای کنترل سرعت
- تکنیک H-Bridge: برای کنترل جهت چرخش موتور
تکنیک PWM برای کنترل سرعت
کنترل سرعت موتور DC از طریق تغییر ولتاژ تغذیه موتور امکان پذیر است. یک تکنیک مرسوم برای این کار استفاده از روش مدولاسیون عرض پالس (PWM) است. در این تکنیک مقدار متوسط ولتاژ ورودی از طریق ارسال یکسری پالسهای صفر و یک (ON-OFF) تنظیم ميشود. مقدار متوسط ولتاژ، متناسب با عرض پالس که duty cycle ناميده ميشود، خواهد بود. با افزایش duty cycle مقدار متوسط ولتاژ تغذیه اعمال شده به موتور DC بیشتر خواهد شد و در نتیجه سرعت دوران شافت موتور افزایش خواهد یافت. بطور برعکس، کم کردن duty cycle سبب کاهش متوسط ولتاژ تغذیه و در نتیجه کاهش سرعت دور موتور ميشود. در شکل زیر تکنیک PWM و ارتباط مقادير مختلف duty cycle با مقدار متوسط ولتاژ تغذیه نشان داده شده است.
تکنیک H-Bridge برای کنترل جهت چرخش موتور
کنترل جهت دوران شافت یک موتور DC از طریق تغییر پلاریته ولتاژ تغذیه آن امکانپذیر است. تکنیک مرسوم برای این کار استفاده از H-Bridge یا مدار پل H است. مدار پل H متشکل از چهار عدد سوئیچ است که موتور در مرکز آنها قرار ميگيرد و بدین ترتیب ساختاری شبیه H تشکیل ميدهد. با بسته شدن همزمان دو سوئیچ خاص ميتوان پلاریته ولتاژ تغذیه اعمالی به موتور و در نتیجه جهت چرخش شافت موتور را تغییر داد. در انیميشن زیر نحوه عملکرد مدار پل H نشان داده شده است.
آي سي درايور موتور L293D
آي سي یک درایور موتور H-bridge دو کاناله است كه قابليت كنترل مستقل دو عدد موتور DC يا كنترل يك استپ موتور را دارد. لذا برای بکارگیری در رباتهای دوچرخ ایده آل است.
تغذيه الكتريكي
آي سي درايور موتور L293D داراي دو پين تغذيه ورودي ‘Vcc1’ و ‘Vcc2’ است. Vcc1 برای تغذیه مدارات منطقی داخلي استفاده ميشود که اندازه آن 5 ولت است. از طریق پین Vcc2 ولتاژ الکتریکی مورد نیاز برای درایو موتورهاي DC به مدار پل H داده ميشود که بین 4.5 تا 36 ولت ميتواند تغییر کند. هر دوي آنها به يك زمين مشترك GND متصل ميشوند.
ترمينالهاي خروجي
كانالهاي خروجي درایور L293D براي دو موتور A و B عبارتند از پينهاي (OUT1,OUT2) و (OUT3,OUT4). ميتوان دو موتور DC با ولتاژ كاري 4.5 تا 36 ولت را به اين كانالهاي خروجي متصل نمود. هر كانال خروجي ميتواند جرياني حداكثر تا 600 ميلي آمپر را براي موتور DC تامين نمايد. هرچند، مقدار جريان موتور به منبع تغذيه سيستم بستگي دارد.
پینهای کنترلی
برای هر یک از کانالهای L293D دو نوع پین کنترلی وجود دارد که با استفاده از آن ميتوان بصورت همزمان سرعت و جهت دوران موتور را کنترل نمود: پینهای کنترل جهت دوران موتورها و پینهای کنترل سرعت موتورها.
- پینهای کنترل جهت دوران
با استفاده از پینهای کنترل جهت ميتوان نحوه دوران شافت موتور DC را در دو جهت مستقیم یا عقبگرد کنترل نمود. این پینها در حقیقت سوئیچهای مدار پل H داخلي آی سی L293D را کنترل ميکنند. برای هر کانال خروجی دو پین کنترل جهت وجود دارد. پینهای IN1 و IN2 جهت دوران موتور A و پینهای IN3 و IN4 جهت دوران موتور B را کنترل ميکنند. کنترل جهت دوران از طریق اعمال منطق High (5 ولت) یا منطق Low (صفر ولت) به پينهاي كنترلي طبق چارت زیر ميباشد.
ورودی 1 | ورودی 2 | جهت دوران موتور |
---|---|---|
Low (صفر ولت) | Low (صفر ولت) | موتور خاموش |
High (5 ولت) | Low (صفر ولت) | دوران در جهت مستقیم |
Low (صفر ولت) | High (5 ولت) | دوران در جهت معکوس |
High (5 ولت) | High (5 ولت) | موتور خاموش |
- پینهای کنترل سرعت
دو پین کنترل سرعت ENA و ENB برای روشن و خاموش کردن موتورهاي DC و همچنین کنترل سرعت دوران موتورهای A و B بکار گرفته ميشوند. اعمال منطق High (5 ولت) به اين پينها سبب روشن شدن موتور مربوطه و اعمال منطق Low باعث متوقف شدن موتور ميشود. کنترل سرعت دوران از طریق اعمال پالس PWM انجام پذیر است.
اتصال آي سي درايور موتور L293D به آردوینو UNO
اکنون با داشتن اطلاعات مورد نیاز در مورد آي سي درایور، در مورد نحوه بکارگیری آن بوسیله آردوینو برای کنترل موتور DC صحبت خواهیم کرد.
در ابتدا منبع تغذیه موتورهای DC را وصل ميکنیم. در اینجا ما از موتور گیربکس DC (موتور TT) که بطور معمول در رباتهای دوچرخ بکارگرفته ميشوند، استفاده ميکنیم. ولتاژ این موتورها بین 3 تا 9 ولت است. بنابراین یک منبع تغذیه خارجی 9 ولت به پين Vcc2 متصل ميکنیم. براي تامين تغذيه الكتريكي مورد نياز مدارات داخلي آي سي نيز يك ولتاژ 5 ولت به پين Vcc1 وصل ميكنيم. زمين همه تغذيهها را به هم متصل ميكنيم.
اکنون پینهای ورودی و فعالساز (یعنی پینهای ENA، IN1، IN2، IN3، IN4 و ENB) آي سي L293D را به 6 پین خروجی دیجیتال آردوینو (خروجیهای 3، 4، 5، 7، 8 و 9) متصل ميكنيم. دقت کنید که پینهای شماره 9 و شماره 3 آردوینو مربوط به PWM هستند.
در مرحله آخر یک موتور به ترمينال A (Out1 و Out2) و موتور دیگر به ترمينال B (Out3 و Out4) وصل ميشوند.
با انجام مراحل فوق، چیزی شبیه به شکل زیر خواهیم داشت.
کد برنامه آردوینو ( کنترل موتور 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 : این تابع هر دو موتور را به مدت 2 ثانیه با حداکثر سرعت دوران در جهت مستقیم روشن ميکند. سپس، به مدت 2 ثانیه نیز در جهت معکوس موتورها را ميچرخاند و در نهایت دو موتور را متوقف ميکند.
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);
سلام این محصول به چه دردی میخوره؟
دوست عزیز این یک درایور موتور l293 هست که شما می تونید به عنوان مثال برای راهاندازی ربات ازش استفاده کنید.
حداکثر جریانی که میتوان با آن موتور را راه اندازی کرد، چقدر است؟
سلام دوست عزیز
همانطور که در توضیحات ذکر شده جریان خروجی برای هر کانال 600 میلی آمپر است .