مقدمه
چرا از L293 برای درایو موتور استفاده کنیم؟
جهت چرخش و سرعت موتورها دو پارامتر مهم برای کنترل می باشند. این پارامترها می توانند توسط یک میکروکنترلر(یا بوردهای توسعه دهنده مانند آردوینو)، اما یک مشکل وجو دارد، میکروکنترلرها نمی توانند جریان مورد نیاز موتورها برای راه اندازی را تامین کنند و اگر موتور مستقیما به میکروکنترلر متصل شود باعث آسیب رسیدن به میکروکنترلر می گردد. برای مثال پایه های آردینو Uno حداکثر می توانند 40 میلی آمپر جریان را تولید کنند که این مقدار نسبت به 100 تا 200 میلی آمپر جریان مورد نیاز کنترل یک موتور کوچک، خیلی فاصله دارد. بنابراین برای راه اندازی موتور به یک درایور نیاز داریم.
L293D یکی از رایج ترین درایور های موجود می باشد که می تواند موتور DC تا 1 آمپر جریان را راه اندازی کند. L293D چهار خروجی دارد که آنرا برای کنترل استپر موتورهای 4 سیمه مناسب می سازد. همچنین L293D برای کنترل سرووموتورها نیز استفاده می شود.
لوازمی که به آن احتیاج دارید
قطعات مورد نیاز
نرم افزارهای مورد نیاز
کنترل موتور DC با L293D
سیم بندی
کد
// 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
سیم بندی
کد
برای بهبود کد می توانید از کتابخانه های آردوینو نیز کمک بگیرید.
// 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
سیم بندی
کد
این کد از کتابخانه های آردوینو است.
#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)
با سلام
خیلی متشکرم از سایت خوبتون
کاش راجب کد ها هم توضیحات مینوشتید تا افرادی مثل من که در کد نویسی مبتدی هستند بیشتر متوجه بشن
باسپاس
سلام. امیدوارم این آموزش براتون مفید بوده باشه. هر بخش از کد که نیاز به توضیح داره رو بفرمایید تا خدمتتون توضیح بدم.
موفق باشید.
با سلام
میشه رو این ریموت هم وصل کرد؟
با سلام
بله. با نوشتن کد کناسب و تهیه ماژول های مورد نظر میتوان آن را به آردوینو متصل کرد.
با سلام آموزش بسیار جامع کاملا شفاف و کاربردی است و درک خوبی از نحوه کارکرد هر موتور و راه اندازی آنها ارائه می کند.
با تشکر فراوان
سلام،
ممنون از لطفتون.
سلام وقت بخیر
ممنون بابت اشتراک اطلاعات؛ واقعا مفید بود
مهندس من میخوام وقتی روشن کنم موتور دی سی ۳۸۰ درجه راستگرد بچرخه بعدش ۳۶۰ درجه چپگرد بچرخه این کدش چی میشه؟میتونی لطف و بزرگواری کنی برام بفرستی؟
سلام، وقت شما هم بخیر
کنترل موتورهای دیسی به اون صورت که درجه گردش اون رو هم بخواید تحت کنترل داشته باشید به سادگی امکانپذیر نیست. در واقع موتورهای دیسی برای استفاده در کاربردهایی که شما بخواید زاویه گردش رو کنترل کنید، طراحی نشدند. برای همچین کاربردی (کنترل زاویه گردش) میتونید از سروو موتورها یا استپر موتورها استفاده کنید.
برای کنترل زاویه چرخش استپر موتورها میتونید از کد بخش “Controlling a Stepper Motorکنترل موتور استپر با L293D” و برای کنترل زاویه چرخش یک سروو موتور نیز میتونید از آخرین کد این آموزش در بخش “کنترل سروو موتور با L293D” استفاده کنید.
سلام آیا مدار فوق دقیقا همان مداریست که در نوعی ریش تراش فیلیپس مدل1280 استفاده شده؟چون هم موتورآن چهارسیمه وهم یک میکروسویچ روی آن بیشتر نیست واگر چنین است اگر به آن یک ماژول شارژ اضافه کنیم میتوانیم از آن بعنوان برد جایگزین استفاده کنیم یانه چون باوجود تعویض باطری مشابه به جای باطری خرابش توان راه اندازی موتوربجز یک تکان لحظه ای را ندارد؟
سلام
متاسفانه اطلاعی در رابطه با نحوه ساخت ریش تراش ها و مدارهاشون ندارم. اما به طور کلی، 4 سیمه بودن موتور مدل ریش تراشی که دارید چیزی رو در رابطه با مدل دقیق اون موتور مشخص نمیکنه چون موتورهای گوناگونی هستن که همگی میتونن 4 سیمه باشن. در رابطه با اضافه کردن یک ماژول شارژر هم، لازمه که مدل دقیق موتورتون و درایور استفاده شده برای اون رو بدونید، تا بتونید ماژول شارژ مناسب رو که توانایی تامین ولتاژ و جریان مناسب برای راه اندازی موتورتون رو داره، انتخاب کنید.