آموزش آردوینوپروژه های آردوینو

کنترل چند سروو موتور با PCA9685 و برد آردوینو

گاهی ممکن است در یک پروژه بخواهید چندین سروو موتور را به آردوینو خود متصل کنید. با این حال، اتصال مستقیم چند سروو به آردوینو محدودیت‌هایی دارد. اول اینکه خیلی سریع پین‌های PWM در دسترس آردوینو تمام می‌شوند، مخصوصاً اگر پروژه شما شامل قطعات دیگری هم باشد که به کنترل PWM نیاز دارند. دوم اینکه تولید سیگنال‌های PWM دقیق برای سرووها می‌تواند بخشی از توان پردازشی آردوینو را درگیر کند.

یک راه‌حل بهتر استفاده از یک برد درایور سروو جداگانه مانند ماژول PCA9685 است. این ماژول به شما اجازه می‌دهد تنها با استفاده از دو پین آردوینو، تا 16 سروو موتور را کنترل کنید. جالب‌تر اینکه می‌توانید تا 62 عدد از این ماژول‌ها را به صورت زنجیره‌ای (Daisy Chain) به هم متصل کنید و در مجموع تا 992 سروو موتور را فقط با همان دو پین کنترل نمایید! و مهم‌تر از همه، تراشه PCA9685 وظیفه تولید سیگنال‌های PWM را بر عهده می‌گیرد، بنابراین توان پردازشی آردوینو برای انجام سایر وظایف مهم پروژه آزاد می‌شود.

عالی نیست؟ بیایید یاد بگیریم چگونه ماژول PCA9685 را به آردوینو متصل کرده و از آن استفاده کنیم.

معرفی ماژول PCA9685

ماژول PCA9685 یک برد توسعه (Breakout Board) محبوب است که عمدتاً برای راه‌اندازی چندین سروو موتور طراحی شده است. در ادامه، نگاهی دقیق‌تر به اجزای مختلف آن می‌اندازیم:

تراشه PCA9685

در قلب این ماژول، تراشه PCA9685 قرار دارد — یک درایور LED و سروو موتور 16 کاناله با دقت 12 بیت و کنترل‌شده از طریق پروتکل I2C که توسط شرکت NXP Semiconductors توسعه یافته است.

تراشه PCA9685

این تراشه مسئول تولید سیگنال‌های PWM برای کنترل تجهیزات متصل‌شده (در اینجا سروو موتورها) است. این آی‌سی دارای 16 کانال PWM مستقل است، به این معنا که می‌توانید به صورت هم‌زمان تا 16 سروو موتور را کنترل کنید. فرکانس و سیکل کاری (Duty Cycle) هر کانال به صورت جداگانه قابل تنظیم است و بازه فرکانسی آن تقریباً از 24 هرتز تا حدود 1526 هرتز را پوشش می‌دهد.

نکته جذاب‌تر اینکه می‌توانید تا 62 عدد از این ماژول‌ها را به صورت زنجیره‌ای متصل کنید و در مجموع تا 992 سروو موتور را کنترل نمایید.

این تراشه از طریق پروتکل I2C و تنها با استفاده از دو پین SDA و SCL با یک میکروکنترلر (مانند Arduino) ارتباط برقرار می‌کند. کافی است یک دستور ساده I2C ارسال کنید تا سروو در موقعیت دلخواه قرار گیرد؛ سپس PCA9685 تمامی به‌روزرسانی‌های لازم برای حفظ آن موقعیت را مدیریت می‌کند. این موضوع باعث کاهش قابل توجه بار پردازشی میکروکنترلر شده و امکان تمرکز آن بر سایر وظایف مهم پروژه را فراهم می‌کند.

علاوه بر این، PCA9685 دارای اسیلاتور داخلی است، بنابراین برای تولید سیگنال‌های PWM به منبع کلاک خارجی نیاز ندارد.

برای اطلاعات بیشتر درباره PCA9685، به دیتاشیت آن مراجعه کنید.

