آردوینومتوسط۹ دقیقه مطالعهArduino IDE 2.x / Uno R3

درایور موتور L298N

با درایور موتور L298N دو موتور DC را جدا از تغذیهٔ آردوینو راه‌اندازی می‌کنید؛ مفهوم پل H، جداسازی تغذیه، زمین مشترک، کنترل سرعت با PWM و عیب‌یابی‌های رایج موتور را می‌آموزید.

آنچه در این درس می‌آموزید

  • توضیح دهید چرا موتور هرگز نباید مستقیم به پین آردوینو وصل شود و پل H چطور جهت را عوض می‌کند
  • ماژول L298N را با تغذیهٔ مستقل و زمین مشترک سیم‌کشی کنید
  • جهت و سرعت دو موتور را با IN1 تا IN4 و analogWrite کنترل کنید
نویسنده: تیم داکنامه · بازبینی: ۲۰۲۶-۱۰-۳۱
فهرست مطالب

آردوینو برای خاموش‌وروشن‌کردن LED ساخته شده، نه چرخاندن موتور. موتور DC حتی کوچک در راه‌اندازی جریانی در حد صدها میلی‌آمپر و هنگام گیرکردن چند برابر آن می‌کشد، در حالی که هر پین آردوینو حداکثر ۴۰ میلی‌آمپر می‌دهد؛ وصل‌کردن مستقیم یعنی سوختن پین یا کل برد. راه‌حل، یک تقویت‌کنندهٔ قدرت به نام درایور موتور است: آردوینو فقط فرمان می‌دهد و درایور، جریان را از منبع جداگانه به موتور می‌رساند. رایج‌ترین درایور آموزشی، ماژول L298N است که دو موتور DC را هم‌زمان با کنترل جهت و سرعت هدایت می‌کند. در این درس می‌فهمید داخلش چه می‌گذرد، درست سیم‌کشی‌اش می‌کنید و اولین ربات چرخ‌دار خودتان را راه می‌اندازید.

پل H: جادوی تغییر جهت

موتور DC برای چرخش معکوس فقط لازم است جهت جریان برعکس شود. پل H (H-Bridge) همین کار را می‌کند و نامش از شکل مدار می‌آید: چهار کلید دور موتور، مثل چهار ضلع حرف H. هر نیمهٔ پل دو کلید دارد:

  • کلید بالای چپ و پایین راست بسته: جریان از چپ به راست از موتور می‌گذرد و موتور رو به جلو می‌چرخد.
  • کلید بالای راست و پایین چپ بسته: جریان برعکس می‌شود و موتور به عقب می‌چرخد.
  • هرگز دو کلید یک ضلع هم‌زمان بسته نشوند؛ اگر بشوند، مسیر کوتاه از تغذیه به زمین ساخته می‌شود (Short Circuit) و قطعه می‌سوزد. درایور، منطق ورودی‌ها طوری طراحی شده که با دو سیگنال IN این اشتباه ممکن نباشد.

تراشهٔ L298 از STMicroelectronics دو پل H کامل دارد و هر پل تا ۲ آمپر جریان می‌دهد؛ کافی برای اکثر موتورهای پروژهٔ آموزشی.

تغذیه: جداسازی و زمین مشترک

دو قاعدهٔ غیرقابل‌مذاکره:

  1. تغذیهٔ موتور جدا از آردوینو است. باتری یا آداپتور موتور به ترمینال 12V ماژول می‌رود و آردوینو فقط ۵ ولت خودش را از USB یا منبع جداگانه می‌گیرد.
  2. زمین مشترک الزامی است. GND باتری موتور، GND ماژول و GND آردوینو باید همه به هم وصل شوند؛ جریان برای بستن مدار و سیگنال برای معنا‌داربودن، به یک مرجع مشترک نیاز دارد. فراموشی زمین مشترک رایج‌ترین علت «به همه‌چیز وصل کردم و کاری نمی‌کند» است.

افت ولتاژ: قیمت قدیمی‌بودن L298N

L298 یک طراحی قدیمی با ترانزیستورهای دوقطبی (BJT) است، نه MOSFET. نتیجه: روی مسیر جریان، حدود ۱٫۴ ولت از ولتاژ تغذیهٔ شما تلف می‌شود و در جریان‌های بالا همین افت بیشتر هم می‌شود (دیتاشیت ST تا حدود ۴٫۹ ولت افت کل را در جریان بیشینه ذکر می‌کند). یعنی با باتری ۶ ولتی، موتور شاید فقط حدود ۴٫۵ ولت ببیند. اگر موتورها ضعیف‌تر از انتظار چرخیدند، این افت را در انتخاب ولتاژ تغذیه لحاظ کنید؛ مثلاً برای موتور ۶ ولتی، تغذیهٔ ۷٫۵ تا ۹ ولتی در نظر بگیرید.

پین‌ها و سیم‌کشی

پین ماژول نقش
ENA / ENB فعال‌سازی پل A / B؛ با جامپر دائم روشن، با PWM کنترل سرعت
IN1 / IN2 جهت پل A (موتور چپ)
IN3 / IN4 جهت پل B (موتور راست)
OUT1 / OUT2 خروجی پل A به ترمینال موتور اول
OUT3 / OUT4 خروجی پل B به ترمینال موتور دوم
12V (VMS) تغذیهٔ موتور؛ ۶ تا ۱۲ ولت برای شروع
GND زمین مشترک باتری و آردوینو
5V خروجی رگولاتور داخلی (با جامپر نصب) یا ورودی ۵ ولت (با جامپر برداشته)

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

جامپر کنار پین 5V مربوط به رگولاتور داخلی ماژول است: اگر جامپر بماند و تغذیهٔ موتور حدود ۷٫۵ ولت یا بیشتر باشد، ماژول خودش ۵ ولت منطق را می‌سازد. با تغذیهٔ کمتر از آن، جامپر را بردارید و پین 5V را مستقیم به 5V آردوینو وصل کنید.

آردوینو Uno ماژول L298N
D9 ENA (جامپر برداشته شود)
D8 IN1
D7 IN2
D6 ENB (جامپر برداشته شود)
D5 IN3
D4 IN4
5V 5V (فقط وقتی جامپر رگولاتور برداشته شده)
GND GND
— باتری جداگانه به ترمینال 12V و GND ماژول

پین‌های ENA و ENB به خروجی‌های PWM وصل شده‌اند (پین‌های علامت‌دار ~ روی Uno مثل 9 و 6) تا analogWrite سرعت را کنترل کند؛ این همان مفهوم درس PWM است.

اسکچ کامل: جلو، عقب، گردش

l298n-two-motors.ino
// Left motor: ENA on D9, IN1 on D8, IN2 on D7
// Right motor: ENB on D6, IN3 on D5, IN4 on D4

const int enA = 9;
const int in1 = 8;
const int in2 = 7;
const int enB = 6;
const int in3 = 5;
const int in4 = 4;

void setup() {
  pinMode(enA, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(enB, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  Serial.begin(9600);
}

void setMotors(int leftSpeed, int rightSpeed) {
  // negative speed = backward
  digitalWrite(in1, leftSpeed >= 0 ? HIGH : LOW);
  digitalWrite(in2, leftSpeed >= 0 ? LOW : HIGH);
  digitalWrite(in3, rightSpeed >= 0 ? HIGH : LOW);
  digitalWrite(in4, rightSpeed >= 0 ? LOW : HIGH);
  analogWrite(enA, abs(leftSpeed));
  analogWrite(enB, abs(rightSpeed));
}

void loop() {
  Serial.println("Forward");
  setMotors(200, 200);
  delay(2000);

  Serial.println("Backward");
  setMotors(-200, -200);
  delay(2000);

  Serial.println("Turn right");
  setMotors(200, -200);
  delay(1000);

  Serial.println("Stop");
  setMotors(0, 0);
  delay(2000);
}

توضیح نکته‌های تازه:

  1. digitalWrite(in1, ...) و digitalWrite(in2, ...) — جهت پل را تعیین می‌کنند؛ HIGH/LOW مخالف یعنی جلو، برعکسش عقب و هر دو LOW یعنی ترمز آزاد.
  2. analogWrite(enA, abs(leftSpeed)) — سرعت با مقدار ۰ تا ۲۵۵ روی پین PWM کنترل می‌شود؛ علامت منفی در ورودی تابع، فقط جهت را می‌گوید و abs آن را برای PWM مثبت می‌کند.
  3. setMotors(200, -200) — یکی جلو و یکی عقب؛ نتیجه چرخش درجا به سمت راست است. همین تابع یک‌بارنوشته را در کل پروژهٔ ربات استفاده می‌کنید.

خروجی سریال مانیتور چرخه‌ای و قطعی است:

خروجی کد

Forward Backward Turn right Stop Forward Backward

اشتباهات رایج و عیب‌یابی

نشانه علت رایج راه‌حل
موتورها اصلاً نمی‌چرخند باتری موتور وصل نیست یا جامپر ENA/ENB با سیم PWM تداخل دارد تغذیهٔ ۱۲ ولت و زمین مشترک را چک کنید؛ اگر ENA را به آردوینو وصل کرده‌اید، جامپرش را بردارید
فقط یک جهت کار می‌کند یکی از سیم‌های IN قطع یا جابه‌جاست جدول سیم‌کشی IN1 تا IN4 را سیم‌به‌سیم تطبیق دهید
آردوینو هنگام حرکت ریست می‌شود تغذیهٔ مشترک یا افت ولتاژ هنگام راه‌اندازی موتور تغذیهٔ موتور را از آردوینو جدا کنید؛ زمین‌ها مشترک بمانند
موتور می‌چرخد ولی ضعیف است افت حدود ۱٫۴ ولت در L298N یا ولتاژ کم باتری ولتاژ تغذیه را بالاتر ببرید و افت ماژول را در انتخاب باتری لحاظ کنید
در سرعت کم، موتور سوت می‌کشد یا لرزید PWM خیلی پایین برای غلبه بر اصطکاک حداقل سرعت کاربردی را پیدا کنید و زیر آن نروید

تمرین‌ها

تمرین

تمرین ۱ — حرکت مثلثی

با همان تابع setMotors الگویی بنویسید که ربات در هر چرخه ۱ ثانیه جلو برود، سپس یک ثانیه درجا بچرخد و این چرخه تکرار شود؛ سرعت هر دو حالت ۱۸۰ باشد و در شروع هر حالت، وضعیت در سریال چاپ شود.

نمایش راه‌حل

کافی است دنبالهٔ فرمان‌ها را در loop بچینید؛ چرخش درجا با سرعت‌های مخالف ساخته می‌شود:

cpp
void loop() {
  Serial.println("Move forward");
  setMotors(180, 180);
  delay(1000);

  Serial.println("Spin");
  setMotors(180, -180);
  delay(1000);
}

خروجی سریال مانیتور چنین است:

خروجی کد

Move forward Spin Move forward Spin

ربات مسیر پلی‌گون‌مانندی می‌سازد؛ با کوتاه‌کردن زمان چرخش، ضلع‌ها همسوتر می‌شوند. ::: :::

خلاصه

  • موتور هرگز مستقیم به پین آردوینو وصل نمی‌شود؛ جریان موتور چند برابر سقف ۴۰ میلی‌آمپری پین‌هاست و درایور میانجی قدرت است.
  • پل H با چهار کلید، جهت جریان موتور را عوض می‌کند؛ IN1 تا IN4 جهت و ENA/ENB با PWM سرعت را می‌سازند.
  • تغذیهٔ موتور جدا است ولی زمین همهٔ بخش‌ها مشترک؛ بدون زمین مشترک هیچ سیگنالی معنا ندارد.
  • L298N به‌خاطر طراحی BJT حدود ۱٫۴ ولت (و در جریان بالا بیشتر) افت ولتاژ دارد؛ آن را در انتخاب باتری لحاظ کنید.
  • جامپر 5V رگولاتور داخلی را با ولتاژ باتری مدیریت کنید و ماژول خودتان را با جدول پین‌های روی برد تطبیق دهید.

حالا چرخ‌ها می‌چرخند؛ در درس بعدی با RC522 وارد دنیای شناسایی می‌شویم و به پروژه‌تان «تشخیص هویت» می‌دهیم.

منابع و ارجاع‌ها