آردوینو, پروژه آردوینو

راه اندازی ماژول درایور L298N با آردوینو

آموزش راه اندازی ماژول درایور L298N با آردوینو

در حالی که بالأخره مجبور خواهید شد برای ساخت ربات دلخواه خود نحوه کنترل ربات‌های DC را بیاموزید ولی بد نیست این کار را با پروژه‌ای آسان‌تر مانند راه اندازی ماژول درایور L298N با آردوینو شروع کنید. این ماژول درایور می‌تواند سرعت و مسیر چرخش دو موتور DC را تعیین کند. به علاوه، ماژول نامبرده قادرست تا یک استپر موتور دوطرفه مانند NEMA 17 را نیز کنترل نماید. اینک اگر می‌خواهید ببینید این کار چگونه انجام می‌شود، با بلاگ بهنام رباتیک همراه باشید.

فهرست مطالب

لوازم مورد نیاز برای پروژه راه اندازی ماژول درایور L298N با آردوینو

کنترل موتور DC

چنان‌چه سرعت و مسیر چرخش را کنترل کنیم، قادر خواهیم بود یک موتور DC را کاملاً تحت اختیار خود داشته باشیم. برای انجام این کار باید دو تکنیک زیر را اعمال کنیم:

  • PWM: کنترل سرعت
  • H-Bridge: کنترل مسیر چرخش

حال بیایید ببینیم منظور از این دو تکنیک مورد نیاز برای راه اندازی ماژول درایور L298N با آردوینو چیست و هر کدام به چه چیزی اشاره دارند؟

PWM؛ برای کنترل سرعت موتور

شما می‌توانید با تغییر ولتاژ ورودی یک موتور DC، سرعت آن را کم یا زیاد کنید. یکی از تکنیک‌های پرطرفدار و کاربردی برای انجام این کار، مدولاسیون پهنای پالس یا همان PWM است.

PWM تکنیکی به شمار می‌رود که در آن مقدار میانگین ولتاژ ورودی توسط ارسال پالس‌های روشن و خاموش تنظیم می‌شود. این ولتاژ میانگین برای عرض پالس‌ها که با عنوان چرخه وظیفه نیز شناخته شده، ناچیز می‌باشد.

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

تصویر زیر تکنیک PWM را با چرخه‌های وظیفه متعدد و ولتاژ میانگین متعدد نشان می‌دهد.

چرخه وظیفه PWM
انواع چرخه وظیفه PWM

H-Bridge؛ برای کنترل مسیر چرخش موتور

مسیر چرخش موتور را می‌توان با تغییر قطب واردکننده ولتاژ به موتور عوض کرد. یک تکنیک پرکاربرد برای انجام این کار، H-Bridge نام دارد.

یک مدار مجهز به H-Bridge چهار سوئیچ دارد که به شکل حرف انگلیسی H مرتب شده‌اند و موتور نیز در وسط آنها جای گرفته است.

بستن دو سوئیچ به صورت همزمان سبب می‌شود که قطب واردکننده ولتاژ به موتور تغییر کند و در نتیجه مسیر چرخش موتور عوض شود.

انیمیشن زیر نحوه کارکرد مدار H-Bridge را نشان می‌دهد.

نحوه کارکرد مدار h-bridge
نحوه کارکرد مدار h-bridge

شناخت موتور درایور پیش از راه اندازی ماژول درایور L298N با آردوینو

در مرکز این ماژول یک چیپ مشکی با هیت سینک نسبتاً بزرگ دیده می‌شود که همان L298N است.

چیپ L298N در ماژول درایور L298N
چیپ L298N در ماژول درایور L298N

چیپ L298N دو H-Bridge استاندارد دارد که می‌توانند دو مدل DC را حرکت دهند؛ ویژگی که آن را برای ساخت پروژه‌های رباتیکی دارای دو چرخ، ایده‌آل می‌کند.

ولتاژ تغذیه درایور موتور L298N بیش 5 تا 35 ولت است و هر کانال آن نیز جریان متناوب 2 آمپر را ارائه خواهد کرد بنابراین با اکثر موتورهای DC سازگار خواهد بود.

آشنایی با مشخصات فنی قبل از راه اندازی ماژول درایور L298N با آردوینو

ولتاژ ورودی

5 تا 35 ولت

