راهنمای مبتدیان برای کنترل موتور با آردینو و L293D

فهرست مطالب

مقدمه

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

چرا از L293 برای درایو موتور استفاده کنیم؟

جهت چرخش و سرعت موتورها دو پارامتر مهم برای کنترل می باشند. این پارامترها می توانند توسط یک میکروکنترلر(یا بوردهای توسعه دهنده مانند آردوینو)، اما یک مشکل وجو دارد، میکروکنترلرها نمی توانند جریان مورد نیاز موتورها برای راه اندازی را تامین کنند و اگر موتور مستقیما به میکروکنترلر متصل شود باعث آسیب رسیدن به میکروکنترلر می گردد. برای مثال پایه های آردینو Uno حداکثر می توانند 40 میلی آمپر جریان را تولید کنند که این مقدار نسبت به 100 تا 200 میلی آمپر جریان مورد نیاز کنترل یک موتور کوچک، خیلی فاصله دارد. بنابراین برای راه اندازی موتور به یک درایور نیاز داریم.

L293D یکی از رایج ترین درایور های موجود می باشد که می تواند موتور DC تا 1 آمپر جریان را راه اندازی کند. L293D چهار خروجی دارد که آنرا برای کنترل استپر موتورهای 4 سیمه مناسب می سازد. همچنین L293D برای کنترل سرووموتورها نیز استفاده می شود.

لوازمی که به آن احتیاج دارید

قطعات مورد نیاز

آردوینو Uno R3 × 1
کابل پرینتر × 1
آیسی L293D × 1
برد بورد 830 حفره ای × 1
سیم جامپر برد بورد × 1
منبع تغذیه 30 ولت 3 آمپر × 1
موتور DC گیربکس دار × 1
استپر موتور 1.65 آمپری × 1
سرووموتور دنده فلزی × 1

نرم افزارهای مورد نیاز

Arduino IDE

کنترل موتور DC با L293D

موتورهای DC مختلفی وجود دارند ولی اینجا ما از یک موتور DC براش دار ساده استفاده می کیم. این موتور یک گیربکس پلاستیکی کوچک دارد و راه اندازی آن ساده است، این موتور برای ربات های کوچک و اسباب بازی ها مناسب است.

سیم بندی

در این مدار می توانید از یک باتری 9 ولت نیز برای تامین توان موتور استفاده کنید. ابتدا مطمئن شوید همه اتصالات را درست برقرار کرده اید و سپس کد را آپلود کنید.

کد

// Basic sketch for trying out the L293D by www.Electropeak.com
// Running single DC motor by L293D
// 20/08/2018


#define MOTOR_EN_1_2  10
#define MOTOR_IN1     9
#define MOTOR_IN2     8

#define slow 64
#define normal 128
#define fast 255

int Speed; 

void Forward_Rev(void){
  analogWrite(MOTOR_EN_1_2, Speed);
  digitalWrite(MOTOR_IN1, HIGH);
  digitalWrite(MOTOR_IN2, LOW);
}

void Backward_Rev(void){
  analogWrite(MOTOR_EN_1_2, Speed);
  digitalWrite(MOTOR_IN1, LOW);
  digitalWrite(MOTOR_IN2, HIGH);
}

void Forward_ramp_up(void){
  digitalWrite(MOTOR_IN1, HIGH);
  digitalWrite(MOTOR_IN2, LOW);
  for (int i=0; i<255; i++) { analogWrite(MOTOR_EN_1_2, i); delay(10); } } void Forward_ramp_down(void){ digitalWrite(MOTOR_IN1, HIGH); digitalWrite(MOTOR_IN2, LOW); for (int i=255; i>=0; i--) {
    analogWrite(MOTOR_EN_1_2, i);
    delay(10);
  }
}

void Backward_ramp_up(void){
  digitalWrite(MOTOR_IN1, LOW);
  digitalWrite(MOTOR_IN2, HIGH);
  for (int i=0; i<255; i++) { analogWrite(MOTOR_EN_1_2, i); delay(10); } } void Backward_ramp_down(void){ digitalWrite(MOTOR_IN1, LOW); digitalWrite(MOTOR_IN2, HIGH); for (int i=255; i>=0; i--) {
    analogWrite(MOTOR_EN_1_2, i);
    delay(10);
  }
}

