آموزش جامع L293D با برد آردوینو (کنترل جهت و سرعت موتور)
محتویات
راه های زیادی برای کنترل موتورهای DC با آردوینو وجود دارد. اما یکی از ساده ترین و محبوب ترین آنها با استفاده از آی سی درایور موتور L293D است. درایور موتور L293D به طور خاص برای کنترل موتورهای DC، استپر موتور، سلونوئیدها و هر بار دیگری با امپدانس بالا طراحی شده است. یکی از مزیت های اصلی آن این است که می تواند سرعت و جهت دو موتور DC را به طور مستقل کنترل کند.
در این آموزش به موارد زیر خواهیم پرداخت:
- نحوه عملکرد درایور موتور L293D
- نحوه اتصال موتور DC با L293D به آردوینو
- نحوه کنترل جهت موتور DC
- نحوه کنترل سرعت موتور DC
L293D چگونه کار می کند؟
L293D یک آی سی H-Bridge دو کاناله است که می تواند دو موتور DC را کنترل کند. L293D می تواند حداکثر دو موتور DC با ولتاژ 4.5 تا 36 ولت را کنترل کند.
نمودار شماتیک زیر یک نسخه ساده شده از مدار داخلی آی سی L293D را نشان می دهد:
دو جفت ترانزیستور دارلینگتون (Q1/Q4 و Q2/Q3) به عنوان یک پل H راه اندازی شده اند. یک دیود در امیتر و کلکتور هر ترانزیستور وجود دارد تا از EMF عقب موتور که باعث آسیب به ترانزیستورها می شود جلوگیری کند.
تصویر زیر نمودار پایه های L293D را نشان میدهد:
- output 1: ارائه برق برای موتور 1
- output 2: ارائه برق برای موتور 1
- output 3: ارائه برق برای موتور 2
- output 4: ارائه برق برای موتور 2
- Vcc 1: منبع تغذیه 5 ولت برای تراشه L293D
- Vcc 2: منبع تغذیه برای موتورها (4.5 ولت تا 36 ولت DC)
- enable 1، 2: موتور 1 را روشن/خاموش می کند (HIGH فعال می کند، LOW غیرفعال می کند)
- enable 3، 4: موتور 2 را روشن/خاموش می کند (HIGH فعال می کند، LOW غیرفعال می کند)
- input 1: سیگنال کنترل موتور 1
- input 2: سیگنال کنترل موتور 1
- input 3: سیگنال کنترل موتور 2
- input 4: سیگنال کنترل موتور 2
راه اندازی موتور DC با L293D
در این آموزش، ما قصد داریم چند پروژه نمونه بسازیم تا نحوه استفاده از L293D برای کنترل موتورهای DC با آردوینو را نشان دهیم. برای ساخت پروژه های نمونه، به قطعه های زیر نیاز دارید:
- Arduino Pro-Mini یا Arduino Uno
- درایور موتور L293D
- موتور DC (2 عدد)
- پتانسیومتر 10 کیلو اهم (2 عدد)
- برد بورد
- سیم های جامپر
کنترل جهت موتور 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 را به عنوان خروجی تنظیم می کنیم.
در قسمت loop، با digitalWrite(in1, HIGH) و digitalWrite(in2, LOW) سطح منطقی پایه ها را تنظیم میکنیم که باعث میشود موتور در یک جهت بچرخد. تابع delay(2000) موتور را به مدت دو ثانیه در حال چرخش نگه می دارد. سپس DigitalWrite(in1، LOW) موتور را با تنظیم in1 روی سطح منطقی LOW خاموش می کند و دستور delay(1000) به مدت یک ثانیه موتور را خاموش نگه میدارد.
همانطور که حتما میدانید، برعکس کردن اتصال پایه + و – متصل به موتور DC، باعث تغییر جهت آن میشود. بنابراین در این کد ما از همین روش استفاده میکنیم.
بعد از خاموش شدن موتور برای یک ثانیه، جهت موتور را با تنظیم in1 روی LOW و in2 روی HIGH با دستورات digitalWrite(in1, LOW) و digitalWrite(in2, HIGH) برعکس می کنیم. ما از delay(2000) برای حفظ چرخش معکوس موتور برای دو ثانیه استفاده می کنیم. سپس با تنظیم in2 روی حالت LOW با digitalWrite(in2, LOW) موتور را خاموش می کنیم.
کنترل جهت دو موتور با L293d و آردوینو
حالا بیایید موتور دوم را به مدار اضافه کنیم. برای اتصال قطعات، نمودار سیم کشی زیر را دنبال کنید:
کد آردوینو برای کنترل جهت دو موتور
این کد باعث می شود که یکی از موتورها به مدت دو ثانیه به جلو و عقب بچرخد، سپس موتور دیگر به مدت دو ثانیه به جلو و عقب بچرخد.
int in1 = 10; int in2 = 11; int in3 = 12; int in4 = 13; int ena = 9; int enb = 6; 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() { 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 با L293D
حال اجازه دهید قابلیت کنترل سرعت دو موتور را اضافه کنیم. شما باید دو پتانسیومتر 10 کیلو اهم به مدار قبلی اضافه کنید. تمام قطعات را طبق این نمودار سیم کشی وصل کنید:
کد آردوینو برای کنترل سرعت دو موتور
پس از انجام اتصالات مدار بالا، این کد را در آردوینو آپلود کنید:
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); 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); 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() تبدیل آنالوگ به دیجیتال را در پایه های پتانسیومتر انجام میدهیم. سپس این مقادیر بدست آمده را در متغیر های setting1 و setting2 ذخیره می کنیم.
L293D بسته به ولتاژ اعمال شده به پین های enable، نیرو را به موتورها ارسال می کند. هرچه ولتاژ اعمال شده به پین enable بیشتر باشد، قدرت بیشتری به موتور داده می شود و سرعت چرخش آن بیشتر می شود. بنابراین ما از analogWrite(ena,setting1)
و analogWrite(enb,setting2)
برای ارسال مقادیر خوانده شده از پتانسیومتر به موتور ها استفاده میکنیم.
اگر در مورد کدها سوالی دارید حتما در نظرات اعلام کنید.
سلام
چرا en1,2 رو وصل 5 ولت کردین ولی en3,4 رو وصل 12 ولت؟؟
سلام ممنون از سایت خوبتون
من در یک پروژه هنگام استفاده از سروو موتور به دلیل ولتاژ ابتدایی سروو با مشکل ریست شدن و فریز شدن اردوینو Uno بر میخوردم و پس از تهیه این شیلد و استفاده از آن مشکل همچنان پابرجاست
ولتاژ ورودی اردوینو ۸ ولت و ولتاژ ورودی شیلد L293D نیز ۷.۶ ولت می باشد.
ممنون میشوم راهنمایی کنید
باز هم ممنونم از سایت خوبتون
سلام عزیز
مشکلی که میفرمایید به احتمال زیاد از سمت سروو نیست کد و مدار خود را در انجمن ارسال کنید