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

کنترل یک موتور سرو 32 با استفاده از ماجیول PCA9685 و یک ESP32 V4

کنترل یک موتور سرو 32 با استفاده از ماجیول PCA9685 و یک ESP32 V4

در این آموزش، یاد خواهید گرفت که چگونه تا ۳۲ موتور سرو را با استفاده از یک کنترولر میکرو ESP32 متصل به ماجیول PCA9685 کنترل کنید. این موضوع به ویژه برای پروژه‌های که نیاز به عملکرد همزمان چندین موتور سرو دارند بدون استفاده از وای-فای مفید است. نتیجه یک راه‌اندازی کاملاً کاربردی خواهد بود که می‌توانید موقعیت هر موتور سرو را به صورت جداگانه تنظیم کنید.

PCA9685 module-0

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

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

اجزاء اصلی مورد استفاده در این پروژه میکروکنترلر ESP32 و ماجیول درایور PWM PCA9685 هستند. ESP32 به عنوان کنترل‌کننده اصلی عمل می‌کند که سیگنال‌ها را به ماجیول PCA9685 ارسال می‌کند و این ماجیول در نهایت موتورها را کنترل می‌کند. PCA9685 می‌تواند تا 16 موتور سرو را در هر ماجیول مدیریت کند، که امکان اتصال دو ماجیول برای کنترل مجموع 32 سرو را فراهم می‌آورد.

ماجیول PCA9685 با استفاده از ارتباط I2C کار می‌کند، به این معنا که دارای دو سیم اصلی برای انتقال داده است: SDA (خط داده) و SCL (خط کلاک). همچنین نیاز به منبع تغذیه برای راه‌اندازی سرووها دارد، معمولاً در 5 ولت. ESP32 به عنوان دستگاه اصلی عمل می‌کند و سیگنال‌های کنترلی لازم را به ماجیول‌های فرعی PCA9685 ارائه می‌دهد.

جزئیات برگه داده

تولیدکننده ادافروت
شماره قطعه PCA9685
ولتاژ منطق/ورودی-خروجی ۳.۳ ولت تا ۵.۵ ولت
ولتاژ تأمین ۵ ولت
جریان خروجی (به ازای هر کانال) ~20 میلی‌آمپر
جریان اوج (به ازای هر کانال) ~25 میلی‌آمپر
راهنمای فرکانس PWM ۶۰ هرتز
آستانه‌های منطق ورودی 0.3*VDD(کم)، ۰.۷*VDD(بالا)
کاهش ولتاژ / RDS(on)/ اشباع حداکثر 0.5 ولت
محدودیت‌های حرارتی ۱۲۵ درجه سلسیوس
بسته HTSSOP-28
یادداشت‌ها / انواع کنترل‌گر PWM 16 کاناله

  • از منبع تغذیه خارجی برای سروها استفاده کنید (5 ولت، 2 آمپر توصیه می‌شود).
  • اطمینان حاصل کنید که اتصال زمینی مناسبی بین ESP32 و PCA9685 برقرار است.
  • تنظیمات فرکانس PWM را برای بهینه‌سازی عملکرد سروو بررسی کنید.
  • محدودیت‌های عرض پالس را بر اساس مشخصات سروو تنظیم کنید.
  • هنگام فعال بودن چند سرو، مراقب جریان برق باشید.

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

ESP32 wiring for PCA99685 for 32 sevo motors

برای اتصال PCA9685 به ESP32، ابتدا تغذیه و زمین را متصل کنید. V را متصل کنیدCCپایه روی PCA9685 را به منبع تغذیه ۵ ولت وصل کنید و پایه GND را به یکی از پایه‌های GND روی ESP32 متصل کنید. این اطمینان می‌دهد که هم ماجیول و هم ESP32 یک زمین مشترک دارند.

در مرحله بعد، برای ارتباط I2C، پایه SDA روی PCA9685 را به GPIO 21 روی ESP32 و پایه SCL را به GPIO 22 متصل کنید. این تنظیمات اجازه می‌دهد که ESP32 با ماجیول PCA9685 به‌درستی ارتباط برقرار کند. حتماً از سیم‌های کوتاه استفاده کنید تا از اغتشاش (نویز) در خطوط ارتباطی جلوگیری شود، به‌ویژه اگر با چند سرو کار می‌کنید.

اتصال دو برد PCA9685

همانطور که در تصویر بالا نشان داده شده است، برای بورد PCA9685 شماره 2 (در سمت چپ)، اطمینان حاصل کنید که آن مسیر برای تنظیم آدرس I2C لحیم‌کاری شود تا با بورد شماره 1 (در سمت راست) متفاوت باشد.

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

شِفر (کود) ماجیول‌های PCA9685 را راه‌اندازی کرده و فرکانس PWM را تنظیم می‌کند. شناسه‌های کلیدی در شِفر (کود) شاملboard1وboard2، که نماینده دو ماجیول PCA9685 متصل به ESP32 هستند.setup()تابع، مانیتور سری را راه‌اندازی کرده و فرکانس PWM را برای هر دو برد تنظیم می‌کند.

void setup() {
  Serial.begin(9600);
  Serial.println("32 channel Servo test!");
  
  board1.begin();
  board2.begin();  
  board1.setPWMFreq(60);  // Analog servos run at ~60 Hz updates
  board2.setPWMFreq(60);
}

این قطعه روند راه‌اندازی را نشان می‌دهد، جایی که ارتباط سریالی آغاز می‌شود و فرکانس PWM برای درایورهای سروو تنظیم می‌شود.setPWMFreq(60)عملکرد تضمین می‌کند که سروها فرکانس صحیح را برای عملکرد روان دریافت کنند.

در حلقه، یک حلقه for از زوایای 0 تا 180 درجه عبور می‌کند و دستورات عرض پالس را به سرووهایی که به هر دو برد PCA9685 متصل هستند ارسال می‌کند. این تابعangleToPulseزاویه را به عرض پالس correspond زمینه تبدیل می‌کند.

void loop() {
    for(int angle = 0; angle < 181; angle += 10) {
        for(int i = 0; i < 16; i++) {      
            board2.setPWM(i, 0, angleToPulse(angle));
            board1.setPWM(i, 0, angleToPulse(angle));
        }
    }
    delay(100);
}

این قطعه شِفر (کود) نشان می‌دهد که چگونه سرووها در یک حلقه کنترل می‌شوند. زاویه سروو به میزان ۱۰ درجه افزایش می‌یابد وsetPWMتابع برای هر دو بُرد فراخوانی می‌شود تا سرووها را به زاویه مشخص شده منتقل کند. تأخیر امکان یک وقفه کوتاه بین حرکات را فراهم می‌کند.

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

پس از پایان کار با سیم‌کشی و بارگذاری شِفر (کود)، باید شاهد حرکت سرو موتور‌ها به صورت تدریجی از ۰ تا ۱۸۰ درجه باشید. این اتفاق برای تمامی ۳۲ سرو موتوری که به دو ماجیول PCA9685 متصل هستند به‌طور همزمان رخ خواهد داد. اگر هر سرو موتوری پاسخ نداد، منبع تغذیه را بررسی کنید و اطمینان حاصل کنید که تمام اتصالات محکم هستند (در ویدیو در ساعت ۱۲:۳۰).

ماجیول PCA9685
ماجیول PCA9685

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

  • ۰۰:۰۰ شروع
  • 00:۳۶ مقدمه
  • 04:01 توضیح سیم‌کشی (فقط ESP32)
  • 06:26 آماده‌سازی Arduino IDE برای ESP32
  • 08:34 شِفر (کود) توضیح داده شده
  • ۱۳:۴۰ نمایش اجرای ۳۲ موتور سروو

تصاویر

PCA9685 module-0
PCA9685 module-0
PCA9685 module-2
PCA9685 module-2
PCA9685 module-3
PCA9685 module-3
PCA9685 module
PCA9685 module
Connecting two PCA9685 board
Connecting two PCA9685 board
ESP32 wiring for PCA99685 for 32 sevo motors
ESP32 wiring for PCA99685 for 32 sevo motors
880-new- PCA9685 Video V4, Arduino ESP32 Code : Controlling all 32 servo motor wihtout WiFi
زبان: C++
/*
 * کتابخانه اصلی منبع: https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library
 * 
 * این شِفر (کود) آردوینو کنترلر سرو موتورها PCA6985 با ۱۶ کانال است 
 * که می‌تواند ۳۲ سرو موتور را با برد ESP32 بدون WiFi کنترل کند.
 * 
 * این شِفر (کود) و اتصالات را از این ویدئو دریافت کنید: http://robojax.com/RJT268
 * 
 * این ویدئو V4 درباره PCA9685 است: https://youtu.be/JFdXB8Za5Os
 * 
 * ویدئو را برای جزئیات (V1) و دمو تماشا کنید: http://youtu.be/y8X9X10Tn1k
 * 
 * نوشته/به‌روزرسانی شده توسط احمد شمشیری برای کانال ویدئویی Robojax www.Robojax.com
 * تاریخ: ۱۵ دسامبر ۲۰۱۹، در اِجَکس، انتاریو، کانادا
 * 
 * توجه: این شِفر (کود) "همان‌طور که هست" است و فقط برای مقاصد آموزشی می‌باشد.
 * 
 * یا می‌توانید با استفاده از PayPal کمک مالی کنید: http://robojax.com/L/?id=64
 * 
 * این شِفر (کود) "همان‌طور که هست" است بدون هیچ گونه ضمانت یا مسئولیتی. آزاد است که استفاده شود به شرطی که این یادداشت دست نخورده باقی بماند.*
 * این شِفر (کود) از Robojax.com دانلود شده است.
 * این برنامه نرم‌افزار آزاد است: شما می‌توانید آن را دوباره توزیع کرده و/یا تغییر دهید
 * بر اساس شرایط GNU General Public License که توسط
 * بنیاد نرم‌افزار آزاد منتشر شده، نسخه ۳ از این مجوز، یا
 * (به انتخاب شما) هر نسخه بعدی.
 * 
 * این برنامه با امید این که مفید باشد توزیع می‌شود،
 * اما بدون هیچ گونه ضمانتی؛ حتی بدون ضمانت ضمنی
 * تجارت یا سالم بودن برای هدف خاص. برای جزئیات بیشتر به
 * GNU General Public License مراجعه کنید.
 * 
 * شما باید یک نسخه از GNU General Public License را
 * همراه با این برنامه دریافت کرده باشید. اگر نه، به <https://www.gnu.org/licenses/> مراجعه کنید.
 */
#include <Wire.h>

#include <Adafruit_PWMServoDriver.h>

 // به این صورت نامیده می‌شود، این آدرس پیش‌فرض 0x40 را استفاده می‌کند.
Adafruit_PWMServoDriver board1 = Adafruit_PWMServoDriver(0x40);
Adafruit_PWMServoDriver board2 = Adafruit_PWMServoDriver(0x41);

 // بسته به نوع سرووی شما، حداقل و حداکثر عرض پالس ممکن است متفاوت باشد، شما
 // می‌خواهیم اینها به اندازه‌ی ممکن کوچک/بزرگ باشند بدون اینکه به توقف سخت برسند.
 // برای حداکثر دامنه. شما باید آنها را بر حسب نیاز تنظیم کنید تا با سرووهایی که دارید مطابقت داشته باشند.
 // داشته باشید!
 // ویدئو V1 را تماشا کنید تا دو خط زیر را درک کنید: http://youtu.be/y8X9X10Tn1k
#define SERVOMIN  125 // این حداقل تعداد طول پالس (از ۴۰۹۶) است.
#define SERVOMAX  575 // این تعداد طول پالس 'حداکثر' است (از ۴۰۹۶)


int servoNumber = 0;

void setup() {
  Serial.begin(9600);
  Serial.println("32 channel Servo test!");

  board1.begin();
  board2.begin();
  board1.setPWMFreq(60); // سروهای آنالوگ با به‌روزرسانی‌های ~60 هرتز کار می‌کنند
  board2.setPWMFreq(60);
 // yield();
}

 // شِفر (کود) داخل loop() توسط Robojax به روز شده است
void loop() {


    for( int angle =0; angle<181; angle +=10){
      for(int i=0; i<16; i++)
        {
            board2.setPWM(i, 0, angleToPulse(angle) );
            board1.setPWM(i, 0, angleToPulse(angle) );
        }
    }

 // کنترل سرو 16 کاناله PCA9865 روژاژ
  delay(100);

}

/*
 * زاویه به پالس(int ang)  
 * زاویه را به درجه می‌گیرد و عرض پالس را برمی‌گرداند  
 * همچنین مقدار را در نمایشگر مسلسل چاپ می‌کند  
 * نوشته شده توسط احمد شمشیری برای روبوجکس، Robojax.com
 */
int angleToPulse(int ang){
   int pulse = map(ang,0, 180, SERVOMIN,SERVOMAX); // زاویه نقشه ۰ تا ۱۸۰ را به حداقل سروو و حداکثر سروو مرتبط کنید
   Serial.print("Angle: ");Serial.print(ang);
   Serial.print(" pulse: ");Serial.println(pulse);
   return pulse;
}

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

منابع و مراجع

هنوز هیچ منبعی موجود نیست.

فایل‌ها📁

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