void Brake(void){
  digitalWrite(MOTOR_IN1, HIGH);
  digitalWrite(MOTOR_IN2, HIGH);
}

void setup() {
  
  Serial.begin(9600);
  Serial.println("L293D DC motor test");

  pinMode(MOTOR_EN_1_2, OUTPUT);
  pinMode(MOTOR_IN1, OUTPUT);
  pinMode(MOTOR_IN2, OUTPUT);
}

void loop() {

  Speed=normal; // Normal Speed

  Forward_Rev(); 
  delay(1000);
  Brake();
  delay(500);
  Backward_Rev(); 
  delay(1000);
  Brake();
  delay(500);
  Forward_ramp_up();
  Forward_ramp_down();
  Backward_ramp_up();
  Backward_ramp_down();
  
}
این یک کد خیلی ساده است و شما می توانید آنرا بهبود ببخشید.

Controlling a Stepper Motorکنترل موتور استپر با L293D

در این پروژه از یک استپر موتور 4 سیمه استفاده کردیم. می توانید استپر موتور را به 3 روش کنترل کنید. تک گام، نیم گام و گام قدرتی. شما باید اتصالات سیمی استپر موتور را بدانید اگر نمی دانید از یک اهم متر برای فهمیدن آن استفاده کنید.

سیم بندی

بعضی اوقات استپر موتورها مقدار نویز در مدارها ایجاد می کنند، می توانید برای کاهش نویز، خازن با آن موازی کنید.

کد

برای بهبود کد می توانید از کتابخانه های آردوینو نیز کمک بگیرید.

// Basic sketch for trying out the L293D by www.Electropeak.com
// Running 4-wire Stepper motor by L293D
// 20/08/2018

#define MOTOR_EN_1_2  10
#define MOTOR_EN_3_4  11
#define MOTOR_IN1     9
#define MOTOR_IN2     8
#define MOTOR_IN3     12
#define MOTOR_IN4     13

#define forward  0
#define backward 1

#define slow   10
#define normal 5
#define fast   2

#define single_step   0
#define power_step    1
#define half_step     2

int speeed; 
int direcshen;
int stepping;