ولتاژ خروجی توصیه شده

7 تا 12 ولت

ولتاژ منطقی ورودی

5 تا 7 ولت

جریان متناوب هر کانال

2 آمپر

حداکثر توان خروجی

25 وات

آشنایی با پین‌ها پیش از راه اندازی ماژول درایور L298N با آردوینو

ماژول L298N مجهز به 11 پین است تا به وسیله آنها با سایر قطعات الکترونیکی در ارتباط باشد. پین‌های آن مانند تصویر زیر است:

پین‌های ماژول درایور L298N
پین‌های ماژول درایور L298N

حالا بد نیست در مورد هر کدام از پین‌ها به صورت جداگانه اطلاعات به دست بیاوریم:

پین‌های پاور

ماژول درایور موتور L298N قدرت خود را از یک ترمینال 3 پین دارای پیچ‌های 3.5 میلی‌متری دریافت می‌کند.

این ماژول دو پین ورودی قدرت دارد که عبارتند از: VS و VSS.

پین VS قدرت آی‌سی‌های داخلی H-Bridge را تأمین می‌کند تا موتورها حرکت کنند. ولتاژ ورودی این پین می‌تواند بین 5 تا 12 ولت باشد.

پین VSS هم جهت تأمین قدرت منطقی مدار آی‌سی درون L298N استفاده می‌شود و قادرست ولتاژ ورودی 5 تا 7 ولت را دریافت کند.

در نهایت پین GND نیز همان اتصال به زمین است.

پین‌های پاور L298N
پین‌های پاور L298N

شناخت پین‌های خروجی قبل از راه اندازی ماژول درایور L298N با آردوینو

کانال‌های خروجی درایور موتور L298N عبارتند از: Out1 و Out2 برای موتور اول و Out3 و Out4 برای موتور دوم. این کانال‌ها بر روی لبه ماژول و با ترمینال‌های پیچی 3.5 میلی‌متری قابل مشاهده هستند. شما می‌توانید دو موتور 5 تا 12 ولت DC را به این ترمینال‌ها وصل کنید.

هر کدام از کانال‌های روی ماژول می‌توانند تا 2 آمپر جریان خروجی به موتور DC بدهند. با این حال، مقدار جریان وارد شده به موتور بستگی به ظرفیت منبع تغذیه آن دارد.

هر کدام از کانال‌های روی ماژول می‌توانند تا 2 آمپر جریان خروجی به موتور DC بدهند. با این حال، مقدار جریان وارد شده به موتور بستگی به ظرفیت منبع تغذیه آن دارد.

پین‌های خروجی ماژول درایور L298N
پین‌های خروجی ماژول درایور L298N

شناسایی پین‌های کنترل مسیر چرخش پیش از راه اندازی ماژول درایور L298N با آردوینو

پین‌های کنترل مسیر چرخش به شما اجازه می‌دهند که مشخص کنید موتور به سمت جلو بچرخد یا عقب. این پین‌ها سوئیچ‌های H-Bridge مدار در چیپ L298N را کنترل می‌کنند.

پین‌های کنترل مسیر ماژول L298N
پین‌های کنترل مسیر ماژول L298N

این ماژول چهار پین کنترل مسیر چرخش دارد که عبارتند از؛ IN1 و IN2 برای موتور اول و IN3 و IN4 برای موتور دوم.

مسیر چرخش موتور را می‌توان با وارد کردن ولتاژ منطقی 5 ولت HIGH و یا ولتاژ منطقی LOW کنترل کرد. جدول زیر ترکیبات مختلف و خروجی‌های آنها را نشان می‌دهد:

ورودی 1

ورودی 2

مسیر چرخش

Low (0)

Low (0)

موتور خاموش

High (1)

Low (0)

حرکت به جلو

Low (0)

High (1)

حرکت به عقب

High (1)

High (1)

موتور خاموش

آشنایی با پین‌های کنترل سرعت قبل از راه اندازی ماژول درایور L298N با آردوینو

پین‌های کنترل سرعت یعنی ENA و ENB برای خاموش و روشن کردن موتور و تحت کنترل درآوردن سرعت آن به کار می‌روند.

رساندن این پین‌ها به وضعیت HIGH سبب چرخش موتور می‌شود ولی اگر آنها را به وضعیت LOW درآورید، موتور از حرکت بازخواهد ایستاد. در این میان، می‌توان با PWM سرعت موتور را کنترل کرد.

این ماژول معمولاً روی پین‌های کنترل سرعت خود جامپر دارد. این یعنی وقتی جامپر در جای خودش حضور یافته، موتور با بیشترین سرعت خواهد چرخید. چنان‌چه می‌خواهید سرعت موتورها را تعیین کنید، جامپرها را جدا کرده و آنها را به پین‌های مخصوص PWM آردوینو وصل کنید.

پین‌های کنترل سرعت ماژول L298N
پین‌های کنترل سرعت ماژول L298N

مشاهده رگولاتور 5 ولتی رو بردی و جامپر پیش از راه اندازی ماژول درایور L298N با آردوینو

ماژول L298N یک رگولاتور 5 ولتی 78M05 دارد که می‌توان آن را با جامپر فعال یا غیرفعال کرد.

وقتی این جامپر در جای خودش قرار می‌گیرد، رگولاتور 5 ولتی فعال شده و ولتاژ منطقی (VSS) از منبع تغذیه موتور (VS) دریافت می‌شود. در این حالت ولتاژ ورودی 5 ولتی ترمینال مانند پین خروجی فعالیت خواهد کرد و جریان 0.5 آمپر و ولتاژ 5 ولت ارائه می‌کند و کاربران می‌توانند با آن انرژی آردوینو یا سایر مدارهایی که به انرژی 5 ولت نیاز دارند را تأمین کنند.

هشدار: اگر منبع تغذیه موتور کمتر از 12 ولت است، می‌توانید جامپر را در جای خودش نگه دارید. با این حال، اگر بیش از 12 ولت بود، باید جامپر را جدا کرد تا رگولاتور 5 ولتی روی برد آسیب نبیند. به علاوه، وقتی جامپر در جای خودش قرار دارد، به هیچ عنوان انرژی را به پین‌های VSS و VS اعمال نکنید.

رگولاتور رو بردی ماژول درایور L298N
رگولاتور رو بردی ماژول درایور L298N

افت ولتاژ در زمان راه اندازی ماژول درایور L298N با آردوینو

L298N افت ولتاژ تقریبی 2 ولت دارد. احتمالاً این اتفاق به خاطر ترانزیستورهای سوییچینگ درونی می‌افتد که در زمان قرارگیری به سمت جلو، حدود 1 ولت افت ولتاژ دارند. همچنین، دلیل دیگر این اتفاق آن است که H-Bridge به جریان نیاز خواهد داشت تا از میان دو ترانزیستور عبور کند بنابراین مجموع افت ولتاژ 2 ولت خواهد بود.

با این اوصاف، اگر 12 ولت را به ترمینال منبع تغذیه موتور وصل کنید، تقریباً 10 ولت وارد آن خواهد شد. این یعنی یک موتور 12 ولتی DC هیچ‌گاه با بیشترین سرعت خودش نخواهد چرخید.

برای اینکه موتور با بیشترین سرعت خودش بچرخد، منبع تغذیه موتور باید ولتاژی داشته باشد که از ولتاژ واقعی مورد نیاز موتور کمی بیشتر است.

با در نظرگیری افت ولتاژ 2 ولتی، اگر از موتورهای 5 ولتی استفاده می‌کنید، می‌بایست در ترمینال منبع تغذیه موتور 7 ولت اعمال نمایید. بر این اساس، اگر موتورهای 12 ولتی دارید، باید ولتاژ منبع تغذیه آنها 12 ولت باشد.

هشدار: افت ولتاژ نسبتاً زیاد منجر به خارج شدن توان در قالب گرما می‌شود. در واقع به همین دلیل است که L298N به هیت سینک نیاز دارد.

افت ولتاژ ماژول درایور L298N
افت ولتاژ ماژول درایور L298N

سیم‌پیچی مدار جهت راه اندازی ماژول درایور L298N با آردوینو

حالا که تقریباً همه چیز را در مورد ماژول L298N می‌دانیم، می‌توانیم شروع به وصل کردن آن به آردوینو بکنیم.

