کنترل موتور DC با درایور TB6612FNG و برد آردوینو

پس داری برنامهریزی میکنی تا ربات دوچرخ خودت رو بسازی؟ عالیه! یکی از مهمترین مراحل زنده کردن ربات، انتخاب درایور موتور مناسب است.
اگر کمی جستجو کرده باشی، احتمالاً با درایورهای کلاسیکی مثل L293D یا L298N برخورد کردهای. این درایورها بیش از دو دهه است که وجود دارند و هنوز هم بهطور گسترده استفاده میشوند—به دلایل خوبی. استفاده از آنها ساده است، قابل اعتماد هستند و قیمت بسیار مناسبی دارند، که باعث شده بهویژه در مدارس، پروژههای سرگرمی و کیتهای الکترونیکی مبتدی محبوب باشند.
اما موضوع این است: هر دو درایور L293D و L298N از مدارهای H-Bridge مبتنی بر BJT استفاده میکنند که کارایی انرژی بالایی ندارند. آنها توان را به صورت حرارت هدر میدهند، نیاز به ولتاژهای بالاتری دارند و برای پروژههای باتریدار ایدهآل نیستند.
اینجاست که درایور موتور TB6612FNG وارد میشود. این یک درایور مدرن مبتنی بر MOSFET است که چندین مزیت ارائه میدهد. کارایی بالاتری دارد، بنابراین خنکتر کار میکند و توان کمتری هدر میدهد. در ولتاژهای پایینتر کار میکند که برای بردهای منطقی 3.3V و 5V ایدهآل است. همچنین ابعاد کوچکتری دارد، که آن را برای فضاهای محدود در رباتها، پهپادها و دیگر پروژههای جمعوجور مناسب میکند.
در این آموزش، هر آنچه برای اتصال درایور موتور TB6612FNG به آردوینو، کنترل سرعت و جهت دو موتور DC و راهاندازی سریع ربات خود نیاز دارید، خواهید آموخت.
درک مبانی کنترل موتور
قبل از یادگیری درباره درایور موتور TB6612FNG، مهم است که با دو مفهوم کلیدی آشنا شوید:
- مدار H-Bridge – به ما امکان میدهد جهت چرخش موتور را کنترل کنیم
- PWM (مدولاسیون عرض پالس) – به کنترل سرعت موتور DC کمک میکند
کنترل جهت با H-Bridge
موتورهای DC آسانترین موتور برای استفاده هستند! اگر یک باتری به موتور DC وصل کنید، موتور در یک جهت میچرخد. اگر سیمها را عوض کنید، در جهت دیگر میچرخد. اما همیشه نمیتوان سیمها را به صورت فیزیکی عوض کرد. اینجاست که پل H مفید است!
H-Bridge یک مدار ویژه با چهار سوئیچ الکترونیکی است که به شکل “H” چیده شدهاند و موتور در وسط آن قرار دارد.
با روشن و خاموش کردن این سوئیچها به ترتیب خاص، میتوانید جریان برق را در موتور در یک جهت یا جهت مخالف هدایت کنید. این ترفند هوشمندانه به شما امکان میدهد جهت چرخش موتور را بدون نیاز به تغییر فیزیکی سیمها کنترل کنید.
تصویر زیر نشان میدهد که H-Bridge چگونه کار میکند.