void stepp(void){
  
  digitalWrite(MOTOR_EN_1_2, HIGH);
  digitalWrite(MOTOR_EN_3_4, HIGH);
  
if (direcshen==forward){
  if (stepping==single_step){
    digitalWrite(MOTOR_IN1, HIGH);
    digitalWrite(MOTOR_IN2, LOW);
    digitalWrite(MOTOR_IN3, LOW);
    digitalWrite(MOTOR_IN4, LOW);
    delay(speeed);
    digitalWrite(MOTOR_IN1, LOW);
    digitalWrite(MOTOR_IN2, HIGH);
    digitalWrite(MOTOR_IN3, LOW);
    digitalWrite(MOTOR_IN4, LOW);
    delay(speeed);
    digitalWrite(MOTOR_IN1, LOW);
    digitalWrite(MOTOR_IN2, LOW);
    digitalWrite(MOTOR_IN3, HIGH);
    digitalWrite(MOTOR_IN4, LOW);
    delay(speeed);
    digitalWrite(MOTOR_IN1, LOW);
    digitalWrite(MOTOR_IN2, LOW);
    digitalWrite(MOTOR_IN3, LOW);
    digitalWrite(MOTOR_IN4, HIGH);
    delay(speeed);  
  }
  if (stepping==half_step){
    digitalWrite(MOTOR_IN1, HIGH);
    digitalWrite(MOTOR_IN2, LOW);
    digitalWrite(MOTOR_IN3, LOW);
    digitalWrite(MOTOR_IN4, LOW);
    delay(speeed);
    digitalWrite(MOTOR_IN1, HIGH);
    digitalWrite(MOTOR_IN2, HIGH);
    digitalWrite(MOTOR_IN3, LOW);
    digitalWrite(MOTOR_IN4, LOW);
    delay(speeed);
    digitalWrite(MOTOR_IN1, LOW);
    digitalWrite(MOTOR_IN2, HIGH);
    digitalWrite(MOTOR_IN3, LOW);
    digitalWrite(MOTOR_IN4, LOW);
    delay(speeed);
    digitalWrite(MOTOR_IN1, LOW);
    digitalWrite(MOTOR_IN2, HIGH);
    digitalWrite(MOTOR_IN3, HIGH);
    digitalWrite(MOTOR_IN4, LOW);
    delay(speeed);  
    digitalWrite(MOTOR_IN1, LOW);
    digitalWrite(MOTOR_IN2, LOW);
    digitalWrite(MOTOR_IN3, HIGH);
    digitalWrite(MOTOR_IN4, LOW);
    delay(speeed);
    digitalWrite(MOTOR_IN1, LOW);
    digitalWrite(MOTOR_IN2, LOW);
    digitalWrite(MOTOR_IN3, HIGH);
    digitalWrite(MOTOR_IN4, HIGH);
    delay(speeed);
    digitalWrite(MOTOR_IN1, LOW);
    digitalWrite(MOTOR_IN2, LOW);
    digitalWrite(MOTOR_IN3, LOW);
    digitalWrite(MOTOR_IN4, HIGH);
    delay(speeed);
    digitalWrite(MOTOR_IN1, HIGH);
    digitalWrite(MOTOR_IN2, LOW);
    digitalWrite(MOTOR_IN3, LOW);
    digitalWrite(MOTOR_IN4, HIGH);
    delay(speeed);     
  }
  if (stepping==power_step){
    digitalWrite(MOTOR_IN1, HIGH);
    digitalWrite(MOTOR_IN2, HIGH);
    digitalWrite(MOTOR_IN3, LOW);
    digitalWrite(MOTOR_IN4, LOW);
    delay(speeed);
    digitalWrite(MOTOR_IN1, LOW);
    digitalWrite(MOTOR_IN2, HIGH);
    digitalWrite(MOTOR_IN3, HIGH);
    digitalWrite(MOTOR_IN4, LOW);
    delay(speeed);
    digitalWrite(MOTOR_IN1, LOW);
    digitalWrite(MOTOR_IN2, LOW);
    digitalWrite(MOTOR_IN3, HIGH);
    digitalWrite(MOTOR_IN4, HIGH);
    delay(speeed);
    digitalWrite(MOTOR_IN1, HIGH);
    digitalWrite(MOTOR_IN2, LOW);
    digitalWrite(MOTOR_IN3, LOW);
    digitalWrite(MOTOR_IN4, HIGH);
    delay(speeed);        
  }  
 }
 if (direcshen==backward){
  if (stepping==single_step){
    digitalWrite(MOTOR_IN4, HIGH);
    digitalWrite(MOTOR_IN3, LOW);
    digitalWrite(MOTOR_IN2, LOW);
    digitalWrite(MOTOR_IN1, LOW);
    delay(speeed);
    digitalWrite(MOTOR_IN4, LOW);
    digitalWrite(MOTOR_IN3, HIGH);
    digitalWrite(MOTOR_IN2, LOW);
    digitalWrite(MOTOR_IN1, LOW);
    delay(speeed);
    digitalWrite(MOTOR_IN4, LOW);
    digitalWrite(MOTOR_IN3, LOW);
    digitalWrite(MOTOR_IN2, HIGH);
    digitalWrite(MOTOR_IN1, LOW);
    delay(speeed);
    digitalWrite(MOTOR_IN4, LOW);
    digitalWrite(MOTOR_IN3, LOW);
    digitalWrite(MOTOR_IN2, LOW);
    digitalWrite(MOTOR_IN1, HIGH);
    delay(speeed);  
  }
  if (stepping==half_step){
    digitalWrite(MOTOR_IN4, HIGH);
    digitalWrite(MOTOR_IN3, LOW);
    digitalWrite(MOTOR_IN2, LOW);
    digitalWrite(MOTOR_IN1, LOW);
    delay(speeed);
    digitalWrite(MOTOR_IN4, HIGH);
    digitalWrite(MOTOR_IN3, HIGH);
    digitalWrite(MOTOR_IN2, LOW);
    digitalWrite(MOTOR_IN1, LOW);
    delay(speeed);
    digitalWrite(MOTOR_IN4, LOW);
    digitalWrite(MOTOR_IN3, HIGH);
    digitalWrite(MOTOR_IN2, LOW);
    digitalWrite(MOTOR_IN1, LOW);
    delay(speeed);
    digitalWrite(MOTOR_IN4, LOW);
    digitalWrite(MOTOR_IN3, HIGH);
    digitalWrite(MOTOR_IN2, HIGH);
    digitalWrite(MOTOR_IN1, LOW);
    delay(speeed);  
    digitalWrite(MOTOR_IN4, LOW);
    digitalWrite(MOTOR_IN3, LOW);
    digitalWrite(MOTOR_IN2, HIGH);
    digitalWrite(MOTOR_IN1, LOW);
    delay(speeed);
    digitalWrite(MOTOR_IN4, LOW);
    digitalWrite(MOTOR_IN3, LOW);
    digitalWrite(MOTOR_IN2, HIGH);
    digitalWrite(MOTOR_IN1, HIGH);
    delay(speeed);
    digitalWrite(MOTOR_IN4, LOW);
    digitalWrite(MOTOR_IN3, LOW);
    digitalWrite(MOTOR_IN2, LOW);
    digitalWrite(MOTOR_IN1, HIGH);
    delay(speeed);
    digitalWrite(MOTOR_IN4, HIGH);
    digitalWrite(MOTOR_IN3, LOW);
    digitalWrite(MOTOR_IN2, LOW);
    digitalWrite(MOTOR_IN1, HIGH);
    delay(speeed);     
  }
  if (stepping==power_step){
    digitalWrite(MOTOR_IN4, HIGH);
    digitalWrite(MOTOR_IN3, HIGH);
    digitalWrite(MOTOR_IN2, LOW);
    digitalWrite(MOTOR_IN1, LOW);
    delay(speeed);
    digitalWrite(MOTOR_IN4, LOW);
    digitalWrite(MOTOR_IN3, HIGH);
    digitalWrite(MOTOR_IN2, HIGH);
    digitalWrite(MOTOR_IN1, LOW);
    delay(speeed);
    digitalWrite(MOTOR_IN4, LOW);
    digitalWrite(MOTOR_IN3, LOW);
    digitalWrite(MOTOR_IN2, HIGH);
    digitalWrite(MOTOR_IN1, HIGH);
    delay(speeed);
    digitalWrite(MOTOR_IN4, HIGH);
    digitalWrite(MOTOR_IN3, LOW);
    digitalWrite(MOTOR_IN2, LOW);
    digitalWrite(MOTOR_IN1, HIGH);
    delay(speeed);        
  }  
 }
}