جامپرهای انتخاب آدرس I2C

جامپرهای انتخاب آدرس I2C

ماژول PCA9685 دارای جامپرهای انتخاب آدرس I2C در گوشه بالا سمت راست است. این جامپرها برای اختصاص دادن یک آدرس I2C منحصربه‌فرد به هر ماژول PCA9685 زمانی که چند ماژول را به یک باس I2C مشترک متصل می‌کنید ضروری هستند. این کار از تداخل آدرس‌ها جلوگیری کرده و ارتباط صحیح را تضمین می‌کند.

به‌صورت پیش‌فرض، یک ماژول PCA9685 بدون اتصال هیچ جامپری دارای آدرس پایه 0x40 است. آدرس باینری‌ای که با استفاده از جامپرها تنظیم می‌کنید به این آدرس پایه اضافه می‌شود. برای مثال، اگر پد لحیم A0 را اتصال کوتاه کنید، آدرس به 0x41 تغییر می‌کند. اگر به جای آن A1 را اتصال دهید، آدرس برابر با 0x42 خواهد شد. اتصال هم‌زمان A0 و A1 باعث می‌شود آدرس به 0x43 تغییر کند. این ساختار به شما اجازه می‌دهد آدرس‌های منحصربه‌فرد مورد نیاز برای کنترل هم‌زمان چندین ماژول PCA9685 را به‌راحتی پیکربندی کنید.

اتصالات سروو موتور

این ماژول دارای 16 مجموعه کانکتور سه‌ پین است که برای اتصال آسان سروو موتورهای شما طراحی شده‌اند. هر مجموعه شامل یک پین زمین (GND)، یک پین تغذیه (V+) و یک پین خروجی PWM است که هر کدام متناظر با یکی از 16 کانال موجود روی ماژول هستند.

اگر در مورد این مطلب سوالی دارید در قسمت نظرات بپرسید

در حالی که هر کانال PWM به‌صورت مستقل عمل می‌کند، توجه داشته باشید که هر 16 کانال باید روی یک فرکانس PWM مشترک تنظیم شوند.

اتصالات سروو موتور

نشانگر LED

روی ماژول یک LED نشانگر وجود دارد که روشن بودن و تأمین تغذیه ماژول را نمایش می‌دهد.

خازن الکترولیتی بزرگ

موتورها معمولاً جریان‌های لحظه‌ای بالاتری می‌کشند که می‌تواند باعث نوسان در منبع تغذیه شود. به همین دلیل ماژول PCA9685 به یک خازن الکترولیتی بزرگ مجهز شده است.

این خازن به‌عنوان فیلتر و تثبیت‌کننده منبع تغذیه عمل می‌کند و نوسانات و پیک‌های ولتاژ را هموار می‌سازد. در نتیجه، هم تراشه PCA9685 و هم تجهیزات متصل‌شده، به‌ویژه موتورها، عملکردی پایدار و بدون مشکل خواهند داشت.

ترمینال پیچی 2 پین برای تغذیه

این ماژول دارای یک ترمینال پیچی دو پین برای اتصال منبع تغذیه خارجی است.

این ورودی تغذیه ضروری است زیرا راه‌اندازی چندین سروو به جریانی بیشتر از توان تأمین یک میکروکنترلر نیاز دارد. با استفاده از ورودی تغذیه اختصاصی روی ماژول، اطمینان حاصل می‌کنید که سرووها توان کافی برای عملکرد پایدار و قابل اعتماد دارند.

پین های ماژول PCA9685

بیایید نگاهی به پین‌آوت این ماژول بیندازیم:

