شِفر (کود) جستجو

چگونه سرعت یک موتور DC را با ماجیول ESP32 و L298N کنترل کنیم

چگونه سرعت یک موتور DC را با ماجیول ESP32 و L298N کنترل کنیم

کنترل موتورها DC می‌تواند کار ساده‌ای باشد با استفاده از اجزاء و درک صحیح. در این آموزش، به بررسی نحوه کنترل دو موتور DC با استفاده از میکروکنترلر ESP32 و ماجیول درایور موتور L298N خواهیم پرداخت. در پایان این راهنما، شما قادر خواهید بود تا سرعت و جهت موتورهایتان را بر اساس سیگنال‌های PWM از ESP32 تنظیم کنید، که برای کاربردهای متنوع در رباتیک و اتوماسیون مناسب است.

ESP32_L298N_DC_اصلی

ویدئوی همراه با این آموزش یک نمونه بصری از کل فرایند، از جمله سیم‌کشی و کدنویسی (در ویدئو در :00) ارائه می‌دهد.

توضیح سخت‌افزار

ماجیول کنترلر موتور L298N
ماجیول کنترلر موتوری L298N

برای دستیابی به کنترل موتورها، ما از ماجیول درایور موتور L298N و ESP32 استفاده خواهیم کرد. ESP32 یک میکروکنترلر قدرتمند با قابلیت‌های Wi-Fi و Bluetooth است که آن را برای پروژه‌های اینترنت اشیا ایده‌آل می‌سازد. L298N یک درایور موتور H-bridge است که به ما اجازه می‌دهد جهت و سرعت موتورها را با استفاده از سیگنال‌های PWM کنترل کنیم. ماجیول L298N دارای دو مدار H-bridge است، به این معنی که می‌توانیم دو موتور را به طور مستقل کنترل کنیم. هر H-bridge اجازه کنترل بر روی جهت موتور (ساعت‌گرد یا پادساعت‌گرد) و سرعت را با تغییر سیگنال PWM می‌دهد. با اتصال پایه‌های enable و input L298N به ESP32، می‌توانیم موتورها را به طور مؤثر مدیریت کنیم.

جزئیات دیتاشیت

تولید کننده اس تی میکروالکترونیکز
شماره قطعه L298N
ولتاژ منطقی/ورودی و خروجی ۵ ولت
ولتاژ تأمین ۵-۴۶ ولت (VS)
جریان خروجی (به ازای هر کانال) ۲ آمپر به ازای هر کانال (حداکثر مطلق)
جریان اوج (به ازای هر کانال) 2.5 آمپر
راهنمای فرکانس PWM ۱ کیلوهرتز - ۱۵ کیلوهرتز
آستانه‌های منطقی ورودی ۲.۵ ولت (بالا)، ۱.۵ ولت (پایین)
افت ولتاژ / RDS(on)/ اشباع ۱.۸ ولت در ۲ آمپر
محدودیت‌های حرارتی ۱۵۰ درجه سانتی‌گراد
بسته 15-پایه مالتی وات
یادداشت‌ها / واریانت‌ها درایور موتور دوگانه H-bridge

  • اطمینان حاصل کنید که رتبه ولتاژ موتور با ولتاژ تامین L298N مطابقت داشته باشد.
  • برای عملکرد مداوم در جریان‌های بالا، از هیت سینک مناسب استفاده کنید.
  • اتصالات زمین همه اجزاء را متصل کنید تا از مرجع‌های معلق جلوگیری شود.
  • از فرکانس PWM مناسب برای کاربرد استفاده کنید (1-15 کیلوهرتز).
  • به حداکثر جریان‌های مجاز توجه کنید تا از بیش‌گرمایش جلوگیری شود.
  • قبل از نهایی کردن سیم‌کشی، جهت موتور را امتحان کنید تا از آسیب جلوگیری شود.
  • کاپاسیتورهای جداساز را در منبع تغذیه برای ثبات در نظر بگیرید.

دستورالعمل‌های سیم‌کشی

ESP32_L298N_wiring

برای اتصال L298N به ESP32، ابتدا دو موتور دی سی را به پایه‌های خروجی L298N متصل کنید. موتور 1 را به پایه‌های مشخص شده به عنوانOUT1وOUT2, و موتور 2 بهOUT3وOUT4قطبیت موتورها اهمیتی ندارد زیرا L298N جهت را کنترل خواهد کرد. سپس منبع تغذیه خارجی خود را بهVMSوGNDپایه‌ها روی L298N. اطمینان حاصل کنید که ولتاژ مناسب برای موتورهایتان است، معمولاً بین 5 ولت و 46 ولت.5Vپورت روی L298N می‌تواند برای تأمین انرژی ESP32 در صورت نیاز استفاده شود، اما اطمینان حاصل کنید که نیازهای جریان برآورده شده‌اند. برای پایه‌های کنترل، وصل کنیدENAبه GPIO 19،IN1به GPIO 18، وIN2به GPIO 5 برای موتور 1. برای موتور 2، متصل کنیدIN3به GPIO 17،IN4به GPIO 16 وENBبه GPIO 4. در نهایت، زمین‌های ESP32 و L298N را به هم وصل کنید تا یک مرجع مشترک ایجاد شود.

مثال‌های شِفر (کود) و راهنما

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


#include 
#define ENA 19
#define IN1 18
#define IN2 5
#define IN3 17
#define IN4 16
#define ENB 4
Robojax_L298N_DC_motor robot(IN1, IN2, ENA, CHA, IN3, IN4, ENB, CHB);

در این قطعه شِفر (کود)، پایه‌های کنترل برای هر دو موتورها تعریف می‌شوند. نمونه کتابخانهrobotایجاد می‌شود، که برای کنترل موتورها در طول برنامه استفاده خواهد شد. سپس، ارتباط سریال را راه‌اندازی کرده و نمونه ربات را درsetup()متن:


void setup() {
  Serial.begin(115200);
  robot.begin();
}

این ارتباط سریالی را برای اشکال‌زدایی راه‌اندازی کرده و کتابخانه کنترل موتور را برای عملکرد آماده می‌کند. در نهایت، منطق کنترل اصلی در سیستم قرار می‌گیرد.loop()تابع که می‌توانیم موتورها را بچرخانیم و سرعت آنها را تنظیم کنیم:


void loop() {
  robot.rotate(motor1, 80, CW); // run motor1 at 80% speed in CW direction
  delay(3000); // wait for 3 seconds
  robot.brake(1); // brake motor1
  delay(2000); // wait for 2 seconds
}

این بخش نشان می‌دهد که چگونه موتور ۱ را در سرعت ۸۰٪ به سمت عقربه‌های ساعت به مدت سه ثانیه بچرخانیم قبل از اینکه ترمز بگیرد. شِفر (کود) کامل شامل منطق اضافی برای موتور ۲ و سرعت‌های متنوع است که در برنامه کامل بارگذاری شده در زیر مقاله قابل مشاهده است.

نمایشگاه / چه انتظاری داشته باشید

زمانی که اجرا شود، موتور‌ها باید به سیگنال‌های PWM ارسال شده از ESP32 پاسخ دهند. شما خواهید دید که موتور ۱ در حال چرخش به سمت راست با سرعت ۸۰٪ است، که پس از آن یک عمل ترمز انجام می‌شود. برنامه همچنین شامل منطقی برای مدیریت تدریجی تغییرات سرعت است، که می‌تواند با مشاهده شتاب موتور از ۰٪ تا ۱۰۰٪ (در ویدئو در دقیقه ۰۵:۰۰) آزمایش شود. تله‌های رایج شامل عدم اتصال صحیح زمین‌ها است که می‌تواند منجر به رفتار غیرقابل پیش‌بینی شود و همچنین فراتر رفتن از ریت‌های جریان L298N که سبب گرم شدن بیش از حد آن می‌شود. مطمئن شوید که رفتار موتور را تحت نظر داشته و پارامترها را در صورت لزوم تنظیم کنید.

زمانبندی ویدیو

  • ۰۰:۴۶ مقدمه
  • 04:07 اتصال ESP32 با L298N
  • 06:10 آماده‌سازی Arduino IDE برای کار با بردهای ESP32
  • 08:15 توضیح شِفر (کود) آردوینو
  • ۱۵:۰۰ نمایش کنترل موتور تک
  • ساعت ۱۶:۰۰ نمایش کنترل ۲ موتور DC
  • :00 نمایش قدرت دهی ESP32 از L298N و برق خارجی

تصاویر

ماجیول کنترل کننده موتور L298N
ماجیول کنترل کننده موتور L298N
ESP32_L298N_DC_main
ESP32_L298N_DC_main
ESP32_L298N_wiring
ESP32_L298N_wiring
278-Library Example for L298N Module to control DC motors
زبان: C++
/*
 * Library Example for L298N Module to control DC motors
 * 
 * This code is to control a single motor. For two motor control, please open L298N_DC_2_Motors.
 * This code is ready for ESP32.
 * Watch video instructions for this code:  https://youtu.be/2JTMqURJTwg
 * 
 * Written by Ahmad Shamshiri on December 24, 2019 
 * in Ajax, Ontario, Canada. www.robojax.com
 * 
 * 
  * 
 * Get this code and other Arduino codes from Robojax.com.

or make a donation using PayPal http://robojax.com/L/?id=64

 *  * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.* 
 * This code has been downloaded from Robojax.com
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */

#include <Robojax_L298N_DC_motor.h>
// motor 1 settings
#define CHA 0
#define ENA 19 // this pin must be PWM enabled pin if Arduino board is used
#define IN1 18
#define IN2 5

// motor 2 settings
#define IN3 17
#define IN4 16
#define ENB 4// this pin must be PWM enabled pin if Arduino board is used
#define CHB 1

const int CCW = 2; // do not change
const int CW  = 1; // do not change

#define motor1 1 // do not change
#define motor2 2 // do not change

// for single motor
//Robojax_L298N_DC_motor robot(IN1, IN2, ENA, CHA, true);	

// for two motors without debug information	// Watch video instruction for this line: https://youtu.be/2JTMqURJTwg
Robojax_L298N_DC_motor robot(IN1, IN2, ENA, CHA,  IN3, IN4, ENB, CHB);

// for two motors with debug information
//Robojax_L298N_DC_motor robot(IN1, IN2, ENA, CHA, IN3, IN4, ENB, CHB, true);

void setup() {
  Serial.begin(115200);
  robot.begin();
  //L298N DC Motor by Robojax.com

}

void loop() {
  
 // robot.demo(1);
  robot.rotate(motor1, 80, CW);//run motor1 at 60% speed in CW direction
  robot.rotate(motor2, 70, CCW);//run motor1 at 60% speed in CW direction
  
  delay(3000);

  robot.brake(1);
  robot.brake(2);  
  delay(2000);


  robot.rotate(motor1, 100, CW);//run motor1 at 60% speed in CW direction
  delay(3000);
  
  robot.rotate(motor2, 100, CCW);//run motor1 at 60% speed in CW direction
  
  robot.brake(1);
  robot.brake(2);   
  delay(2000);  

  for(int i=0; i<=100; i++)
  {
    robot.rotate(motor1, i, CW);// turn motor1 with i% speed in CW direction (whatever is i) 
    delay(100);
  }
  delay(2000);
  
  robot.brake(1);
  delay(2000);  
  
  for(int i=0; i<=100; i++)
  {
    robot.rotate(motor2, i, CW);// turn motor1 with i% speed in CW direction (whatever is i) 
    delay(100);
  }
  delay(2000);
  
  robot.brake(2);
  delay(2000);    
  // Robojax L298N Library. Watch video instruction https://youtu.be/2JTMqURJTwg
}

مواردی که ممکن است به آن‌ها نیاز داشته باشید

فایل‌ها📁

کتابخانه‌های آردوینو (zip)

فایل فریزینگ