راه اندازی موتور دی سی با درایور L293D {جلسه بیست و نهم}
مقدمه
در این جلسه قصد داریم ابتدا به طور کامل با شیلد آردوینو L293D آشنا شویم. سپس یک موتور دی سی را با استفاده از آن راه اندازی کنیم. ابتدا نمای کلی تراشه L293D را مشاهده کنید:
عیب L293D و L298D این است که از ترانزیستورهای BJT استفاده می کنند که افت ولتاژی را درون خود دارند و بازدهی را کاهش می دهند. در نسل های جدیدتر از ترانزیستورها ماسفت استفاده می شود.
پایه های این تراشه به صورت زیر است. دقت کنید که ما بر روی L293D کار میکنیم که با L293 متفاوت است. دو تا خروجی 1 و 2 برای اتصال به موتور شماره یک و دو تا خروجی 3 و 4 نیز برای اتصال به موتور شماره 2 است. بنابراین با استفاده از این تراشه فقط دو موتور DC را می توان راه اندازی نمود یا اینکه یک عدد استپر موتور را راه اندازی کرد.
از آنجایی که کار کردن به صورت مستقیم با تراشه کمی سیم پیچی ها را زیاد می کند قصد داریم با استفاده از شیلد آردوینو این پیچیدگی ها را حذف کنیم و سپس با استفاده از محیط برنامه نویسی آردوینو کد مورد نظر را بر روی آن بارگذاری کنیم. در زیر نمایی شیلد آردوینو L293D را مشاهده می کنید:
اجزای اصلی این برد به صورت زیر می باشد:
مزیت دیگر این شیلد این است که دارای دو عدد L293D است که می توان 4 عدد موتور دی سی را راه اندازی نمود و یا اینکه دو عدد استپر موتور را راه اندازی کرد. بنابراین هنگامی که بتوانیم 4 عدد موتور دی سی را راه اندازی کنیم به راحتی می توانیم یک ربات چهار چرخ را با استفاده از یک درایور راه اندازی کنیم.
این شیلد دارای 4 پل H است که هر پل توانایی جریان دهی 0.6 آمپر به موتورها را داراست. در قسمت وسط شیلد یک شیفت رجيستر 74HC595 وجود دارد که با استفاده از آن می توان 8 پین L293D را با چهار پین آردوینو کنترل نمود. برای آشنایی کامل با این شیفت رجیستر می توانید از لینک زیر استفاده کنید:
منبع تغذیه
با استفاده از سه روش می توان پاور شیلد L293D را تامین کرد:
- منبع تغذيه DC برای موتورها و برد آردوينو: چنانچه قصد دارید از یک منبع تغذيه مشترک برای موتورها و برد آردوينو به کار ببرید، بدین منظور می بایست منبع تغذيه را به جک DC آردوينو يا به بلوک دو پين EXT_PWR اتصال دهید و سپس، جامپر power را بر روی محل نشان داده شده قرار دهید. این روش فقط برای زمانی است که ولتاژ تغذیه موتور کمتر از 12 ولت باشد.
- تغذيه آردوينو از طريق USB و تغذيه موتورها با استفاده از يک منبع تغذیه DC: در صورتی که قصد دارید آردوینو را با کابل USB و موتورها را به وسیله یک منبع تغذیه DC، تامین کنید، لازم است که كابل USB را به برد آردوینو اتصال دهید و منبع تغذيه موتور را به بلوک آبی رنگ EXT_PWR روی شيلد متصل کنید. در اين روش حتما باید جامپر شیلد را بردارید.
- به کار گیری دو تغذيه جدا برای موتورها و آردوينو: در صورتی که می خواهید دو منبع تغذيهی جداگانه برای موتور و آردوينو به کار ببرید، لازم است که يک منبع تغذيه را به جک DC آردوينو و منبع تغذيه دوم را به بلوک EXT_PWR شيلد اتصال دهید. در این روش نیز حتما باید جامپر از روی شیلد برداشته شود.
تذکر:
به هیچ عنوان بدون برداشتن جامپر، منبع تغذيه را به ورودی EXT_PWR اتصال ندهید. زیرا ممکن است به شیلد و آردوینو آسیب برسد.
ترمینال های خروجی
دی سی موتور: ترمینالهای خروجی هر دو تراشه L293D به صورت دو ترمينال پیچی 5 پایه در لبههای شيلد قرار دارند (M1، M2، M3 و M4). که می توان چهار موتور DC با ولتاژ 4.5 تا 25 به آنها متصل کرد.
هر ترمینال خروجی میتواند تا 600 میلی آمپر جریان به موتور DC برساند. دقت کنید که منبع تغذیه بتواند حداقل این جریان را تامین کند.
استپرموتور: همچنین می توان یک استپر موتور را به دو ترمینال M1 و M2 و استپ موتور دوم را به دو ترمینال M3 و M4 اتصال دهید. از ترمینال GND نیز میتوان برای استپر موتور تک قطبی استفاده کرد.
سروو موتور: پایههای 16 بیتی PWM آردوینو را به شکل دو گروه سه تایی برای راه اندازی دو عدد سروو موتور موجود می باشد که در تصویر نیز نشان داده شده است.
پایه های بدون استفاده
پایههای ديجيتال 2 و 13 و پایههای آنالوگ A0 تا A5 درایور موتور L293D مورد استفاده قرار نگرفتهاند که در گوشه پایين سمت راست شیلد مشاهده می کنید. اگر میخواهید از آنها استفاده کنید، میبایست به آنها هدر اتصال دهید.
کتابخانه AFMotor
برای استفاده از درایور موتور L293D لازم است كتابخانه AFMotor.h را نصب كنيد تا بتوانید موتور DC، استپر موتور و سروو را کنترل کنید.
برای نصب آن کافی است که مسیر Sketch > Include Library > Manage Libraries را طی کنید و منتظر بمانيد تا Library Manager برای دانلود و بهروزرسانی كتابخانهها پیش برود.
پس از اتمام مرحله بالا، کلمه motor shield را سرچ کنید و از بین کتابخانههایی که نمایش داده میشود، Adafruit Motor Shield library by Adafruit را نصب کنید.
ویژگی های مهم شیلد L293D:
- دارای آرايهای از مقاومتهای pulldown است تا هنگام روشن شدن شيلد، موتورها را خاموش نگه دارد.
- نشانگر LED قرار داده شده روی برد نشان میدهد كه آیا تغذيه موتورها به درستی صورت گرفته است یا خیر. اگر LED روشن نشود، موتورها نیز خاموش می مانند.
- کلید RESET، مثل کلید ریست آردوینو است و تنها برای راحتی در کاربرد، بر روی شیلد قرار داده شده است.
راه اندازی موتور دی سی
قطعات مورد نیاز
- شیلد L293D
- برد آردوینو UNO
- موتور دی سی 12 ولت
- منبع تغذیه
ابتدا شیلد را بر روی برد آردوینو نصب می کنیم. در مرحله بعد، موتور را به يكی از ترمينالهای M1، M2، M3 یا M4 متصل می کنیم. در این شکل ما موتور را به ترمینال M4 متصل کرده ایم.
#include <AFMotor.h> AF_DCMotor motor(4); void setup() { //Set initial speed of the motor & stop motor.setSpeed(200); motor.run(RELEASE); } void loop() { uint8_t i; // Turn on motor motor.run(FORWARD); // Accelerate from zero to maximum speed for (i=0; i<255; i++) { motor.setSpeed(i); delay(10); } // Decelerate from maximum speed to zero for (i=255; i!=0; i--) { motor.setSpeed(i); delay(10); } // Now change motor direction motor.run(BACKWARD); // Accelerate from zero to maximum speed for (i=0; i<255; i++) { motor.setSpeed(i); delay(10); } // Decelerate from maximum speed to zero for (i=255; i!=0; i--) { motor.setSpeed(i); delay(10); } // Now turn off motor motor.run(RELEASE); delay(1000); }
شرح کد
ابتدا كتابخانه AFMotor.h را فراخوانی میکنیم.
خط دوم با استفاده از دستور AF_DCMotor motor(motorPort#)، برای اين كتابخانه یک object میسازد. در این دستور، باید شماره ترمينالی را كه موتور به آن وصل شده است تعیین کنید. برای ترمينال M1 عدد 1، برای ترمينال M2، عدد 2، برای ترمینال M3، عدد 3 و برای ترمینال M4 عدد 4 را ذکر می کنیم. اگر قصد دارید چندين موتور را به شيلد L293D اتصال دهید، لازم است برای هر موتور يک object ایجاد کنید. به عنوان نمونه، دستورات زير دو شی AFmotor میسازد: برای شناخت object به دوره آردوینو مراجعه کنید.
AF_DCMotor motor1(1);
AF_DCMotor motor2(2);
در قسمت setup و loop، از دو تابع زیر جهت كنترل سرعت و جهت دوران استفاده می شود:
- تابع setSpeed(speed) سرعت موتور را تنظيم میكند.محدوده سرعت را میتوان بين 0 تا 255 انتخاب کرد. 0 به معنای توقف کامل موتور و 255 به معنای سرعت حداکثر است.
- تابع run(cmd) مد كاری موتور را تنظيم میكند. مقادير قابل پذیرش برای cmd به صورت زیر است:
- FORWARD: موتور را در جهت مستقيم به چرخش در می آورد (جهت چرخش مستقيم موتور به چیدمان سیم بندی موتور وابسته است).
- BACKWARD: موتور را در جهت عکس FORWARD به حرکت در می آورد.
- RELEASE: موتور را به طور کامل توقف می دهد. در اين وضعیت، تغذيه اعمال شده به موتور حذف می شود و معادل setSpeed(0) خواهد بود. این شيلد دارای قابلیت ترمز ديناميكی نیست، با استفاده از فرمان استاپ، مدت زمانی طول میکشد تا موتور به طور کامل متوقف گردد.
راه اندازی استپرموتور با شیلد L293D
در این بخش قصد داریم یک سروو موتور را با شیلد L293D راه اندازی کنیم. ابتدا شیلد را به آردوینو متصل کنید. از استپرموتور 28BYJ-48 برای این پروژه استفاده می کنیم. که دارای ولتاژ 5 ولت است و در طی یک دور کامل 48 پله دارد. برای خرید این موتور می توانید از لینک زیر استفاده کنید:
بعد از اتصال منبع تغذیه حتما جامپر PWR را بردارید. برای اتصالات می توانید از تصویر زیر کمک بگیرید. در صورتی که نیاز به اطلاعات بیشتر در مورد استپرموتورها و نحوه سیم کشی آنها دارید می توانید از لینک زیر استفاده کنید:
استپ موتور NEMA 17
اگر بخواهید استپرموتور NEMA17 را به شیلد متصل کنید نیز به همین صورت است. این موتور 12 ولتی 200 پله را در طی یک دور طی می کند. چون 12 ولتی است حتما می بایست منبع تغذیه نیز 12 ولتی باشد و جامپر PWR نیز طبق معمول حتما بردارید.
در اینجا هم فراموش نکنید که جامپر PWR را بردارید. پس از اتصال منبع تغذیه نیز، موتور را به یکی از ترمینالهای M1-M2 يا M3-M4 وصل کنید. در اینجا ما از پورت 2 یعنی ترمینالهای M3-M4 استفاده میکنیم.
اتصالات این موتور هم به شکل زیر خواهد بود:
- برنامه آردوينو برای راه اندازی استپرموتور
در بالا دو نوع استپر موتور را به شیلد متصل کردیم و حال نوبت کد آردوینو جهت راه اندازی آنهاست. همه موارد یکسان است ولی در پارامتر stepsPerRevolution با هم تفاوت دارند که مربوط به تعداد پله های هر موتور است. که در NEMA17 این عدد 200 است و در 28BYJ-48 عدد 48 است.
#include <AFMotor.h>
// Number of steps per output rotation
// Change this as per your motor's specification
const int stepsPerRevolution = 48;
// connect motor to port #2 (M3 and M4)
AF_Stepper motor(stepsPerRevolution, 2);
void setup() {
Serial.begin(9600);
Serial.println("Stepper test!");
motor.setSpeed(10); // 10 rpm
}
void loop() {
Serial.println("Single coil steps");
motor.step(100, FORWARD, SINGLE);
motor.step(100, BACKWARD, SINGLE);
Serial.println("Double coil steps");
motor.step(100, FORWARD, DOUBLE);
motor.step(100, BACKWARD, DOUBLE);
Serial.println("Interleave coil steps");
motor.step(100, FORWARD, INTERLEAVE);
motor.step(100, BACKWARD, INTERLEAVE);
Serial.println("Micrsostep steps");
motor.step(100, FORWARD, MICROSTEP);
motor.step(100, BACKWARD, MICROSTEP);
}
در این کد ابتدا كتابخانه AFMotor.h را فراخوانی میکنیم.
سپس بهوسيله AF_Stepper motor(48, 2) يک object ايجاد میکنیم. که در آن تعداد گام های موتور و پورتی که موتور به آن متصل است را مشخص می کنیم.
در قسمت setup و loop، با کمک دو تابع زير میتوان سرعت و جهت دوران موتور را كنترل کرد:
- تابع setSpeed(rpm): میزان سرعت موتور را تعیین میكند كه در آن rpm تعیین كننده تعداد دور موتور در دقيقه است.
- تابع step(#steps, direction, steptype) : برای شروع به حرکت، باید اين تابع را فراخوانی کرد. آرگومان #steps نمایانگر تعداد گامهای حركت است كه موتور باید طی کند. آرگومان direction يا بهصورت FORWARD یا BACKWARD است. برای آرگومان steptype، میتوان از گزینههای زیر بهره برد:
- SINGLE که در هر تایم يک سیم پیچ را فعال میکند.
- DOUBLE که برای افزایش گشتاور، دو سیم پیچ را فعال میکند.
- INTERLEAVE که وضعیتی بين single و double است و يک نيم پله كه باعث حركت نرمتر موتور میشود، مورد استفاده قرار میگیرد. اما به دلیل حرکت اضافی به صورت نیم پله، سرعت موتور نيز نصف می شود.
- MICROSTEP: به منظور حرکت موتور به صورت ریز گام، جریان در دو سیم پیچ مجاور به صورت افزایشی و کاهشی می شود. در این وضعیت جریان به صورت ناگهانی از سیم پیچ اول به سیم پیچ دوم انتقال نمی یابد. موقعی که جریان در سیم پیچ اول بیشینه است، جریان سیم پیچ دوم از صفر تا مقدار بیشینه افزایش مییابد. سپس موقعی که سیم پیچ دوم دارای بیشینه جریان است، جریان در سیم پیچ اول به صفر میل میکند. در این روش گشتاور موتور کاهش پیدا می کند.
راه اندازی سروو موتور L293D
برای راه اندازی سروو موتور ابتدا از لینک زیر به طور کامل آموزش سروو موتورها را مطالعه کنید:
در شیلد L293D، پینهای خروجی 16 بیتی PWM آردوینو (پين شماره 9 و 10) را به سروو موتور متصل می کنیم. برای تغذیه سروو نیز می بایست مطابق با سروو موتوری که استفاده می کنید تغذیه آن را تامین کنید. نکته مهم این است که هیچوقت از تغذیه برد آردوینو برای تغذیه سروو موتور استفاده نکنید زیرا هنگامی که بار افزایش می یابد احتمال آسیب به برد و ریست شدن آن وجود دارد. به طور کلی همیشه تغذیه موتورها را از مدارات منطقی جدا کنید.
در این پروژه ما از سروو موتور SG90 استفاده کرده ایم که 90 درجه در هر جهت چرخش میکند یعنی مجموعا 180 درجه .کد مورد نظر هم به صورت زیر است که می توانید از کتابخانه آردوینو فراخوانی کنید:
#include <Servo.h>
Servo myservo; // create servo object to control a servo
int pos = 0; // variable to store the servo position
void setup()
{
// attaches the servo on pin 10 to the servo object
myservo.attach(10);
}
void loop()
{
// sweeps from 0 degrees to 180 degrees
for(pos = 0; pos <= 180; pos += 1)
{
myservo.write(pos);
delay(15);
}
// sweeps from 180 degrees to 0 degrees
for(pos = 180; pos>=0; pos-=1)
{
myservo.write(pos);
delay(15);
}
}
این جلسه نیز به پایان رسید. در صورتی که نیاز به اطلاعات اضافی داشتید می توانید در قسمت کامنت ها بیان نمایید تا مطالب وب سایت آپدیت شوند.
دوستان عزیز بیشتر دوره های مربوط به این وب سایت رایگان می باشد. در صورت تمایل می توانید به اندازه وسع مالی خود(هر چند ناچیز) جهت پرداخت هزینه های نگهداری وب سایت از ما حمایت کنید:
مثل همیشه میتوانید ما را در تلگرام و یا اینستاگرام دنبال کنید:
6 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
با درود فراوان و تشکر از زحمات و محبت شما و اشتراک بصورت رایگان مباحث. ای کاش برنامهنویسیها برای خانواده AVR بودند چون در ایران بسیار شایعتر هست.
سلام و احترام
به دلیل اینکه محیط برنامه نویسی آردوینو برای بسیاری از کاربران رایج تر است از این محیط استفاده شده است. میکروهای AVR نیز بر روی بردهای آردوینو استفاده می شوند.
موفق باشید
سلام. سروو موتور SG90 نهایتا 180 درجه می چرخد اگر ما بخواهیم سروو 360 استفاده کنیم می توانیم تغییر زاویه بدهیم؟
سلام و احترام
در صورتی که از سروو 360 استفاده می کنید نمی توان زاویه خاصی را کنترل کرد با سروو 360 فقط می توان مقدار دوران و جهت دوران را کنترل کرد و سروو به صورت 360 درجه با کد نوشته شده به دور خودش می چرخد. در صورتی که زاویه خاصی مدنظر دارید از استپر موتور استفاده کنید که در جلسات قبلی شرح داده شده است.
موفق باشید
سلام . اگر سه تا سروو موتور داشتیم چطوری متصل کنیم. چون شیلد جای دو تا سروو موتور دارد؟
سلام و احترام
با توجه به اینکه شیلد L293D جای دوتا سروو دارد برای اتصال مابقی سرووها می توانید به صورت مستقیم آنها را به برد آردوینو متصل کنید. دقت کنید که حتما تغذیه سرووها را به صورت جداگانه وصل کنید و از برد تغذیه نگیرید. با کمک کتابخانه آردوینو حداکثر تعداد 12 عدد سروو موتور می توان روی بیشتر بردهای آردوینو متصل کرد و تعداد 48 عدد نیز می توان به آردوینو مگا متصل کرد(Arduino mega board)
موفق باشید