پین های ماژول PCA9685

  • ورودی تغذیه موتور (ترمینال پیچی 2 پین): در این قسمت منبع تغذیه خارجی برای راه‌اندازی سروو موتورها متصل می‌شود. توضیح پین‌ها به شرح زیر است:
  • GND: اتصال زمین مشترک است.
  • V+: تغذیه توزیع‌شده برای سرووها را فراهم می‌کند. توصیه می‌شود ولتاژ 5 تا 6 ولت DC به این پین اعمال شود.
  • اتصالات منطقی (هدر 1×6): این هدر محل اتصال ماژول PCA9685 به میکروکنترلر (MCU) شماست. سیگنال‌های کنترلی با منطق 3.3V و 5V سازگار هستند.
  • GND: به پین زمین میکروکنترلر متصل می‌شود.
  • OE (Output Enable): برای غیرفعال کردن سریع تمامی خروجی‌ها استفاده می‌شود. وقتی این پین در وضعیت LOW باشد، همه خروجی‌ها فعال هستند. اگر آن را HIGH کنید، خروجی‌ها غیرفعال می‌شوند. از آنجا که ماژول دارای مقاومت Pull-down داخلی است، خروجی‌ها به‌صورت پیش‌فرض فعال هستند.
  • SCL: پین کلاک I2C است و به خط کلاک I2C میکروکنترلر متصل می‌شود. از منطق 3V یا 5V پشتیبانی می‌کند و دارای Pull-up ضعیف به VCC است.
  • SDA: پین داده I2C است و به خط داده I2C میکروکنترلر متصل می‌شود. از منطق 3V یا 5V پشتیبانی می‌کند و دارای Pull-up ضعیف به VCC است.
  • VCC: پین تغذیه منطقی است و معمولاً ولتاژی بین 3.3V تا 5V را می‌پذیرد. اطمینان حاصل کنید که با سطح منطقی میکروکنترلر شما مطابقت داشته باشد.
  • V+: تغذیه توزیع‌شده برای سرووها را فراهم می‌کند. توصیه می‌شود 5 تا 6 ولت DC به این پین اعمال شود.

هرچند می‌توانید مستقیماً منبع تغذیه را به این پین متصل کنید، اما استفاده از ترمینال پیچی 2 پین ترجیح داده می‌شود. پین‌های V+ برای زنجیره‌کردن چندین ماژول PCA9685 و تغذیه همه سرووها از یک منبع مشترک بسیار کاربردی هستند.

هدر 1×6 بدون پین در سمت مقابل ماژول برای زنجیره‌ای (Daisy Chain) کردن چندین ماژول PCA9685 طراحی شده است. هر دو هدر اتصالات یکسانی دارند، بنابراین می‌توانید در صورت نیاز پین‌هایی به این سمت اضافه کرده و از آن به‌عنوان ورودی استفاده کنید تا با طراحی پروژه شما هماهنگ‌تر باشد.

اتصالات سروو (16 هدر رنگی 1×3)

هدرهای خروجی با رنگ‌بندی استاندارد کابل‌های سروو موتور هماهنگ هستند تا اتصال آسان‌تری داشته باشید. این خروجی‌ها روی برد از 0 تا 15 شماره‌گذاری شده‌اند و هر کانکتور شامل پین‌های زیر است:

  • PWM به پین سیگنال PWM سروو موتور متصل می‌شود.
  • V+ به پین تغذیه سروو موتور متصل می‌شود.
  • GND به پین زمین سروو موتور متصل می‌شود.

اتصال سروو موتور به PCA9685 و آردوینو

ابتدا سروو موتورها را به ماژول PCA9685 متصل می‌کنیم.

هر سروو موتور دارای سه سیم است: قهوه‌ای یا مشکی برای زمین (GND)، قرمز برای تغذیه (معمولاً 5V) و نارنجی، زرد یا سفید برای سیگنال (PWM). کانکتور سروو را به هدر سه‌پین روی ماژول PCA9685 متصل کنید. دقت کنید سیم زمین در ردیف پایین و سیم سیگنال در ردیف بالا قرار گیرد تا اتصال صحیح برقرار شود.

برای اتصال ماژول PCA9685 به آردوینو، از پین‌های I2C استفاده می‌کنید. پین SDA ماژول را به پین SDA آردوینو (A4) و پین SCL را به پین SCL آردوینو (A5) متصل کنید. سپس پین GND ماژول را به GND آردوینو و پین VCC را به 5V آردوینو وصل نمایید.

اکثر سرووها برای کار با ولتاژ حدود 5 تا 6 ولت طراحی شده‌اند. توجه داشته باشید که راه‌اندازی هم‌زمان چند سروو می‌تواند باعث مصرف جریان قابل توجهی شود. حتی سرووهای کوچک هنگام حرکت چند صد میلی‌آمپر جریان می‌کشند و سرووهای گشتاور بالا تحت بار می‌توانند بیش از 1 آمپر جریان نیاز داشته باشند. استفاده از پین 5V آردوینو برای تغذیه سرووها توصیه نمی‌شود. نویز الکتریکی و افت ولتاژ (Brownout) ناشی از مصرف جریان زیاد می‌تواند باعث رفتار ناپایدار، ریست شدن یا حتی داغ شدن بیش از حد آردوینو شود.

بنابراین به‌شدت توصیه می‌شود از یک منبع تغذیه جداگانه برای سرووها استفاده کنید. این منبع تغذیه را به ترمینال پیچی دو پین روی ماژول PCA9685 متصل نمایید.

تصویر زیر نحوه سیم‌کشی مدار را نشان می‌دهد.

اتصال سروو موتور به PCA9685 و آردوینو

زنجیره کردن ماژول‌های PCA9685

اگر پروژه شما به کنترل بیش از 16 سروو موتور نیاز دارد، می‌توانید چندین ماژول PCA9685 را به‌صورت Daisy Chain به هم متصل کنید. تا 62 برد را می‌توان به یکدیگر متصل کرد و در مجموع 992 سروو موتور را کنترل نمود.

اتصال زنجیره ای سروو موتور ها به PCA9685 و آردوینو

اتصال آن‌ها ساده است، زیرا هر برد در دو سمت خود هدر دارد. کافی است از یک کابل 6 پین موازی برای اتصال یک برد به برد بعدی استفاده کنید. با این حال، بسیار مهم است که جامپرهای آدرس هر ماژول را روی یک آدرس منحصربه‌فرد تنظیم کنید. این کار از تداخل روی باس I2C جلوگیری کرده و امکان آدرس‌دهی و کنترل مستقل هر ماژول را فراهم می‌کند.

کد آردوینو برای درایور سروو موتور

برای ارتباط با PCA9685 در آردوینو به یک کتابخانه نیاز دارید. کتابخانه PCA9685 ارائه‌شده توسط NachtRaveVL یکی از گزینه‌های محبوب است.

برای نصب کتابخانه:

ابتدا نرم‌افزار Arduino IDE را باز کنید. سپس روی آیکون Library Manager در نوار کناری سمت چپ کلیک کنید.
در کادر جستجو عبارت “PCA9685” را وارد کنید تا نتایج فیلتر شوند.

کتابخانه PCA9685 16-channel PWM Driver Module Library by NachtRaveVL را پیدا کنید.

روی دکمه Install کلیک کنید تا به Arduino IDE شما اضافه شود.

در ادامه یک اسکچ ساده آورده شده است که دو سروو متصل به کانال‌های 0 و 1 ماژول PCA9685 را در بازه 180 درجه به‌صورت رفت و برگشتی حرکت می‌دهد.

کد کامل در فایل دانلودی انتهای صفحه قرار داده شده است.

توضیح کد

کد با اضافه کردن دو کتابخانه ضروری آغاز می‌شود:

  • کتابخانه Wire.h امکان ارتباط I2C را فراهم می‌کند؛ همان پروتکلی که آردوینو از طریق آن با ماژول PCA9685 ارتباط برقرار می‌کند.
  • کتابخانه PCA9685.h یک کتابخانه اختصاصی است که دستورات موردنیاز برای کنترل PCA9685 را ساده‌سازی می‌کند و کار با این درایور سروو را بسیار راحت‌تر می‌سازد.
#include <Wire.h>
#include "PCA9685.h"

سپس یک نمونه (Instance) از کلاس PCA9685 با نام driver ایجاد می‌شود تا ارتباط با سخت‌افزار PCA9685 مدیریت شود.

PCA9685 driver;

به همین صورت، یک نمونه از کلاس PCA9685_ServoEval با نام pwmServo و با پارامترهای 112 و 500 مقداردهی اولیه می‌شود. این پارامترها محدوده پالس PWM متناظر با موقعیت‌های -90 درجه و +90 درجه سروو را مشخص می‌کنند. این مقادیر بر اساس یک سیکل 20 میلی‌ثانیه‌ای (سیگنال 50Hz) که در کنترل سرووها رایج است محاسبه شده‌اند؛ جایی که پالس 0.5ms (حدود 112 استپ) و 2.5ms (حدود 500 استپ) نشان‌دهنده موقعیت‌های انتهایی سروو هستند.

// PCA9685 outputs = 12-bit = 4096 steps
// 2.5% of 20ms = 0.5ms ; 12.5% of 20ms = 2.5ms
// 2.5% of 4096 = 102 steps; 12.5% of 4096 = 512 steps
// we will use 112 and 500 to avoid pushing the servo to its physical limits
PCA9685_ServoEval pwmServo(112, 500); // (-90deg, +90deg)

تابع setup() برای آماده‌سازی اولیه سیستم اجرا می‌شود. ابتدا ارتباط I2C فعال می‌شود، سپس یک ریست نرم‌افزاری برای تمامی ماژول‌های PCA9685 متصل به باس انجام می‌گیرد. بعد از آن، شیء driver مقداردهی اولیه شده و در نهایت فرکانس PWM برای همه کانال‌ها روی 50Hz تنظیم می‌شود؛ فرکانسی استاندارد برای کنترل دقیق سروو موتور.

void setup() {
  Wire.begin();                 // Wire must be started first
  driver.resetDevices();        // Software resets all PCA9685 devices on Wire line
  driver.init();
  driver.setPWMFrequency(50);   // Set frequency to 50Hz
}

تابع loop() بخش اجرایی اصلی برنامه است. در این قسمت، مقادیر PWM کانال‌های 0 و 1 به‌صورت متوالی تنظیم می‌شوند تا سرووها در یک الگوی مشخص حرکت کنند: ابتدا به زاویه -90 درجه (چپ‌ترین موقعیت)، سپس با یک توقف 1 ثانیه‌ای، بعد به 0 درجه (مرکز)، مکث مجدد، و در نهایت به 90 درجه (راست‌ترین موقعیت). این چرخه به‌صورت نامحدود تکرار می‌شود و باعث حرکت رفت‌وبرگشتی سرووها در بازه 180 درجه می‌گردد.

void loop() {
  driver.setChannelPWM(0, pwmServo.pwmForAngle(-90));
  driver.setChannelPWM(1, pwmServo.pwmForAngle(-90));
  delay(1000);
  driver.setChannelPWM(0, pwmServo.pwmForAngle(0));
  driver.setChannelPWM(1, pwmServo.pwmForAngle(0));
  delay(1000);
  driver.setChannelPWM(0, pwmServo.pwmForAngle(90));
  driver.setChannelPWM(1, pwmServo.pwmForAngle(90));
  delay(1000);
}

موارد موجود در فایل : سورس کامل

5 (2 نفر)

برای دریافت مطالب جدید کانال تلگرام یا پیج اینستاگرام ما را دنبال کنید.

محمد رحیمی

محمد رحیمی هستم. سعی میکنم در آیرنکس مطالب مفید قرار بدهم. سوالات مربوط به این مطلب را در قسمت نظرات همین مطلب اعلام کنید. سعی میکنم در اسرع وقت به نظرات شما پاسخ بدهم.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *