🌉 مدار پل H (H-Bridge): چپگرد و راستگرد کردن موتور
ماشین رباتیکی که فقط جلو برود، به اولین دیوار گیر میکند. برای عقب رفتن و دور زدن، موتور DC باید چپگرد و راستگرد بچرخد؛ یعنی جهت چرخشش با فرمان عوض شود. جابهجا کردن دستی دو سیم موتور جواب میدهد، ولی ربات که دست ندارد! مداری که این کار را با چهار کلید انجام میدهد مدار پل H (H Bridge Circuit) نام دارد و خیلیها به آن مدار چپگرد راستگرد هم میگویند. در این راهنما ایدهی چهار کلید و خطر اتصال کوتاهش (Shoot-Through) را میبینی، نسخهی دستی با کلید DPDT را میبندی، پایههای آیسی L293D را یکییکی میشناسی و با آردوینو موتور را جلو، عقب، ترمز و با سرعت دلخواه میچرخانی.
چرا جهت جریان، جهت چرخش را تعیین میکند؟
داخل موتور DC، جریانی که از سیمپیچ میگذرد آن را آهنربا میکند و آهنرباهای ثابت هلش میدهند. جهت این هل به جهت جریان بستگی دارد؛ پس تغییر جهت موتور DC یعنی برعکس کردن جریان: جریان را برعکس کن، موتور برعکس میچرخد. در شبیهساز دو نمونهی موتور ساده (A plain motor) و موتور برعکس (Motor reversed) را کنار هم ببین: همان موتور و همان باتری، فقط دو سیم جابهجا. درس جهت چرخش موتور در دورهی برق هم با همین آزمایش شروع میشود. اینکه کدام جهت را «راستگرد» (Clockwise) و کدام را «چپگرد» (Counter-Clockwise) بنامی، به سیمکشی و طرفی که از آن به محور نگاه میکنی بستگی دارد؛ در ربات معمولاً میگوییم «جلو» و «عقب».
قطعههای مدار پل H
| # | قطعه | English | کار در مدار |
|---|---|---|---|
| ۱ | موتور DC یا موتور گیربکس | DC / Gear Motor | باری که جهتش را عوض میکنیم |
| ۲ | پک ۴ تایی باتری قلمی | 4×AA Battery Pack (6V) | تغذیهی موتور |
| ۳ | کلید راکر × ۴ | Rocker Switch (SPST) | چهار کلید پل H دستی |
| ۴ | کلید DPDT | DPDT Reversing Switch | پل H دستی با یک دسته |
| ۵ | درایور موتور L293D | L293D Dual H-Bridge IC | دو پل H کامل در یک آیسی |
| ۶ | آردوینو اونو | Arduino Uno | فرمان جهت و سرعت |
| ۷ | کلید کشویی × ۲ | Slide Switch | فرمان دستی IN1 و IN2 در نسخهی بدون کد |
| ۸ | خازن ۱۰۰ نانوفاراد | Ceramic Capacitor | کم کردن نویز موتور |
| ۹ | بردبورد نیمه | Half-size Breadboard | جای آیسی و سیمها |
ایدهی چهار کلید
چهار کلید را دور موتور بچین: دو تا بالا (S1 و S3) به + باتری و دو تا پایین (S2 و S4) به −. موتور مثل خط افقی وسط حرف H بین دو ستون قرار میگیرد؛ اسم مدار هم از همین شکل آمده.
+V ----------+-----------+
| |
S1 S3
| |
A---(M)-----B
| |
S2 S4
| |
GND ---------+-----------+
| کلیدهای بسته | مسیر جریان در موتور | نتیجه |
|---|---|---|
| S1 و S4 | از A به B | جلو |
| S3 و S2 | از B به A | عقب |
| S2 و S4 (یا S1 و S3) | دو سر موتور به هم وصلاند | ترمز (Brake) |
| هیچکدام | — | رها (Coast) |
| S1 و S2، یا S3 و S4 | از + مستقیم به − | ⚠️ اتصال کوتاه (Shoot-Through) |
دو حالت ترمز و رها با هم فرق دارند. در ترمز، دو سر موتور به هم وصل میشوند؛ موتوری که هنوز میچرخد مثل یک ژنراتور ولتاژ میسازد و این ولتاژ از مسیر کوتاه، جریانی میسازد که خودِ چرخش را کند میکند. در رها، مسیر باز است و موتور فقط با اصطکاک آرام میایستد.
فرمول کلیدی: خطر Shoot-Through با عدد
اگر دو کلید یک ستون (مثلاً S1 و S2) همزمان بسته شوند، مسیری از + باتری مستقیم به − ساخته میشود که هیچ باری در آن نیست. جریان فقط با مقاومت داخلی باتری و کلیدها محدود میشود:
I = V ÷ (Rداخلی + Rکلیدها)
برای یک پک ۴ قلمی ۶ ولتی با مقاومت داخلی حدود ۰.۷۵ اهم: ۶ ÷ ۰.۷۵ ≈ ۸ آمپر؛ بیش از ده برابر جریان یک موتور کوچک. ترانزیستورها در کسری از ثانیه میسوزند، سیمها داغ میشوند و باتری لیتیومی ممکن است آتش بگیرد. در پلهای ترانزیستوری یک خطر پنهانتر هم هست: ترانزیستور برای خاموش شدن کمی وقت لازم دارد؛ اگر همزمان با خاموش کردن S1، کلید S2 را روشن کنی، لحظهای هر دو روشناند. برای همین درایورها یک «زمان مرده» (Dead Time) بین این دو میگذارند و آیسیهای آمادهای مثل L293D با منطق داخلیشان اجازه نمیدهند دو کلید یک ستون با هم روشن شوند.
این خطر را بیخطر در شبیهساز ببین: چهار کلید راکر را مثل شکل بالا دور یک موتور ببند و پک ۴ قلمی را وصل کن. با روشن کردن S1 و S4 موتور یک طرف میچرخد و با S3 و S2 طرف دیگر. حالا S1 و S2 را با هم روشن کن: شبیهساز حدود ۸ آمپر جریان و هشدار اتصال کوتاه باتری نشان میدهد؛ دقیقاً همان عدد فرمول. (هشدار «بار زیاد باتری» در حالت عادی هم ممکن است بیاید؛ موتور حدود نیم آمپر میکشد که برای پک قلمی زیاد است.)
پل H دستی با کلید DPDT
سادهترین پل H واقعی یک کلید DPDT است: دو کلید تبدیل کنار هم که با یک دسته جابهجا میشوند. اگر پایههای کناری را ضربدری به باتری ببندی، هر دو سر موتور با یک حرکت جابهجا میشوند. در شبیهساز پایههای DPDT با برچسب L1، C1، R1 و L2، C2، R2 مشخصاند (C پایهی مشترک هر قطب است):
| # | از | به |
|---|---|---|
| ۱ | + باتری | L1 و R2 |
| ۲ | − باتری | R1 و L2 |
| ۳ | C1 | پایهی + موتور |
| ۴ | C2 | پایهی − موتور |
دسته روی L: C1 به + و C2 به − میرسد، موتور جلو. دسته روی R: C1 به − و C2 به + میرسد، موتور عقب. چون هر قطب در هر لحظه فقط به یکی از دو سر باتری وصل است، اتصال کوتاه پیش نمیآید، به شرطی که سیمهای ضربدری را درست ببندی. این دقیقاً نمونهی جهت با کلید (Direction by switch) است. یک کلید SPDT برای این کار کافی نیست، چون باید هر دو سیم موتور همزمان عوض شوند. همین سیمکشی ضربدری را در مدار راهپله (Two-Way Switch) هم دیدهای، جایی که DPDT نقش کلید صلیبی را بازی میکند. نسخهی برقیِ همین ایده یک رلهی DPDT است که آردوینو آن را فرمان میدهد (مدار راهانداز رله (Relay Driver)).
پل H ترانزیستوری: ایدهی پشت L293D
اگر چهار کلید را با ترانزیستور عوض کنی، پل H برقی و سریع داری. معمولاً دو کلید بالا PNP (یا ماسفت P) و دو کلید پایین NPN (یا ماسفت N) هستند، با چهار دیود هرزگرد که ضربهی ولتاژ سیمپیچ را میگیرند (همان دیودی که در مدار کنترل دور موتور (Motor Speed Control) دیدیم). ساختن این پل با قطعههای جدا کار دقیقی است: باید منطق ضد Shoot-Through، زمان مرده و دیودها را خودت درست کنی. در شبیهساز ترانزیستور PNP و ماسفت P نداریم، پس این نسخه را فقط در تئوری بررسی میکنیم و برای ساختن سراغ L293D میرویم که همهی اینها را داخل خودش دارد.
آیسی L293D: دو پل H در یک تراشه
L293D یک آیسی ۱۶ پایه است با دو پل H کامل، یعنی میتواند دو موتور DC را جداگانه در دو جهت بچرخاند. حرف D یعنی دیودهای هرزگرد داخلش هستند. موتور تا ۳۶ ولت، جریان هر کانال تا ۶۰۰ میلیآمپر (لحظهای ۱.۲ آمپر). شمارهگذاری پایهها از کنار فرورفتگی (Notch) بالای آیسی شروع میشود: پایهی ۱ سمت چپ فرورفتگی است و شمارهها خلاف عقربههای ساعت دور آیسی میچرخند.
| پایه | اسم | کار | پایه | اسم | کار |
|---|---|---|---|---|---|
| ۱ | EN1 (1,2EN) | فعالساز موتور ۱، با PWM سرعت | ۱۶ | VCC1 | ۵ ولت منطق از آردوینو |
| ۲ | IN1 (1A) | جهت موتور ۱ | ۱۵ | IN4 (4A) | جهت موتور ۲ |
| ۳ | OUT1 (1Y) | سیم اول موتور ۱ | ۱۴ | OUT4 (4Y) | سیم دوم موتور ۲ |
| ۴ | GND | زمین و دفع گرما | ۱۳ | GND | زمین و دفع گرما |
| ۵ | GND | زمین و دفع گرما | ۱۲ | GND | زمین و دفع گرما |
| ۶ | OUT2 (2Y) | سیم دوم موتور ۱ | ۱۱ | OUT3 (3Y) | سیم اول موتور ۲ |
| ۷ | IN2 (2A) | جهت موتور ۱ | ۱۰ | IN3 (3A) | جهت موتور ۲ |
| ۸ | VCC2 | ولتاژ موتور از باتری | ۹ | EN2 (3,4EN) | فعالساز موتور ۲ |
| EN | IN1 | IN2 | موتور |
|---|---|---|---|
| HIGH (یا PWM) | HIGH | LOW | جلو |
| HIGH (یا PWM) | LOW | HIGH | عقب |
| HIGH | یکسان (هر دو LOW یا هر دو HIGH) | یکسان | ترمز |
| LOW | هر چیزی | هر چیزی | رها (Coast) |
حساب ولتاژ و گرمای L293D
L293D کلید ایدهآل نیست؛ ترانزیستورهای داخلیاش در مجموع چند ولت افت دارند (معمولاً حدود ۱.۵ تا ۲ ولت یا بیشتر با جریان بالا). پس ولتاژ میانگین موتور تقریباً این است:
Vموتور ≈ D × (Vباتری − Vافت)
مثال: باتری ۹ ولت، افت حدود ۱.۵ ولت و analogWrite(EN, 180): D = ۱۸۰ ÷ ۲۵۵ ≈ ۷۱٪ و V ≈ ۰.۷۱ × ۷.۵ ≈ ۵.۳ ولت. گرمای آیسی هم تقریباً افت ضرب در جریان است: با ۲ ولت افت و ۴۰۰ میلیآمپر، ۲ × ۰.۴ = ۰.۸ وات. برای همین چهار پایهی GND وسط آیسی به مس برد لحیم میشوند تا گرما را پخش کنند. اگر جریان قفل موتورت از ۶۰۰ میلیآمپر بیشتر است، درایور قویتری لازم داری.
کد L293D آردوینو: جلو، عقب، ترمز و سرعت
راهاندازی L293D با آردوینو فقط سه پین میخواهد. سیمکشی برای یک موتور (همان پینهای نمونهی آمادهی شبیهساز):
| پایهی L293D | وصل به |
|---|---|
| ۱ (EN1) | پین ۹ آردوینو (PWM) |
| ۲ (IN1) | پین ۴ آردوینو |
| ۷ (IN2) | پین ۵ آردوینو |
| ۳ (OUT1) | پایهی + موتور |
| ۶ (OUT2) | پایهی − موتور |
| ۱۶ (VCC1) | 5V آردوینو |
| ۸ (VCC2) | + باتری موتور (۶ تا ۹ ولت) |
| ۴، ۵، ۱۲، ۱۳ (GND) | GND آردوینو و − باتری (زمین مشترک) |
// مدار پل H با L293D — جلو، عقب، ترمز، رها و سرعت
const int EN = 9; // L293D پایهی 1 (EN1) — PWM
const int IN1 = 4; // L293D پایهی 2
const int IN2 = 5; // L293D پایهی 7
void forward(int speed) {
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
analogWrite(EN, speed); // 0 تا 255
}
void backward(int speed) {
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
analogWrite(EN, speed);
}
void brake() {
digitalWrite(IN1, LOW); // هر دو سر موتور به GND
digitalWrite(IN2, LOW);
digitalWrite(EN, HIGH); // کانال روشن، پس ترمز فعال است
}
void coast() {
digitalWrite(EN, LOW); // خروجیها رها؛ موتور آزاد میچرخد تا بایستد
}
void rampForward(int target) {
for (int s = 0; s <= target; s += 5) { // شروع نرم
forward(s);
delay(20);
}
}
void setup() {
pinMode(EN, OUTPUT);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
Serial.begin(9600);
coast();
}
void loop() {
Serial.println("forward, soft start");
rampForward(200);
delay(2000);
Serial.println("brake");
brake();
delay(500); // قبل از عوض کردن جهت، اول بایست
Serial.println("backward, half speed");
backward(128);
delay(2000);
Serial.println("coast");
coast();
delay(1500);
}
چند نکته:
- توابع کوچک (
forward،backward،brake،coast) کد ربات را خوانا میکنند؛ در ماشین رباتیک همینها را برای دو موتور تکرار میکنی (آموزش تابع در آردوینو). - اول بایست، بعد برگرد. عوض کردن ناگهانی جهت در سرعت کامل، جریان لحظهای را تقریباً دو برابر جریان قفل میکند، به گیربکس فشار میآورد و ممکن است آردوینو را با افت ولتاژ ریست کند.
- شروع نرم (Soft Start) با بالا بردن تدریجی PWM همین فشار را موقع راه افتادن کم میکند.
- برای موتور دوم از پایههای ۹ (EN2)، ۱۰ (IN3)، ۱۵ (IN4) و خروجیهای ۱۱ و ۱۴ استفاده کن؛ مثلاً EN2 روی پین ۱۰ و IN3 و IN4 روی پینهای ۶ و ۷ آردوینو، مثل ماشین رباتیک (Robot car).
ساختن در شبیهساز تینکرکد فارسی
سه مسیر داری، از ساده به پیشرفته:
- پل H دستی (بدون کد، از حدود ۷ سالگی): نمونهی جهت با کلید (Direction by switch) را باز کن و دستهی DPDT را جابهجا کن. بعد خودت نسخهی چهار کلید راکر را از روی شکل بالا بساز و حالت اتصال کوتاه را امتحان کن.
- L293D بدون کد: در مود ساده، L293D یک کانال سادهشده با پایههای V+، GND، EN، IN1، IN2، O1 و O2 دارد. پک ۴ قلمی را به V+ و GND بده، EN را به + وصل کن، موتور را بین O1 و O2 ببند و دو کلید کشویی بگذار که هر کدام پایهی وسطشان (M) را به IN1 یا IN2 بدهد و دو پایهی کناریشان به + و − باتری باشد. IN1 روی + و IN2 روی − یعنی جلو، برعکسش عقب و هر دو یکسان یعنی ایست. سیم EN را به − بزن و ببین موتور در هر حالتی میایستد. این همان جدول درستی L293D است، بدون یک خط کد.
- با آردوینو (از حدود ۱۰ سالگی): نمونهی پل اچ (H-bridge) همین سیمکشی (پینهای ۴، ۵ و ۹) و یک کد جلو/عقب را آماده دارد؛ کد این مقاله را جایش بچسبان. درس موتور جلو و عقب هم قدمبهقدم L293D را توضیح میدهد و بعدش درس ماشین رباتیک دو موتور را با هم میچرخاند.
انواع مدار پل H و درایور موتور (فارسی / انگلیسی)
| # | اسم فارسی | English | جریان تقریبی | نکته |
|---|---|---|---|---|
| ۱ | کلید معکوسکنندهی DPDT | DPDT Reversing Switch | به اندازهی کلید | دستی، بدون PWM |
| ۲ | پل H با رله | Relay H-Bridge | زیاد | کند، کنتاکت فرسوده میشود |
| ۳ | پل H ترانزیستوری | Discrete BJT H-Bridge | به ترانزیستورها بستگی دارد | آموزشی؛ مراقب Shoot-Through |
| ۴ | پل H ماسفتی | MOSFET H-Bridge | زیاد | بازده بالا، طراحی دقیق |
| ۵ | نیمپل | Half-Bridge | — | نصف پل H؛ دو تایش یک پل کامل |
| ۶ | درایور L293D | L293D Dual H-Bridge | ۰.۶ آمپر در هر کانال | دیود داخلی، مناسب بردبورد |
| ۷ | درایور L298N | L298N Dual H-Bridge | حدود ۲ آمپر | افت ولتاژ و گرمای زیاد |
| ۸ | درایور TB6612FNG | TB6612FNG MOSFET Driver | حدود ۱.۲ آمپر | افت ولتاژ کم، مناسب ربات باتریخور |
| ۹ | درایور DRV8833 | DRV8833 Dual H-Bridge | حدود ۱.۵ آمپر | ولتاژ کم، کوچک |
| ۱۰ | درایور BTS7960 | BTS7960 High-Current Half-Bridge | دهها آمپر | برای موتورهای بزرگ |
یک نکتهی جالب: موتور پلهای دوقطبی مثل استپر NEMA 17 دو سیمپیچ دارد و برای هر کدام یک پل H لازم است؛ درایورهای استپر در واقع دو پل H هستند (NEMA 17 در شبیهساز جزو Plus است). ولی استپر کوچک 28BYJ-48 تکقطبی است و با درایور ULN2003 کار میکند که پل H نیست.
اشتباههای رایج
- وصل نکردن VCC2 (پایهی ۸): منطق روشن است ولی موتور برق ندارد و نمیچرخد.
- تغذیهی موتور از 5V آردوینو: افت ولتاژ موقع راه افتادن موتور آردوینو را ریست میکند؛ موتور باتری جدا میخواهد (مدار تغذیه ۵ ولت (5V Power Supply)).
- GND مشترک فراموششده: بدون آن، L293D سیگنالهای آردوینو را نمیفهمد.
- EN روی پین بدون PWM: سرعت فقط صفر یا کامل میشود.
- آیسی برعکس: فرورفتگی را ببین؛ L293D برعکس داغ میکند و میسوزد.
- L293 بهجای L293D: نسخهی بدون D دیود داخلی ندارد و چهار دیود بیرونی میخواهد.
- باتری ضعیف برای موتور: باتری کتابی ۹ ولت مقاومت داخلی زیادی دارد و زیر بار موتور ولتاژش فرو میریزد؛ پک قلمی یا باتری لیتیومی بهتر است (مدار باتری ضعیف و موتور (A weak battery and a motor)).
نکتههای ایمنی
- در پل H دستی، هیچوقت دو کلید یک ستون را با هم نبند؛ با باتری واقعی سیمها و کلیدها داغ میشوند.
- L293D زیر بار داغ میشود؛ قبل از دست زدن صبر کن.
- چرخ ربات را موقع آزمایش روی میز از زمین بلند کن تا ربات از لبهی میز نیفتد.
- با باتری لیتیومی (LiPo) هیچوقت اتصال کوتاه نساز و آن را بدون شارژر مخصوص شارژ نکن.
کاربرد واقعی همهی اینها را در ربات مسیریاب (Line Follower) و ربات مانعگریز (Obstacle Avoider) میبینی؛ هر دو با یک L293D و دو موتور ساخته میشوند. ماشین رباتیک با پل H یکی از بهترین موضوعهای پروژه مدرسه با آردوینو هم هست.
سؤالهای رایج
مدار پل H چیست؟
مداری با چهار کلید (رله، ترانزیستور یا ماسفت) که دور موتور مثل حرف H چیده شدهاند. با بستن دو کلید قطری، جریان از یک طرف از موتور رد میشود و با دو کلید قطری دیگر از طرف مخالف؛ پس بدون جابهجا کردن سیم، جهت چرخش موتور DC عوض میشود.
چرا نباید دو کلید یک طرف پل H همزمان بسته شوند؟
چون مثبت و منفی باتری از راه همان دو کلید مستقیم به هم وصل میشوند؛ به این حالت Shoot-Through میگویند. جریان خیلی زیادی جاری میشود، ترانزیستورها میسوزند و باتری داغ میشود. آیسیهای آماده مثل L293D جلوی این حالت را میگیرند.
فرق ترمز و رها کردن موتور در L293D چیست؟
اگر پایهی EN روشن باشد و IN1 و IN2 هر دو یکسان باشند، دو سر موتور به یک ولتاژ وصل میشوند و موتور سریع میایستد؛ این ترمز است. اگر EN خاموش شود، خروجیها رها میشوند و موتور با اینرسی خودش آرام میایستد؛ این حالت رها یا Coast است.
L293D بهتر است یا L298N؟
L293D برای موتورهای کوچک تا حدود ۶۰۰ میلیآمپر در هر کانال مناسب است، روی بردبورد جا میشود و دیود محافظ داخلی دارد. L298N تا حدود ۲ آمپر در هر کانال میدهد ولی گرمای بیشتری دارد و افت ولتاژش زیاد است. برای رباتهای باتریخور، درایورهای ماسفتی مثل TB6612FNG افت ولتاژ کمتری دارند.
آیا با رله هم میشود جهت موتور را عوض کرد؟
بله. یک رلهی DPDT یا دو رلهی SPDT با همان سیمکشی ضربدری کلید DPDT، یک پل H مکانیکی میسازند. این روش برای موتورهای پرجریان ساده است، ولی سرعت را با PWM نمیشود از راه رله کنترل کرد و کنتاکتها هم با زمان فرسوده میشوند.