void setup() {
  
  Serial.begin(9600);
  Serial.println("L293D Stepper motor test");

  pinMode(MOTOR_EN_1_2, OUTPUT);
  pinMode(MOTOR_EN_3_4, OUTPUT);
  pinMode(MOTOR_IN1, OUTPUT);
  pinMode(MOTOR_IN2, OUTPUT);
  pinMode(MOTOR_IN3, OUTPUT);
  pinMode(MOTOR_IN4, OUTPUT);
  
}

void loop() {

  direcshen=forward;     // choose forward or backward
  speeed=fast;           // choose slow, normal or fast
  stepping=half_step;    // choose single, power or half step
  for (int i=0;i<=60;i++)
  {stepp();}

  direcshen=backward;     // choose forward or backward
  speeed=normal;           // choose slow, normal or fast
  stepping=power_step;    // choose single, power or half step
  for (int i=0;i<=50;i++)
  {stepp();}

  direcshen=backward;     // choose forward or backward
  speeed=slow;;           // choose slow, normal or fast
  stepping=single_step;    // choose single, power or half step
  for (int i=0;i<=30;i++)
  {stepp();}
  
}

کنترل سروو موتور با L293D

سرووموتورهای میکرو(به اصطلاح سرووموتورهای 9 گرمی) در بسیاری از پروژه های کوچک رباتیکی مانند بازو رباتیک کاربرد دارند. برای کنترل سرووموتور باید موج PWM تولید کنید. سرووموتورها بسته به نوعشان می توانند خیلی سریع و قدرتمند باشند.

سیم بندی

کد

این کد از کتابخانه های آردوینو است.

#include <Servo.h> 

Servo myservo;  // create servo object to control a servo
// twelve servo objects can be created on most boards

int pos = 0;    // variable to store the servo position

void setup() {
  digitalWrite(10,HIGH);
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
}

void loop() {
  for (pos = 0; pos <= 180; pos += 3) { // goes from 0 degrees to 180 degrees // in steps of 1 degree myservo.write(pos); // tell servo to go to position in variable 'pos' delay(5); // waits 15ms for the servo to reach the position } for (pos = 180; pos >= 0; pos -= 3) { // goes from 180 degrees to 0 degrees
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(5);                       // waits 15ms for the servo to reach the position
  }
}

آموزش های مشابه

Comments (10)

  • معصومه Reply

    با سلام
    خیلی متشکرم از سایت خوبتون
    کاش راجب کد ها هم توضیحات مینوشتید تا افرادی مثل من که در کد نویسی مبتدی هستند بیشتر متوجه بشن
    باسپاس

    نوامبر 6, 2020 at 2:27 ب.ظ
    • محمدرضا اکبری Reply

      سلام. امیدوارم این آموزش براتون مفید بوده باشه. هر بخش از کد که نیاز به توضیح داره رو بفرمایید تا خدمتتون توضیح بدم.
      موفق باشید.

      نوامبر 7, 2020 at 8:25 ق.ظ
  • alieza Reply

    با سلام
    میشه رو این ریموت هم وصل کرد؟

    نوامبر 15, 2020 at 11:34 ب.ظ
    • مهران ملکی Reply

      با سلام
      بله. با نوشتن کد کناسب و تهیه ماژول های مورد نظر میتوان آن را به آردوینو متصل کرد.

      نوامبر 30, 2020 at 6:47 ب.ظ
  • حسین میرزاپور Reply

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

    ژانویه 12, 2021 at 9:56 ب.ظ
    • مهران ملکی Reply

      سلام،
      ممنون از لطفتون.

      ژوئن 19, 2021 at 10:17 ق.ظ
  • هاتف Reply

    سلام وقت بخیر
    ممنون بابت اشتراک اطلاعات؛ واقعا مفید بود
    مهندس من می‌خوام وقتی روشن کنم موتور دی سی ۳۸۰ درجه راستگرد بچرخه بعدش ۳۶۰ درجه چپگرد بچرخه این کدش چی میشه؟میتونی لطف و بزرگواری کنی برام بفرستی؟

    ژوئن 15, 2021 at 8:25 ب.ظ
    • مهران ملکی Reply

      سلام، وقت شما هم بخیر
      کنترل موتورهای دی‌سی به اون صورت که درجه گردش اون رو هم بخواید تحت کنترل داشته باشید به سادگی امکان‌پذیر نیست. در واقع موتورهای دی‌سی برای استفاده در کاربردهایی که شما بخواید زاویه گردش رو کنترل کنید، طراحی نشدند. برای همچین کاربردی (کنترل زاویه گردش) میتونید از سروو موتورها یا استپر موتورها استفاده کنید.
      برای کنترل زاویه چرخش استپر موتورها میتونید از کد بخش “Controlling a Stepper Motorکنترل موتور استپر با L293D” و برای کنترل زاویه چرخش یک سروو موتور نیز میتونید از آخرین کد این آموزش در بخش “کنترل سروو موتور با L293D” استفاده کنید.

      ژوئن 19, 2021 at 10:40 ق.ظ
  • هادی ابریشمی Reply

    سلام آیا مدار فوق دقیقا همان مداریست که در نوعی ریش تراش فیلیپس مدل1280 استفاده شده؟چون هم موتورآن چهارسیمه وهم یک میکروسویچ روی آن بیشتر نیست واگر چنین است اگر به آن یک ماژول شارژ اضافه کنیم میتوانیم از آن بعنوان برد جایگزین استفاده کنیم یانه چون باوجود تعویض باطری مشابه به جای باطری خرابش توان راه اندازی موتوربجز یک تکان لحظه ای را ندارد؟

    سپتامبر 7, 2021 at 10:24 ب.ظ
    • مهران ملکی Reply

      سلام
      متاسفانه اطلاعی در رابطه با نحوه ساخت ریش تراش ها و مدارهاشون ندارم. اما به طور کلی، 4 سیمه بودن موتور مدل ریش تراشی که دارید چیزی رو در رابطه با مدل دقیق اون موتور مشخص نمیکنه چون موتورهای گوناگونی هستن که همگی میتونن 4 سیمه باشن. در رابطه با اضافه کردن یک ماژول شارژر هم، لازمه که مدل دقیق موتورتون و درایور استفاده شده برای اون رو بدونید، تا بتونید ماژول شارژ مناسب رو که توانایی تامین ولتاژ و جریان مناسب برای راه اندازی موتورتون رو داره، انتخاب کنید.

      سپتامبر 8, 2021 at 9:44 ق.ظ

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

نشانی ایمیل شما منتشر نخواهد شد.