در این جلسه به آموزش کنترل موتور DC با آردوینو میپردازیم. نگاه کلیای به تکنولوژیهای اساسی جهت کنترل موتور DC خواهیم داشت و سپس دو مثال میزنیم که از طریق آنها کنترل موتور DC با استفاده از درایور L298N و بُرد آردوینو شرح داده میشود.
کنترل PWM موتور DC
PWM یا مدولاسیون پهنای باند تکنیکی است که به ما امکان تغییر مقدار متوسط ولتاژ که به دستگاه الکترونیکی داده میشود، از طریق خاموش و روشن کردن منبع تغذیه با سرعت بسیار زیاد را میدهد. مقدار میانگین ولتاژ به دوره کاری (duty cycle) و یا به عبارت دیگه به نسبت مقدار زمانی که سیگنال در حالت روشن است به مقدار زمان خاموش بودن آن در یک دوره تناوب، بستگی دارد.
مدولاسیون پهنای باند
در نتیجه، بسته به اینکه اندازه موتور چقدر باشد، به سادگی میتوانیم خروجی یک PWM آردوینو را به بیس یک ترانزیستور و یا به گیت یک ماسفت (MOSFET) متصل کرده و سرعت موتور را از طریق خروجی PWM کنترل کنیم. PWM آردوینوی کم مصرف، گیت ماسفت را که موتور فوق قوی از طریق آن درایو میشود، توسط سیگنال مربوطه مرتبا خاموش و روشن میکند.
تذکر: زمین الکتریکی آردوینو و همچنین زمین منبع تغذیه موتور باید به یکدیگر متصل شوند.
کنترل پل H موتور DC
از طرف دیگر، برای کنترل کردن جهت چرخش تنها نیاز است که جهت جریان شارش یافته در موتور را برعکس کنیم و رایجترین روش انجام این کار، استفاده از پل H یا H-Bridge است.
یک مدار پل H شامل چهار عنصر سوئیچینگ، تعدادی ترانزیستور یا ماسفت است . همچنین موتور در مرکز این ساختار H شکل قرار میگیرد. با فعالسازی همزمان دو تا از عناصر سوئیچینگ، میتوانیم جهت جریان را تغییر دهیم. بدین ترتیب جهت چرخش موتور تغییر خواهد کرد.
پل – H
در نتیجه اگر این دو روش یعنی PWM و پل H را ترکیب کنیم، کنترل کامل بر موتور DC حاصل میشود. درایورهای متنوعی برای موتور DC وجود دارد که این ویژگی را داشته باشند و L298N یکی از آنها است.
درایور L298N
L298N یک درایور پل H دوگانه است که امکان کنترل سرعت و جهت دو موتور DC متفاوت را به طور همزمان، فراهم میکند. این ماژول میتواند موتورهای DC با ولتاژ 5 الی 35 ولت و همچنین جریان بیشینه تا 2 آمپر را هدایت کند.
بیایید نگاه دقیقتری به پایههای خروجی ماژول L298N داشته باشیم و روش کارکرد آن را توضیح دهیم. ماژول دو پایانه منحنی برای موتور A و B و همچنین یک بلوک پایانه منحنی دیگر برای پین زمین الکتریکی، تغذیه Vcc برای موتور و یک پین 5 ولت که میتواند ورودی و یا خروجی باشد، دارد.
این مساله به مقدار ولتاژ استفاده شده به عنوان تغذیه Vcc موتور، بستگی دارد. ماژول همچنین یک رگولاتور 5 ولت سوار شده روی برد دارد که میتوان با استفاده از یک کانکتور (متصل کننده) آن را فعال و یا غیر فعال نمود. اگر ولتاژ تغذیه موتور تا 12 ولت و یا کمتر از آن باشد، میتوانیم رگولاتور 5 ولت را فعال کنیم. در این صورت پین 5 ولت به عنوان خروجی جهت تغذیه برد آردینو ما قابل استفاده خواهد بود. اما اگر ولتاژ موتور بیش از 12 ولت باشد، باید کانکتور را قطع کنیم زیرا این مقدار ولتاژ باعث اختلال در عملکرد و آسیب دیدن رگولاتور 5 ولت میشود. در این حالت، پین 5 ولت به عنوان ورودی، استفاده خواهد شد که به منبع تغذیه 5 ولت متصل میشود تا تراشه کاملا درست عمل کند.
باید توجه داشته باشیم که این تراشه باعث افت ولتاژ حدود 2 ولت میشود. در واقع اگر از منبع تغذیه 12 ولتی استفاده کنیم، ولتاژ در پایانههای موتور 10 ولت خواهد بود. این بدان معناست که ما نمیتوانیم بیشینه سرعت موتور DC 12 ولتی را داشته باشیم.
سپس پینهای کنترلی منطقی را مشاهده میکنیم. فعالسازهای A و B جهت فعالسازی کنترل کننده سرعت موتور به کار میروند. اگر یک سیم اتصال به این پین متصل باشد، موتور فعالسازی شده و با بیشینه سرعت شروع به کار میکند. همچنین اگر سیم اتصال را قطع کنیم، میتوانیم یک ورودی PWM به این پین متصل کرده و به این صورت سرعت موتور را کنترل کنیم. اگر این پین را به زمین مدار متصل کنیم، موتور متوقف خواهد شد.
سپس، پینهای ورودی 1 و 2 برای کنترل جهت چرخش موتور A و ورودیهای 3 و 4 برای موتور B استفاده میشوند. با استفاده از این پینها ما در واقع سوئیچهای پل H درون تراشه L298N را کنترل میکنیم. اگر ورودی 1 غیرفعال و ورودی 2 فعال باشد، موتور در جهت رو به جلو حرکت میکند و همینطور برعکس یعنی اگر ورودی 1 فعال و ورودی 2 غیرفعال باشد، موتور در خلاف جهت حرکت خواهد کرد.
در حالتی که هر دو ورودی مشابه یکدیگر باشند، چه هر دو فعال و چه غیرفعال، موتور متوقف خواهد شد. پینهای ورودی 3 و 4 نیز عملکرد مشابهی برای موتور B خواهند داشت.
آردینو و L298N
حالا وقت آن رسیده که کمی با کاربردهای عملی آشنا شویم. در مثال اول، ما سرعت موتور را با استفاده از یک پتانسیومتر کنترل کرده و جهت چرخش آن را توسط یک کلید فشاری تغییر میدهیم. شماتیک مداری این پروژه دراینجا آورده شده است.
پس یک درایور L298N، یک موتور DC، یک پانسیومتر، یک کلید فشاری و همچنین یک برد آردینو نیاز داریم.
- L298N
- موتور DC با گشتاور زیاد 12 ولتی ۲ عدد
- چرخ تایر پلاستیکی (فک کنم بهش چرخ هرزگرد هم میگن عکس را ببینید.)
- برد آردوینو
- برد بورد و سیمهای اتصال
کد آردوینو کنترل موتور DC با آردوینو
در اینجا کد مربوط به این پروژه را مشاهده میکنید.
/* Arduino DC Motor Control - PWM | H-Bridge | L298N - Example 01 by Dejan Nedelkovski, www.HowToMechatronics.com */ #define enA 9 #define in1 6 #define in2 7 #define button 4 int rotDirection = 0; int pressed = false; void setup() { pinMode(enA, OUTPUT); pinMode(in1, OUTPUT); pinMode(in2, OUTPUT); pinMode(button, INPUT); // Set initial rotation direction digitalWrite(in1, LOW); digitalWrite(in2, HIGH); } void loop() { int potValue = analogRead(A0); // Read potentiometer value int pwmOutput = map(potValue, 0, 1023, 0 , 255); // Map the potentiometer value from 0 to 255 analogWrite(enA, pwmOutput); // Send PWM signal to L298N Enable pin // Read button - Debounce if (digitalRead(button) == true) { pressed = !pressed; } while (digitalRead(button) == true); delay(20); // If button is pressed - change rotation direction if (pressed == true & rotDirection == 0) { digitalWrite(in1, HIGH); digitalWrite(in2, LOW); rotDirection = 1; delay(20); } // If button is pressed - change rotation direction if (pressed == false & rotDirection == 1) { digitalWrite(in1, LOW); digitalWrite(in2, HIGH); rotDirection = 0; delay(20); } }
شرح کد
ابتدا باید پینها و تعدادی متغیر که برای نوشتن این برنامه به آنها نیاز داریم را تعریف کنیم. در بخش تنظیمات، باید حالت اولیه پینها و همچنین جهت چرخش موتور را مشخص کنیم. در بخش loop، ابتدا مقدار پتانسیومتر را میخوانیم و سپس مقدار خوانده شده را که عددی در بازه 0 تا 1023 است به مقداری در بازه 0 تا 255 که معادل 0 تا 100 درصد برای چرخه تناوب سیگنال PWM میباشد، تبدیل میکنیم. سپس با استفاده از تابع ()analogWrite مقدار سیگنال PWM را به پین فعالساز بورد L298N که در واقع موتور را درایو میکند، میفرستیم.
سپس چک میکنیم که آیا کلید فشرده شده است و اگر این اتفاق افتاده بود، جهت چرخش موتور را با تنظیم ورودیهای 1 و 2 به صورت برعکس همدیگر تغییر میدهیم. کلید فشاری به عنوان یک دکمه ضامن عمل میکند و هر بار آن را بفشاریم، جهت چرخش موتور مجددا عوض خواهد شد.
خودرو رباتیکی کنترل شونده با L298N
به محض اینکه این کار را یاد گرفتیم، میتوانیم خودرو رباتیکی خود را با آردوینو بسازیم. مدار شماتیک این پروژه در زیر آورده شده است.
قطعاتی که به آنها نیاز داریم عبارت اند از: دو عدد موتور DC، یک درایور L298N، یک بورد آردوینو و یک فرمان هدایت کننده.
برای تامین برق مورد نیاز، از سه باتری 3.7V Li-ion استفاده میکنیم تا بتوانند در مجموع 11V مورد نیاز را تامین کنند. ما شاسی خودرو را از تختهی سه لا با ضخامت 3 میلیمتر ساختیم و با استفاده از بستهای فلزی، موتور را به آن متصل کردیم. چرخها را به موتور و همچنین یک چرخ گردان نیز به جلوی شاسی خودرو اضافه کردیم.
حالا نگاهی به کد آردوینو میاندازیم و میبینیم چگونه عمل میکند. (کد به صورت کامل در زیر موجود است)
int xAxis = analogRead(A0); // Read Joysticks X-axis int yAxis = analogRead(A1); // Read Joysticks Y-axis
پس از تعریف بخش حلقه، با خواندن مقادیرمحورهای x و y مربوط به فرمان شروع میکنیم. این فرمان در واقع از دو پتانسیومتر تشکیل شده است که به ورودی آنالوگ آردوینو متصل شدهاند و مقداری بین 0 تا 1023 دارند. وقتی فرمان در حالت مرکزی آن قرار گیرد، مقدار هر دو پتانسیومتر حدود 512 است.
ما یک بازه را به عنوان محدودهی متغیر برای آن در نظر گرفته و از 470 تا 550 را به عنوان مرکز در نظر میگیریم. در نتیجه اگر ما محور y فرمان را خلاف جهت اصلی حرکت دهیم، مقدار حاصل کمتر از 470 خواهد شد در این حالت ما با استفاده از چهار پین ورودی جهت چرخش هر دو موتور را رو به عقب تنظیم میکنیم.
سپس مقادیر کم شونده از 470 تا 0 را به یک موج PWM با مقادیر افزاینده از 0 تا 255 که در واقع سرعت موتور است، تبدیل میکند.
// Y-axis used for forward and backward control if (yAxis < 470) { // Set Motor A backward digitalWrite(in1, HIGH); digitalWrite(in2, LOW); // Set Motor B backward digitalWrite(in3, HIGH); digitalWrite(in4, LOW); // Convert the declining Y-axis readings for going backward from 470 to 0 into 0 to 255 value for the PWM signal for increasing the motor speed motorSpeedA = map(yAxis, 470, 0, 0, 255); motorSpeedB = map(yAxis, 470, 0, 0, 255); }
به طور مشابه اگر فرمان را در جهت محور y رو به جلو حرکت دهیم، مقدار متغیر بیشتر از 550 میشود. در این حالت موتورها را در حالت حرکت به سمت جلو قرار داده و مقادیر خوانده شده از 550 تا 1023 را به بازه 0 تا 255 برای موج PWM تبدیل میکند. اگر فرمان در حالت مرکزی خودش بماند، سرعت موتورها برابر صفر خواهد شد.
حالا بیایید عملکرد محور x را برای کنترل خودرو در جهت چپ یا راست بررسی کنیم.
// X-axis used for left and right control if (xAxis < 470) { // Convert the declining X-axis readings from 470 to 0 into increasing 0 to 255 value int xMapped = map(xAxis, 470, 0, 0, 255); // Move to left - decrease left motor speed, increase right motor speed motorSpeedA = motorSpeedA - xMapped; motorSpeedB = motorSpeedB + xMapped; // Confine the range from 0 to 255 if (motorSpeedA < 0) { motorSpeedA = 0; } if (motorSpeedB > 255) { motorSpeedB = 255; } }
به طور مشابه، اول باید مقادیر خوانده شده از روی محور x را به مقادیر متناظر برای سرعت که بین 0 تا 255 است، تبدیل کنیم. برای حرکت به سمت چپ ما از این مقدار خوانده شده برای کاهش سرعت موتور سمت چپی و افزایش موتور سمت راستی استفاده میکنیم.
در اینجا به دلیل وجود توابع محاسباتی، از دو عبارت if جهت تعریف سرعت موتورها در بازه 0 تا 255 استفاده شده است.
همچنین برای هدایت کردن خودرو به سمت راست نیز از روش مشابهی استفاده میشود. بسته به ولتاژ اعمالی و خود موتور، در سرعتهای کم موتور قادر به شروع حرکت نیست و صدای ناچیزی تولید میکند. در مورد پروژه ما، اگر مقدار سیگنال PWM کمتر از 70 باشد، این اتفاق رخ میدهد یعنی موتور قادر به حرکت نخواهد بود. از این رو با استفاده از آن دو عبارت if بازه سرعت از 70 تا 255 در نظر گرفته شد.
در نهایت، مقادیر سرعت موتورها و یا سیگنال PWM را به پینهای فعالساز درایور L298N ارسال میشود.
// Prevent buzzing at low speeds (Adjust according to your motors. My motors couldn't start moving if PWM value was below value of 70) if (motorSpeedA < 70) { motorSpeedA = 0; } if (motorSpeedB < 70) { motorSpeedB = 0; } analogWrite(enA, motorSpeedA); // Send PWM signal to motor A analogWrite(enB, motorSpeedB); // Send PWM signal to motor B
در زیر کد کامل پروژهی ربات خودرو با آردینو در دسترس است.
/* Arduino DC Motor Control - PWM | H-Bridge | L298N Example 02 - Arduino Robot Car Control by Dejan Nedelkovski, www.HowToMechatronics.com */ #define enA 9 #define in1 4 #define in2 5 #define enB 10 #define in3 6 #define in4 7 int motorSpeedA = 0; int motorSpeedB = 0; void setup() { pinMode(enA, OUTPUT); pinMode(enB, OUTPUT); pinMode(in1, OUTPUT); pinMode(in2, OUTPUT); pinMode(in3, OUTPUT); pinMode(in4, OUTPUT); } void loop() { int xAxis = analogRead(A0); // Read Joysticks X-axis int yAxis = analogRead(A1); // Read Joysticks Y-axis // Y-axis used for forward and backward control if (yAxis < 470) { // Set Motor A backward digitalWrite(in1, HIGH); digitalWrite(in2, LOW); // Set Motor B backward digitalWrite(in3, HIGH); digitalWrite(in4, LOW); // Convert the declining Y-axis readings for going backward from 470 to 0 into 0 to 255 value for the PWM signal for increasing the motor speed motorSpeedA = map(yAxis, 470, 0, 0, 255); motorSpeedB = map(yAxis, 470, 0, 0, 255); } else if (yAxis > 550) { // Set Motor A forward digitalWrite(in1, LOW); digitalWrite(in2, HIGH); // Set Motor B forward digitalWrite(in3, LOW); digitalWrite(in4, HIGH); // Convert the increasing Y-axis readings for going forward from 550 to 1023 into 0 to 255 value for the PWM signal for increasing the motor speed motorSpeedA = map(yAxis, 550, 1023, 0, 255); motorSpeedB = map(yAxis, 550, 1023, 0, 255); } // If joystick stays in middle the motors are not moving else { motorSpeedA = 0; motorSpeedB = 0; } // X-axis used for left and right control if (xAxis < 470) { // Convert the declining X-axis readings from 470 to 0 into increasing 0 to 255 value int xMapped = map(xAxis, 470, 0, 0, 255); // Move to left - decrease left motor speed, increase right motor speed motorSpeedA = motorSpeedA - xMapped; motorSpeedB = motorSpeedB + xMapped; // Confine the range from 0 to 255 if (motorSpeedA < 0) { motorSpeedA = 0; } if (motorSpeedB > 255) { motorSpeedB = 255; } } if (xAxis > 550) { // Convert the increasing X-axis readings from 550 to 1023 into 0 to 255 value int xMapped = map(xAxis, 550, 1023, 0, 255); // Move right - decrease right motor speed, increase left motor speed motorSpeedA = motorSpeedA + xMapped; motorSpeedB = motorSpeedB - xMapped; // Confine the range from 0 to 255 if (motorSpeedA > 255) { motorSpeedA = 255; } if (motorSpeedB < 0) { motorSpeedB = 0; } } // Prevent buzzing at low speeds (Adjust according to your motors. My motors couldn't start moving if PWM value was below value of 70) if (motorSpeedA < 70) { motorSpeedA = 0; } if (motorSpeedB < 70) { motorSpeedB = 0; } analogWrite(enA, motorSpeedA); // Send PWM signal to motor A analogWrite(enB, motorSpeedB); // Send PWM signal to motor B }
به انتهای اموزش این پروژه رسیدیم. در قسمتهای بعدی به این پروژه بخشهای جدید شامل بلوتوث و وسایل رادیویی جهت فعالسازی گوشی هوشمند و کنترل از راه دور اضافه خواهد شد.
- منبع: ترجمه از سایت howtomechatronics.com
اگر آموزش کنترل موتور DC با آردوینو براتون مفید واقع شده ما را نیز دعا کنید و اگر خواستین میتوانید از محتوای رایگان آموزشی حمایت مالی کنید.
اگر این نوشته برایتان مفید بود لطفا کامنت بنویسید.
سلام جمله زکات علم آموزش به دیگران است از اینکه با من هم عقیده هستید خوشحالم در مورد عیوب اتو مبیل های for weel drive هر سوعالی باشد تلفنی پاسخ گو هستم
سلام آقا سید
به تازگی با سایت خوبت آشنا شدم.
من دانشجوی مهندسی برق صنعتی دانشگاه آزادم که دوسال از دوره ام گذشته و متاسفانه نه دانشگاه خوبی دارم نه خودم دنبال درس بودم.
الان علاقه عجیبی به مدارات کوچک و مخصوصا ساخت هواپیما و ماشین rc بنزینی و برقی پیدا کردم.
از الکترونیک و اردویینو هیچ زمینه ای ندارم ولی برای ساخت رادیو کنترل و غیره به مفاهیمی نیاز مندم، از شما درخواست دارم منو راهنمایی کنید از کجا شروع کنم واقعا در این وسعت علم الکترونیک گیج شدمه. خیلی هم علاقه دارم اردویینو را حرفه ای بشوم ولی نمیدانم چکار کنم و من 2 سال وقت آزاد دارم که در حال مطالعه انگلیسی هستم.
قدردان زحمات شما هستم.
سلام، لینک زیر را مطالعه کنید: https://bit.ly/3jFAxcV
سلام دوست عزیز
اگه یه ساخت ربات زمینی و پهپاد ها علاقه داری پیشنهاد میکنم حتما یه سری به سایت زیر بزن
shasirobot.ir
سلام
من موتور 24 ولت دارم
باید چه کنم
سلام، فقط از منبع تغذیه ۲۴ برای خود موتور استفاده کن. فقط خود موتور! ب
با سلام و خداقوت
خیلی سایت عالی دارید
میشه ماژول ژویستیک رو وصل نکنیم . بجاش به کمک ماژول بلوتوث HC05 با گوشی هدایت کرد?
سلام آموزش اتصال بلوتوث به آردوینو سایت را ببین اونجا توضیح دادیم.
https://melec.ir/%d8%a7%d8%aa%d8%b5%d8%a7%d9%84-%d9%85%d8%a7%da%98%d9%88%d9%84-%d8%a8%d9%84%d9%88%d8%aa%d9%88%d8%ab-hc-05-%d8%a8%d9%87-%d8%a2%d8%b1%d8%af%d9%88%db%8c%d9%86%d9%88/
و لینک زیر:
https://melec.ir/category/microcontrollers/arduino-boards/arduino-projects/
سلام
چجوری میشه به جای ژویستیک از ریموت استفاده کرد
سلام آموزش اتصال بلوتوث به آردوینو سایت را ببین اونجا توضیح دادیم.
https://melec.ir/%d8%a7%d8%aa%d8%b5%d8%a7%d9%84-%d9%85%d8%a7%da%98%d9%88%d9%84-%d8%a8%d9%84%d9%88%d8%aa%d9%88%d8%ab-hc-05-%d8%a8%d9%87-%d8%a2%d8%b1%d8%af%d9%88%db%8c%d9%86%d9%88/
و لینک زیر:
https://melec.ir/category/microcontrollers/arduino-boards/arduino-projects/
سلام ببخشید کد ها درست هست؟ چون نمیتونم داخل اردوینو ام بارگزاری کنم هی ارور کامپلیت میده میشه کمکم کنید
سلام، در مورد درستی کدها چون مطلب ترجمه هست زیر مطلب سایت مرجع آن هست و به احتمال زیاد که تست شده توسط نویسنده مطب. در مورد خطا و موارد دیگر لطفا اطلاعات بیشتر در اختیار قرار بدید تا من یا دوستان اگر بلد بودن کمک کنن. اگر خطایی موقع کامپایل هست، آیا یک کد ساده تر روی همین پروژه تست زدین؟ بدون کد دستی موتوها و درایور را تست کردین؟ خروجی PWM داری یا نه؟
سلام متشکرم از روی متن انگلیسی
اش کپی کردم کامپلیت شد ممنون
سلام یک سوال دیگه داشتم میشه کد رو یک جوری برنامه ریزی کرد که اگه جوی استیک دو به چپ و راست حرکت میدیم فقط یک موتور راست و چپ بره و وقتی بالا و پایین حرکت میدیم فقط موتور دیگه راست وچپ بره.
همچین چیزی ممکنه و اینکه کجای کد رو باید اصلاح کنم.ممنون.
سلام ببخشید یک سوال دیگه داشتم.
میشه کد رو یک جور برنامه ریزی کرد که با حرکت دادن جویستینگ در محور y فقط ارمیچر شماره ۱ و با حرکت دادنش در محور x فقط ارمیچر شماره ۲ حرکت کنه
همچین چیزی میشه و اگه میشه باید کجای کد رو دستکاری کنیم
سلام من یه پروژه کنترل دور موتور dcصفر تا ۲۲۰ولت با pidکنترلر و مانیتورینگ لب ویو دارم بب زحمت اگه مطالبی داریم ک بتونم تو پایانامم استفاده کنم بهم پیشنهاد بدین خیلی نیاز ب مطالب دارم
سلام . فقط قسمت دوتا جامپر ena و enb v را متوجه نشدم.یعنی باید دو تا جامپر رو در بیارم و فقط از طریق پین جلویی ( چون دوتایی هستن) به اردوینو متصل بشم؟؟ ممنون از شما.
سلام وقتتون به خیر. من در این زمینه تازه کار هستم و نیاز به راهنمایی شما عزیزان دارم. ببینید من میخوام یه پروژه ای رو انجام بدم که یک جسم حدودا نیم کیلویی رو باید به یه موتور وصل بکنم که با سرعت اروم (مثلا 10prm) دور محور به طور ممتد بچرخه. میخوام زمان طولانی دوام داشته باشه مثلا اگر سوییچ رو روشن بذارم تا یک سال هم به این چزخیدن ادامه بده داغ نکنه خرابم نشه. آیا همچین چیزی ممکن هست یا خیر؟ اگر بله ممنون میشم راهنمای کنید چجور موتوری باید بخرمک و رنج قیمتش به چه صورته؟ تا جایی تحقیق کردم موتور گیربکس دار 12v و 10prm باید بخرم. حالا نمیدونم به باتری وصل کنم بهتره یا یجوری به پریز برق. آیا برنامه نویسی هم نیازه برای این هدفی دارم؟ خیلی ممنون که زمان گذاشتین و خوندین دوستان
سلام از چه ماسفت استفاده کنم IRFZ44N خوبه ؟