بد نیست کارمان را با بستن موتور منبع تغذیه آغاز نماییم. در پروژه راه اندازی ماژول درایور L298N با آردوینو، از موتورهای DC چرخ‌دنده‌ای که بعضاً با عنوان TT شناخته می‌شوند، استفاده شده است. این موتورها که بیشتر در ربات‌های دو چرخ یافت می‌گردند، ولتاژ ورودی 3 تا 12 ولت دارند. به همین خاطر ما یک منبع تغذیه 12 ولت را به ترمینال VS وصل می‌کنیم. از آن جایی که L298N دارای افت ولتاژ 2 ولتی است، موتورها 10 ولت دریافت خواهند کرد و با تعداد دور کمتری خواهند چرخید؛ موضوعی که مشکلی ایجاد نمی‌کند.

در مرحله بعد باید ولتاژ ورودی منطقی 5 ولت را به مدار L298N وارد کنیم. برای انجام این کار، از رگولاتور رو بردی 5 ولت استفاده می‌کنیم تا از منبع تغذیه به همین مقدار انرژی دریافت شود و جامپر سر جای خودش باقی بماند.

حالا ورودی ماژول L298N را وصل کرده و پین‌های ENA، IN1، IN2، IN3، IN4 و ENB را به پین‌های خروجی دیجیتال آردوینو یعنی 9، 8، 7، 5، 4 و 3 وصل می‌کنیم. توجه داشته باشید که پین‌های 9 و 3 آردوینو با PWM سازگار هستند.

در نهایت، یکی از موتورها را به ترمینال اول (OUT1 و OUT2) و موتور دیگر را به ترمینال دوم (OUT3 و OUT4) وصل می‌کنیم. البته شما می‌توانید اتصالات مربوط به موتورها را عوض کنید زیرا هیچ روش صرفاً درست یا غلطی برای این کار وجود ندارد.

سیم‌پیچی ماژول درایور L298N با آردوینو
سیم‌پیچی ماژول درایور L298N با آردوینو

کدهای نمونه برای راه اندازی ماژول درایور L298N با آردوینو

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

این کدها موتور را در یک مسیر و برای یک دور حرکت می‌دهند و سپس آن را در سمت مخالف می‌چرخانند. ضمن اینکه چند کد مربوط به کاهش یا افزایش سرعت نیز وجود دارد.

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

				
					// Motor A connections
int enA = 9;
int in1 = 8;
int in2 = 7;
// Motor B connections
int enB = 3;
int in3 = 5;
int in4 = 4;

void setup() {
	// Set all the motor control pins to outputs
	pinMode(enA, OUTPUT);
	pinMode(enB, OUTPUT);
	pinMode(in1, OUTPUT);
	pinMode(in2, OUTPUT);
	pinMode(in3, OUTPUT);
	pinMode(in4, OUTPUT);
	
	// Turn off motors - Initial state
	digitalWrite(in1, LOW);
	digitalWrite(in2, LOW);
	digitalWrite(in3, LOW);
	digitalWrite(in4, LOW);
}

void loop() {
	directionControl();
	delay(1000);
	speedControl();
	delay(1000);
}

// This function lets you control spinning direction of motors
void directionControl() {
	// Set motors to maximum speed
	// For PWM maximum possible values are 0 to 255
	analogWrite(enA, 255);
	analogWrite(enB, 255);

	// Turn on motor A & B
	digitalWrite(in1, HIGH);
	digitalWrite(in2, LOW);
	digitalWrite(in3, HIGH);
	digitalWrite(in4, LOW);
	delay(2000);
	
	// Now change motor directions
	digitalWrite(in1, LOW);
	digitalWrite(in2, HIGH);
	digitalWrite(in3, LOW);
	digitalWrite(in4, HIGH);
	delay(2000);
	
	// Turn off motors
	digitalWrite(in1, LOW);
	digitalWrite(in2, LOW);
	digitalWrite(in3, LOW);
	digitalWrite(in4, LOW);
}

// This function lets you control speed of the motors
void speedControl() {
	// Turn on motors
	digitalWrite(in1, LOW);
	digitalWrite(in2, HIGH);
	digitalWrite(in3, LOW);
	digitalWrite(in4, HIGH);
	
	// Accelerate from zero to maximum speed
	for (int i = 0; i < 256; i++) {
		analogWrite(enA, i);
		analogWrite(enB, i);
		delay(20);
	}
	
	// Decelerate from maximum speed to zero
	for (int i = 255; i >= 0; --i) {
		analogWrite(enA, i);
		analogWrite(enB, i);
		delay(20);
	}
	
	// Now turn off motors
	digitalWrite(in1, LOW);
	digitalWrite(in2, LOW);
	digitalWrite(in3, LOW);
	digitalWrite(in4, LOW);
}
				
			

توضیح کدهای مربوط به راه اندازی ماژول درایور L298N با آردوینو

کدهای نوشته شده در آردوینو نسبتاً ساده‌اند زیرا برای فعالیت به هیچ کتابخانه‌ای نیاز ندارند. این کدها با اشاره به اینکه پین‌های آردوینو به پین‌های کنترل L298N وصل شده‌اند، آغاز گردیده‌اند.

				
					// Motor A connections
int enA = 9;
int in1 = 8;
int in2 = 7;
// Motor B connections
int enB = 3;
int in3 = 5;
int in4 = 4;
				
			

در بخش تنظیمات کد، همه پین‌های کنترلی موتور مانند چرخش و سرعت به عنوان خروجی دیجیتالی در نظر گرفته شده‌اند و پین‌های مسیر چرخش برچسب LOW خورده‌اند تا در ابتدا هر دو موتورها غیرفعال باشند.

				
					void setup() {
	// Set all the motor control pins to outputs
	pinMode(enA, OUTPUT);
	pinMode(enB, OUTPUT);
	pinMode(in1, OUTPUT);
	pinMode(in2, OUTPUT);
	pinMode(in3, OUTPUT);
	pinMode(in4, OUTPUT);
	
	// Turn off motors - Initial state
	digitalWrite(in1, LOW);
	digitalWrite(in2, LOW);
	digitalWrite(in3, LOW);
	digitalWrite(in4, LOW);
}
				
			

در مرحله بعد، دو تابع تعریف شده را می‌بینیم که هر کدام 1 ثانیه تأخیر دارند.

				
					void loop() {
	directionControl();
	delay(1000);
	speedControl();
	delay(1000);
}
				
			

این توابع عبارتند از:

directionControl(): این تابع باعث می‌شود هر دو موتورها به مدت 2 ثانیه با بیشترین سرعت ممکن بچرخند. سپس مسیر چرخش آنها به مدت 2 ثانیه عوض و در نهایت متوقف خواهند شد.

				
					void directionControl() {
	// Set motors to maximum speed
	// For PWM maximum possible values are 0 to 255
	analogWrite(enA, 255);
	analogWrite(enB, 255);

	// Turn on motor A & B
	digitalWrite(in1, HIGH);
	digitalWrite(in2, LOW);
	digitalWrite(in3, HIGH);
	digitalWrite(in4, LOW);
	delay(2000);
	
	// Now change motor directions
	digitalWrite(in1, LOW);
	digitalWrite(in2, HIGH);
	digitalWrite(in3, LOW);
	digitalWrite(in4, HIGH);
	delay(2000);
	
	// Turn off motors
	digitalWrite(in1, LOW);
	digitalWrite(in2, LOW);
	digitalWrite(in3, LOW);
	digitalWrite(in4, LOW);
}
				
			
  • speedControl(): این تابع از analogWrite() استفاده می‌کند تا سیگنال PWM تولید نماید که پیش از کاهش سرعت موتورها و رساندن آن به 0، هر دو موتورها را از 0 تا بیشترین سرعت به حرکت درمی‌آورد. در نهایت نیز موتورها از حرکت می‌ایستند.
				
					void speedControl() {
	// Turn on motors
	digitalWrite(in1, LOW);
	digitalWrite(in2, HIGH);
	digitalWrite(in3, LOW);
	digitalWrite(in4, HIGH);
	
	// Accelerate from zero to maximum speed
	for (int i = 0; i < 256; i++) {
		analogWrite(enA, i);
		analogWrite(enB, i);
		delay(20);
	}
	
	// Decelerate from maximum speed to zero
	for (int i = 255; i >= 0; --i) {
		analogWrite(enA, i);
		analogWrite(enB, i);
		delay(20);
	}
	
	// Now turn off motors
	digitalWrite(in1, LOW);
	digitalWrite(in2, LOW);
	digitalWrite(in3, LOW);
	digitalWrite(in4, LOW);
}

				
			

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

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