آموزش آردوینو

آموزش جامع L293D با برد آردوینو (کنترل جهت و سرعت موتور)

راه های زیادی برای کنترل موتورهای DC با آردوینو وجود دارد. اما یکی از ساده ترین و محبوب ترین آنها با استفاده از آی سی درایور موتور L293D است. درایور موتور L293D به طور خاص برای کنترل موتورهای DC، استپر موتور، سلونوئیدها و هر بار دیگری با امپدانس بالا طراحی شده است. یکی از مزیت های اصلی آن این است که می تواند سرعت و جهت دو موتور DC را به طور مستقل کنترل کند.

در این آموزش به موارد زیر خواهیم پرداخت:

  • نحوه عملکرد درایور موتور L293D
  • نحوه اتصال موتور DC با L293D به آردوینو
  • نحوه کنترل جهت موتور DC
  • نحوه کنترل سرعت موتور DC

L293D چگونه کار می کند؟

L293D یک آی سی H-Bridge دو کاناله است که می تواند دو موتور DC را کنترل کند. L293D می تواند حداکثر دو موتور DC با ولتاژ 4.5 تا 36 ولت را کنترل کند.

نمودار شماتیک زیر یک نسخه ساده شده از مدار داخلی آی سی L293D را نشان می دهد:

L293D چگونه کار می کند؟

دو جفت ترانزیستور دارلینگتون (Q1/Q4 و Q2/Q3) به عنوان یک پل H راه اندازی شده اند. یک دیود در امیتر و کلکتور هر ترانزیستور وجود دارد تا از EMF عقب موتور که باعث آسیب به ترانزیستورها می شود جلوگیری کند.

تصویر زیر نمودار پایه های L293D را نشان میدهد:

نمودار پایه های 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 و آردوینو را به این صورت وصل کنید:

کنترل جهت موتور 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 و آردوینو

حالا بیایید موتور دوم را به مدار اضافه کنیم. برای اتصال قطعات، نمودار سیم کشی زیر را دنبال کنید:

کنترل جهت دو موتور با 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 کیلو اهم به مدار قبلی اضافه کنید. تمام قطعات را طبق این نمودار سیم کشی وصل کنید:

کنترل سرعت دو موتور 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);  
  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) برای ارسال مقادیر خوانده شده از پتانسیومتر به موتور ها استفاده میکنیم.

اگر در مورد کدها سوالی دارید حتما در نظرات اعلام کنید.

3.1 (7 نفر)

برای دریافت مطالب جدید کانال تلگرام یا پیج اینستاگرام ما را دنبال کنید.

محمد رحیمی

محمد رحیمی هستم. سعی میکنم در آیرنکس مطالب مفید قرار بدهم. سوالات مربوط به این مطلب را در قسمت نظرات همین مطلب اعلام کنید. سعی میکنم در اسرع وقت به نظرات شما پاسخ بدهم.

3 نظر

  1. سلام ممنون از سایت خوبتون
    من در یک پروژه هنگام استفاده از سروو موتور به دلیل ولتاژ ابتدایی سروو با مشکل ریست شدن و فریز شدن اردوینو Uno بر میخوردم و پس از تهیه این شیلد و استفاده از آن مشکل همچنان پابرجاست
    ولتاژ ورودی اردوینو ۸ ولت و ولتاژ ورودی شیلد L293D نیز ۷.۶ ولت می باشد.
    ممنون میشوم راهنمایی کنید
    باز هم ممنونم از سایت خوبتون

    1. سلام عزیز
      مشکلی که میفرمایید به احتمال زیاد از سمت سروو نیست کد و مدار خود را در انجمن ارسال کنید

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *