حتما شما هم میدانید که برای کنترل موتور DC با آردوینو، روشهای بسیاری وجود دارد. اما یکی از سادهترین و محبوبترین آنها استفاده از درایور موتور L293D است. در این مقاله میخواهیم کنترل و راه اندازی موتور DC با درایور موتور L293D و آردوینو را به شما آموزش دهیم.
آی سی درایور موتور L293D، مشخصا برای کنترل موتورهای DC، استپر موتورها، سولونوئیدها و هر بار امپدانس بالای دیگری طراحی شده است و یکی از مزیتهای اصلی آن، امکان کنترل سرعت و جهت دو موتور DC به صورت مستقل است.
ما در این مقاله قصد داریم به مطالب زیر بپردازیم:
- چگونه درایور موتور L293D کار میکند؟
- چگونه L293D و موتور DC را با آردوینو راه اندازی کنیم؟
- چگونه جهت چرخش یک موتور DC را کنترل کنیم؟
- چگونه سرعت دو موتور DC را کنترل کنیم؟
پس بیایید شروع کنیم!
L293D چگونه کار میکند؟
L293D، یک آی سی دو کانال پل H با قابلیت کنترل دو موتور DC است. L293D میتواند دو موتور DC با ولتاژ نامی 4.5 تا 36 ولت را کنترل کند. در شماتیک زیر میتوانید نسخه ساده شده مدار داخلی کنترلکننده یک موتور را ببینید:
همانطور که میبینید دو زوج ترانزیستور (Q1/Q4 و Q2/Q3) به شکل پل H بسته شدهاند. بین امیتر و کلکتور هر ترانزیستور یک دیود قرار گرفته است تا از ولتاژ بازگشتی (back EMF) موتور و آسیب رسیدن به ترانزیستورها جلوگیری کند.
وقتی ترانزیستورهای Q1 و Q4 روشن و ترانزیستورهای Q2 و Q3 خاموش هستند، جریان به شکل زیر از Vcc به GND جاری میشود:
با این کار، موتور در جهت یا خلاف جهت عقربههای ساعت میچرخد. جهت چرخش به پلاریته قطبهای موتور و نحوه اتصال آن به منبع تغذیه بستگی دارد. زمانیکه ترانزیستورهای Q2 و Q3 روشن و Q1 و Q4 خاموش هستند، جریان موتور عکس حالت قبلی است. با عکس شدن جریان موتور، جهت چرخش آن نیز معکوس خواهد شد.
پایههای L293D
در تصویر زیر، میتوانید دیاگرام پایههای آی سی درایور موتور L293D را مشاهده کنید:
L293D دارای دو پل H مجزا است. همانطور که در تصویر زیر میبینید، یکی از آنها در سمت چپ و دیگری در سمت راست قرار گرفته است:
هر کدام از این دو پل میتوانند یک موتور را کنترل کنند.
کارایی هر یک از پایهها را میتوانید در ادامه مشاهده کنید:
- Output1 : ولتاژ خروجی برای موتور 1
- Output2: ولتاژ خروجی برای موتور 1
- Output3: ولتاژ خروجی برای موتور 2
- Output4: ولتاژ خروجی برای موتور 2
- Vcc1: تغذیه 5 ولت برای چیپ L293D
- Vcc2: منبع تغذیه موتورها (4.5 تا 36 ولت DC)
- Enable 1,2: پل H شماره 1 را خاموش/ روشن میکند (1 روشن میکند، 0 خاموش میکند)
- Enable 3,4: پل H شماره 2 را خاموش/ روشن میکند (1 روشن میکند، 0 خاموش میکند)
- Input 1: سیگنال کنترل موتور برای پل H شماره 1
- Input 2: سیگنال کنترل موتور برای پل H شماره 1
- Input 3: سیگنال کنترل موتور برای پل H شماره 2
- Input 4: سیگنال کنترل موتور برای پل H شماره 2
برای روشن کردن موتور 1، به پایه input1 یک و به input2 صفر اعمال میکنیم. این باعث میشود موتور در یک جهت بچرخد. برای عکس کردن جهت چرخش، به پایه input1 صفر و به input2 یک اعمال میکنیم. برای خاموش کردن موتور، به هر دو input، صفر اعمال میکنیم.
راهاندازی موتور DC با درایور موتور L293D
در این آموزش میخواهیم با انجام چند پروژه مختلف، نحوه راه اندازی موتور DC با درایور موتور L293D را بر روی آردوینو نشان دهیم. برای ساخت این پروژههای نمونه، به قطعات زیر نیاز خواهید داشت:
- ماژول آردوینو Pro-mini یا ماژول آردوینو Uno R3 CH340G
- درایور موتور L293D
- دو موتور 12 ولت DC
- دو پتانسیومتر 10K
- بردبورد 840 سوراخ
- سیم برد بوردی 65تایی
کنترل موتور DC با L293D و آردوینو
در مثال اول، میخواهیم یک موتور DC را با درایور موتور L293D کنترل کنیم. در این پروژه هدف این است که موتور DC برای دو ثانیه در یک جهت بچرخد، سپس متوقف شود و پس از آن، برای دو ثانیه در جهت عکس بچرخد. برای انجام این پروژه، موتور DC، L293D و آردوینو را همانند تصویر زیر بههم متصل کنید:
احتمالا برای تغذیه موتور، به یک منبع جداگانه نیاز خواهید داشت. در اینجا ما از منبع 12 ولت برای تغذیه موتور و یک 5 ولت مجزا برای تغذیه L293D و آردوینو استفاده میکنیم.
کد آردوینو برای کنترل موتور DC
پس از اینکه مدار بالا را بستید، کد زیر را بر روی آردوینو خود آپلود کنید:
int in1 = 10;
int in2 = 11;
void setup() {
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
}
void loop() {
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
delay(2000);
digitalWrite(in1, LOW);
delay(1000);
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
delay(2000);
digitalWrite(in2, LOW);
delay(1000);
}
اما بهتر است کد بالا را کمی بررسی کنیم.
دو خط اول کد، متغیر in1 را به پایه 10 آردوینو و in2 را به پایه 11 نسبت میدهد. پس از آن، در قسمت setup، ما in1 و in2 را با دستور ()pinMode، به عنوان خروجی تعریف کردهایم.
در قسمت loop، دستورات digitalWrite(in1, HIGH) و digitalWrite(in2, LOW)، in1 را یک و in2 را صفر میکند که باعث چرخش موتور در یک جهت میشود. دستور delay(2000)، موتور را دو ثانیه در حال چرخش نگه میدارد. سپس، digitalWrite(in1, LOW) با صفر کردن in1، موتور را خاموش میکند. دستور Delay(1000) نیز، موتور را برای یک ثانیه خاموش نگه میدارد.
پس از یک ثانیه خاموش ماندن موتور، جهت چرخش موتور را با صفر کردن in1 و یک کردن in2 توسط دستورات digitalWrite(in1, LOW) و digitalWrite(in2, High) عکس میکنیم. با دستور delay(2000) نیز اجازه میدهیم موتور دو ثانیه در جهت عکس بچرخد. سپس با صفر کردن in2 توسط دستور digitalWrite(in2, LOW) موتور را خاموش میکنیم.
کنترل جهت دو موتور DC
در مثال دوم، میخواهیم یک موتور DC دیگر را به مدار اضافه کنیم. بنابراین، اتصالات را مانند تصویر زیر انجام دهید:
کد آردوینو برای کنترل جهت دو موتور
کد زیر، یکی از موتورها را برای دو ثانیه مستقیم و معکوس میچرخد، سپس موتور دیگر نیز همین کار را انجام میدهد.
int in1 = 10;
int in2 = 11;
int in3 = 12;
int in4 = 13;
int ena = 9;
int enb = 6;
void setup() {
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
pinMode(ena, OUTPUT);
pinMode(enb, OUTPUT);
}
void loop() {
digitalWrite(ena, HIGH);
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
delay(2000);
digitalWrite(in1, LOW);
delay(1000);
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
delay(2000);
digitalWrite(in2, LOW);
delay(2000);
digitalWrite(enb, HIGH);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
delay(2000);
digitalWrite(in3, LOW);
delay(1000);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
delay(2000);
digitalWrite(in4, LOW);
delay(2000);
}
کنترل سرعت دو موتور DC
اما در اینجا یعنی در مثال سوم، میخواهیم امکان کنترل سرعت دو موتور DC با L293D را نیز به پروژه خود اضافه کنیم. برای این کار شما باید دو پتانسیومتر 10 کیلو اهمی را به مدار قبلی خود اضافه کنید. دو موتور DC، آی سی درایور موتور L293D و آردوینو را با توجه به تصویر زیر به هم متصل کنید:
کد آردوینو برای کنترل سرعت دو موتور
پس از بستن مدار بالا، کد زیر را بر روی آردوینو آپلود کنید:
int in1 = 10;
int in2 = 11;
int in3 = 12;
int in4 = 13;
int speedControl1 = A2;
int speedControl2 = A1;
int ena = 9;
int enb = 6;
int setting1 = 0;
int setting2 = 0;
void setup() {
pinMode(ena, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
pinMode(ena, INPUT);
pinMode(enb, INPUT);
}
void loop() {
setting1 = analogRead(speedControl1);
setting1= setting1/4
analogWrite(ena, setting1);
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
delay(2000);
digitalWrite(in1, LOW);
delay(1000);
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
delay(2000);
digitalWrite(in2, LOW);
delay(2000);
setting2 = analogRead(speedControl2);
setting2= setting2/4
analogWrite(enb, setting2);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
delay(2000);
digitalWrite(in3, LOW);
delay(1000);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
delay(2000);
digitalWrite(in4, LOW);
delay(2000);
}
برای کنترل سرعت موتورهای DC با استفاده از پتانسیومتر، باید با دستور ()analogRead، ولتاژ آنالوگ پایههای متصل به پتانسیومترها (speedControl1 و speedControl2) را بخوانید. ولتاژ آنالوگ خوانده شده از این پایهها بسته به موقعیت پتانسیومتر، عدد صحیحی بین 0 تا 1023 خواهد بود. این مقادیر در متغیرهای setting1 و setting2 ذخیره میشود.
برای کنترل سرعت موتور از طریق L293D، باید به پایه ENABLE یک PWM اعمال کنید. سرعت موتور با توجه به Duty Cycle تغییر میکند. هر چه Duty Cycle بیشتر باشد، سرعت موتور نیز بیشتر خواهد بود. برای انجام این کار، باید از تابع analogWrite(pin, value)
استفاده کنید. متغییر pin، پایهای از آردوینو است که قرار است pwm به آن اعمال شود و value مقدار duty cycle است که میتواند مقداری بین صفر (خاموش) تا 255 (روشن با حداکثر سرعت) داشته باشد.
بنابراین، با استفاده از دستورات analogWrite(ena, setting1/4) و analogWrite(enb, setting2/4) باید ولتاژ خوانده شده از پتانسیومترها را بر 4 تقسیم کنید (زیرا مقدار خوانده شده از پتانسیومترها عددی بین 0 تا 1023 است و مقداری که به عنوان duty cycle وارد میکنید، باید در بازهی 0 تا 255 باشد) و به موتورها اعمال کنید. در نتیجه، با چرخاندن پتانسیومترها، سرعت چرخش موتورها تغییر میکند.
در این مقاله سعی داشتیم که شما با انجام سه پروژه راه اندازی موتور DC با درایور موتور L293D و آردوینو، کنترل جهت دو موتور DC و سرعت آنها به عنوان نمونه، به خوبی یاد بگیرید که چگونه با استفاده از L293D، چند موتور DC را کنترل کنید. امیدواریم که این مقاله بتواند منبع معتبر برای شما باشد.
این نکته را هم به یاد داشته باشید که میتوانید سوالات خود را در این زمینه با ما مطرح کنید.
۱۲ دیدگاه. Leave new
بسیار مفید و کار امد ممنون که هستین روبو ایکیو
سلام ابوالفضل عزیز،
خواهش میکنم، ممنون از شما که ما رو دنبال میکنی.
تمام تلاشمون رو میکنیم تا بهترین مطالب را به شما ارائه کنیم.
سلام
آیا می توان با این درایور دور موتور را تعیین نمود؟ یا فقط موتور را می توان روشن خاموش کرد؟
سلام و درود به شما،
این درایور و سایر آی سیهای درایور موتور معمول، به تنهایی قابلیت کنترل سرعت ندارند و
نیاز هست موج PWM (از طریق آردوینو، سایر میکروکنترلرها یا روشهای دیگه) بهشون اعمال بشه.
سلام . با این درایور میتوان متور براشلس را نیز کنترل کرد ؟
سلام و درود برشما دوست عزیز
خیر. سادهترین روش درایور موتور براشلس استفاده از اسپید کنترلر هست.
درود بر شما وقت بخیر مقاله عالی و کاربردی بود ممنونم
آیا امکان تشخیص موقعیت موتور توسط این آیسی و آردینو هست؟ مثلاً با میکرو سوئیچ به آردینو موقعیت موتور رو گزارش کنیم و بعد از اون موتور معکوس چرخش کنه یا خاموش بشه؟
ممنون
سلام و درود خدمت شما دوست عزیز
این آی سی درایور امکان تشخیص موقعیت را ندارد. البته اگر از میکروسوئیچ استفاه میکنید نیازی به آی سی نیست. میکروسوئیچها را مستقیماً میتوانید به آردوینو متصل کنید و در کد برنامه، وضعیت میکروسوئیچها را خوانده و بر اساس آن به موتور فرمان دهید.
سلام وقتتون بخیر
من برای راه اندازی دو موتور الکتریکی ۳ تا ۶ ولت، سرو موتور که مستقیم به ماژول وسله، ای سی l293D و میکرو esp32 استفاده کردم، از یک منبع تغذیه ۵ ولت به صورت مشترک برای همشون استفاده شده، سرو و رو میچرخونه و مشکلی نیست ولی وقتی دستور چرخش به موتور میده، همه چی قاطی میکنه و به هم میریزه، سرو و قاطی میکنه، میکرو قاطی میکنه و باید دکمه reset بزنم تا درست شه، علتش چیه؟ جریان کشی موتور هست؟ دو تا موتور کوچیک که با درایور راه اندازی میشه؟
درود برشما محمد عزیز
مضنون اصلی در این موارد تغذیه است. ممکنه جریان کشی موتورها باعث افت تغذیه شما بشه یا روی تغذیه نویزی ایجاد بشه که باعث اختلال در عملکرد میکرو بشه و… ، بنابراین ابتدا تغذیه موتورها رو جدا کنید و بررسی کنید مشکل وجود دارد یا خیر. توجه کنید که موتورها در لحظه راهاندازی تا ۵ برابر جریان نامی خودشون ممکنه جریان بکشند.
ببخشید شما تو تصویر به vcc آردوینو ولتاژ ۱۲ ولت دادین از اون ور هم یه ۵ ولت دادید آردوینو نمیسوزه؟
درود برمشا محمدرضای عزیز
تصاویر بررسی شد و همچین موردی نبود، اما در حالت کلی، این کار هرچند نیازی نیست انجام شود، باعث آسیب به آردوینو نمیشود.
موفق باشید 🙂