کنترل سرعت با PWM (مدولاسیون عرض پالس)
وقتی ولتاژ ثابت به یک موتور DC داده میشود، موتور با سرعت ثابت میچرخد. اگر بخواهید سرعت را تغییر دهید، باید ولتاژ را تنظیم کنید. ولتاژ بالاتر باعث چرخش سریعتر موتور و ولتاژ پایینتر باعث کندتر شدن آن میشود.
با این حال، تغییر فیزیکی ولتاژ به طور مداوم چندان عملی نیست. اینجاست که PWM، یا مدولاسیون عرض پالس، وارد میشود.
PWM روشی هوشمند برای کنترل میزان متوسط توان ارسال شده به موتور است. به جای ارسال ولتاژ ثابت، PWM به سرعت ولتاژ را با پالسهای کوتاه روشن و خاموش میکند.
“عرض” هر پالس روشن، که به آن چرخه وظیفه (duty cycle) نیز گفته میشود، تعیین میکند که ولتاژ در هر چرخه چه مدت روشن باشد.
- اگر ولتاژ بیشتر زمان روشن باشد (پالس پهنتر)، موتور ولتاژ متوسط بالاتری دریافت میکند و سریعتر میچرخد.
- اگر ولتاژ بیشتر زمان خاموش باشد (پالس باریکتر)، موتور ولتاژ متوسط کمتری دریافت میکند و کندتر میچرخد.
تصویر زیر نشان میدهد که چگونه چرخههای وظیفه مختلف سرعت موتور را تحت تأثیر قرار میدهند.

معرفی درایور موتور TB6612FNG
درایور TB6612FNG عمدتاً برای راهاندازی بارهای القایی مانند موتورهای DC، موتورهای پلهای، رلهها و سلونوئیدها طراحی شده است.
این درایور بهعنوان یک تقویتکننده جریان عمل میکند، به این معنی که سیگنالهای کنترلی کمجریان از میکروکنترلر (مثل آردوینو) را دریافت کرده و آنها را به جریان و ولتاژ بالاتری تبدیل میکند که موتور برای عملکرد نیاز دارد.

در هسته خود، TB6612FNG دارای دو مدار H-Bridge جداگانه است. بنابراین، میتواند همزمان دو موتور DC مختلف را کنترل کند. حتی میتوان این دو H-Bridge را با هم ترکیب کرد تا یک موتور پلهای دو قطبی را کنترل کرد.
قدرت و توان
TB6612FNG از نظر تغذیه بسیار منعطف است. این درایور میتواند با طیف وسیعی از ولتاژها کار کند، از 4.5V تا 13.5V، و میتواند جریان مستمر تا 1.2A و جریان پیک تا 3.2A در هر کانال ارائه دهد، که بدین معنی است میتواند از موتورهای کوچک سرگرمی تا موتورهای بزرگتر و پرقدرت را پشتیبانی کند.
دیودهای بازگشتی داخلی
یکی از مهمترین ویژگیهای ایمنی TB6612FNG، دیودهای بازگشتی داخلی آن (که به آنها دیودهای freewheeling یا kickback نیز گفته میشود) است. این دیودها در هنگام کار با بارهای القایی مانند موتورها بسیار حیاتی هستند.
زمانی که موتور ناگهان خاموش شود، میدان مغناطیسی آن فرو میریزد و ممکن است یک پالس ولتاژ به مدار بازگردد. این ولتاژ برگشتی (که به آن back EMF یا نیروی محرکه الکتریکی گفته میشود) میتواند به میکروکنترلر یا سایر قطعات حساس آسیب برساند.
دیودهای بازگشتی در TB6612FNG مسیر امنی برای جریان برگشتی فراهم میکنند و هم IC و هم بقیه مدار شما را محافظت میکنند.
حفاظت حرارتی
TB6612FNG دارای حفاظت حرارتی داخلی نیز هست. این بدان معناست که اگر چیپ بیش از حد داغ شود — ممکن است به دلیل کشیدن جریان زیاد توسط موتور یا خنک نشدن مناسب چیپ باشد — TB6612FNG بهطور خودکار خروجیها را موقتاً خاموش میکند تا از آسیب جلوگیری شود. پس از کاهش دمای چیپ به حد ایمن، عملکرد بهطور خودکار از سر گرفته میشود.
مشخصات فنی
- ولتاژ خروجی موتور: 4.5V – 13.5V
- ولتاژ ورودی منطق: 2.7V – 5.5V
- جریان مستمر هر کانال: 1.2A
- جریان پیک هر کانال: 3.2A
- حداکثر فرکانس PWM: 100kHz
- حداکثر توان تلفشده: 0.78W
پین های ماژول TB6612FNG
ماژول TB6612FNG در مجموع 16 پین دارد.

بیایید هر گروه از پینها را بررسی کنیم تا بفهمیم چه کاری انجام میدهند و چگونه باید بهدرستی از آنها استفاده کرد.
پینهای تغذیه
در این ماژول دو پین ورودی تغذیه وجود دارد: VM و VCC.

- VM ورودی اصلی تغذیه برای موتور است. میتوانید ولتاژ بین 4.5V تا 13.5V بسته به موتور مورد استفاده وصل کنید.
- VCC ورودی تغذیه برای مدار داخلی منطق چیپ است. محدوده ولتاژ قابل قبول برای این پین بین 2.7V تا 5.5V است، بنابراین با میکروکنترلرهای 3.3V و 5V سازگار است. مطمئن شوید ولتاژی که به این پین میدهید با سطح منطق میکروکنترلر شما مطابقت دارد. بهعنوان مثال، اگر از آردوینو استفاده میکنید که معمولاً با منطق 5V کار میکند، باید VCC را به منبع 5V وصل کنید.
- GND اتصال زمین مشترک ماژول است. هم منبع تغذیه موتور و هم میکروکنترلر شما باید از طریق این پین زمین مشترک داشته باشند.
پینهای خروجی موتور
این پینها محل اتصال موتورهای DC هستند.

- پینهای A1 و A2 به موتور اول (موتور A) و پینهای B1 و B2 به موتور دوم (موتور B) متصل میشوند. میتوانید هر موتور DC که با 5 تا 13 ولت کار میکند را به این پینها وصل کنید.
پینهای کنترل جهت

این پینها جهت چرخش موتور را با روشن و خاموش کردن سوئیچهای داخلی H-Bridge کنترل میکنند:
- هر موتور دو پین کنترل جهت دارد. پینهای AIN1 و AIN2 جهت موتور A و پینهای BIN1 و BIN2 جهت موتور B را کنترل میکنند.
- با قرار دادن ترکیبهای مختلف HIGH یا LOW روی این پینها، میتوان موتور را به جلو، عقب یا توقف داد.
| Input1 | Input2 | جهت چرخش موتور |
|---|---|---|
| Low(0) | Low(0) | Break |
| High(1) | Low(0) | Forward |
| Low(0) | High(1) | Backward |
| High(1) | High(1) | Break |
پینهای کنترل سرعت
پینهای PWMA و PWMB سرعت چرخش موتورها را کنترل میکنند.

- در حالت ساده، این پینها مانند سوئیچ روشن/خاموش عمل میکنند. وقتی HIGH باشند، موتور فعال و با حداکثر سرعت میچرخد. وقتی LOW باشند، موتور کاملاً غیرفعال میشود.
- با ارسال سیگنال PWM با فرکانس حداکثر 100kHz، میتوان سرعت هر موتور را کنترل کرد. PWM با روشن و خاموش کردن سریع موتور عمل میکند و سرعت به مدت روشن بودن موتور در هر چرخه (چرخه وظیفه) بستگی دارد.
پین Standby (STBY)
این پین امکان غیرفعال کردن سریع هر دو موتور بهطور همزمان را فراهم میکند.
- بهطور پیشفرض، این پین توسط مقاومت داخلی 200K اهم به زمین کشیده شده و موتورها غیرفعال میمانند. برای فعال کردن موتورها، باید این پین را HIGH کنید، که میتوان با اتصال مستقیم به VCC یا استفاده از یک پین خروجی میکروکنترلر انجام داد.
اتصال درایور موتور TB6612FNG به آردوینو
حالا که میدانیم ماژول TB6612FNG چگونه کار میکند، میتوانیم آن را به آردوینو متصل کنیم!
ابتدا باید تغذیه موتورها را متصل کنیم. در این آزمایش، از موتورهای TT استفاده میکنیم که معمولاً در رباتهای دوچرخ متحرک به کار میروند. این موتورها معمولاً با ولتاژ 3V تا 6V بهخوبی کار میکنند، بنابراین ما یک منبع تغذیه خارجی 5V را به پین VM وصل میکنیم.
سپس باید تغذیه منطق داخلی درایور را تأمین کنیم. پین VCC روی ماژول TB6612FNG ورودی 2.7V–5.5V انتظار دارد که با خروجی 5V آردوینو مطابقت دارد. بنابراین پین 5V آردوینو را به VCC و GND را به GND متصل میکنیم.
حالا نوبت به پینهای کنترل میرسد. ماژول TB6612FNG چهار پین ورودی دارد—AIN1، AIN2، BIN1 و BIN2—که برای کنترل جهت موتورها استفاده میشوند. آنها را به پینهای دیجیتال 5، 4، 7 و 8 آردوینو وصل میکنیم.
برای کنترل سرعت موتور، ماژول TB6612FNG دارای پینهای PWM با نامهای PWMA و PWMB است. این پینها باید به پینهای PWM قابل برنامهریزی آردوینو وصل شوند—پین 3 برای PWMA و پین 9 برای PWMB.

همچنین باید پین STBY را به سطح منطق HIGH متصل کنید تا درایور موتور فعال شود. در تنظیمات ما، این پین را مستقیماً به VCC متصل میکنیم. این مرحله بسیار مهم است—اگر آن را فراموش کنید، درایور موتور در حالت standby باقی میماند و موتورها اصلاً کار نخواهند کرد.
در نهایت، موتورها را به پینهای خروجی وصل کنید. موتور A به A1 و A2 و موتور B به B1 و B2 متصل میشود. زیاد نگران نباشید که سیمهای موتور دقیقاً به کدام پین وصل شوند—اگر موتور در جهت اشتباه بچرخد، میتوانید بعداً سیمها را عوض کنید، چون اتصال “صحیح” یا “غلط” واقعی وجود ندارد.
جدول مرجع سریع برای اتصالات پینها:
| TB6612FNG Motor Driver | Arduino |
|---|---|
| VCC | 5V |
| STBY | 5V |
| GND | GND |
| PWMA | 3 |
| AIN2 | 4 |
| AIN1 | 5 |
| BIN1 | 7 |
| BIN2 | 8 |
| PWMB | 9 |
کد آردوینو پروژه
در اینجا یک اسکچ ساده آردوینو آورده شده است که نشان میدهد چگونه میتوان جهت و سرعت دو موتور DC را با استفاده از درایور TB6612FNG و آردوینو کنترل کرد. برای این اسکچ نیازی به کتابخانه خاصی نیست و فقط از توابع پایهای IDE آردوینو استفاده میکند.
این مثال راهی عالی برای کسب تجربه عملی در کنترل سرعت و جهت موتورها با TB6612FNG است. وقتی این را فهمیدید، میتوانید بهراحتی سیستمهای کنترل موتور پیچیدهتری بسازید، مانند سیستمهای استفادهشده در رباتهای ساده یا ماشینهای کنترل از راه دور.
کد کامل در فایل دانلودی انتهای صفحه قرار داده شده است، در اینجا قسمت های مختلف کد بررسی میشود.
توضیح کد
در ابتدای اسکچ، پینهای آردوینو که برای کنترل موتور A و B استفاده میشوند تعریف شدهاند.
// اتصال موتور A int pwmA = 3; int Ain1 = 5; int Ain2 = 4; // اتصال موتور B int pwmB = 9; int Bin1 = 7; int Bin2 = 8;
در تابع setup()، همه شش پین کنترل موتور بهعنوان خروجی تنظیم میشوند، زیرا سیگنالها از آردوینو به TB6612FNG ارسال میشوند. همچنین مطمئن میشویم که هر دو موتور خاموش باشند با تنظیم تمام پینهای کنترل جهت به LOW، تا موتورها ناگهان هنگام روشن شدن آردوینو نچرخند.
void setup() {
// تنظیم همه پینهای کنترل موتور به خروجی
pinMode(pwmA, OUTPUT);
pinMode(pwmB, OUTPUT);
pinMode(Ain1, OUTPUT);
pinMode(Ain2, OUTPUT);
pinMode(Bin1, OUTPUT);
pinMode(Bin2, OUTPUT);
// خاموش کردن موتورها - وضعیت اولیه
digitalWrite(Ain1, LOW);
digitalWrite(Ain2, LOW);
digitalWrite(Bin1, LOW);
digitalWrite(Bin2, LOW);
}
در تابع loop()، دو تابع سفارشی با تأخیر یک ثانیه بین آنها فراخوانی میشوند. تابع اول directionControl() و تابع دوم speedControl() است.
void loop() {
directionControl();
delay(1000);
speedControl();
delay(1000);
}
شرح توابع:
تابع directionControl() نحوه کنترل جهت هر دو موتور را نشان میدهد. ابتدا هر دو موتور با سرعت حداکثری تنظیم میشوند (PWM HIGH). سپس سیگنالهای لازم به پینهای کنترل جهت ارسال میشوند تا موتور A و B به جلو بچرخند. پس از دو ثانیه، سیگنالها تغییر میکنند و موتورها به مدت دو ثانیه در جهت مخالف میچرخند. در نهایت، موتورها با تنظیم تمام پینهای جهت به LOW متوقف میشوند.
void directionControl() {
// تنظیم موتورها با حداکثر سرعت
digitalWrite(pwmA, HIGH);
digitalWrite(pwmB, HIGH);
// روشن کردن موتور A و B
digitalWrite(Ain1, HIGH);
digitalWrite(Ain2, LOW);
digitalWrite(Bin1, HIGH);
digitalWrite(Bin2, LOW);
delay(2000);
// تغییر جهت موتورها
digitalWrite(Ain1, LOW);
digitalWrite(Ain2, HIGH);
digitalWrite(Bin1, LOW);
digitalWrite(Bin2, HIGH);
delay(2000);
// خاموش کردن موتورها
digitalWrite(Ain1, LOW);
digitalWrite(Ain2, LOW);
digitalWrite(Bin1, LOW);
digitalWrite(Bin2, LOW);
}
تابع speedControl() نشان میدهد چگونه میتوان سرعت موتورها را با PWM کنترل کرد. ابتدا پینهای جهت تنظیم میشوند تا هر دو موتور در یک جهت بچرخند. سپس سرعت موتور بهتدریج با افزایش مقدار PWM از 0 تا 255 افزایش مییابد تا اثر شتاب شبیهسازی شود. وقتی موتورها به سرعت کامل رسیدند، روند برعکس شده و مقدار PWM از 255 به 0 کاهش مییابد تا موتورها به آرامی متوقف شوند. در نهایت، تمام پینهای جهت به LOW تنظیم میشوند تا موتورها خاموش شوند.
void speedControl() {
// روشن کردن موتورها
digitalWrite(Ain1, LOW);
digitalWrite(Ain2, HIGH);
digitalWrite(Bin1, LOW);
digitalWrite(Bin2, HIGH);
// افزایش سرعت از صفر تا حداکثر
for (int i = 0; i < 256; i++) {
analogWrite(pwmA, i);
analogWrite(pwmB, i);
delay(20);
}
// کاهش سرعت از حداکثر تا صفر
for (int i = 255; i >= 0; --i) {
analogWrite(pwmA, i);
analogWrite(pwmB, i);
delay(20);
}
// خاموش کردن موتورها
digitalWrite(Ain1, LOW);
digitalWrite(Ain2, LOW);
digitalWrite(Bin1, LOW);
digitalWrite(Bin2, LOW);
}
موارد موجود در فایل : سورس کامل
برای دانلود فایل ها باید حساب کاربری داشته باشید ثبت نام / ورود







