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

کنترل یک موتور سرو 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++
/*
 * Original library source: https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library
 * 
 * This is the Arduino code PCA6985 16 channel servo controller
 * to control 32 Servo Motors with ESP32 board without WiFi

  get this code and wiring from for this video:  http://robojax.com/RJT268
 * 
 * This is V4 Video on PCA9685: https://youtu.be/JFdXB8Za5Os
 * 
 * watch the video for details (V1) and demo http://youtu.be/y8X9X10Tn1k

 *  
   
 * Written/updated by Ahmad Shamshiri for Robojax Video channel www.Robojax.com
 * Date: Dec 15, 2019, in Ajax, Ontario, Canada

 * Disclaimer: this code is "AS IS" and for educational purpose only.


or make donation using PayPal http://robojax.com/L/?id=64

 *  * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.* 
 * This code has been download from Robojax.com
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
#include <Wire.h>

#include <Adafruit_PWMServoDriver.h>

// called this way, it uses the default address 0x40
Adafruit_PWMServoDriver board1 = Adafruit_PWMServoDriver(0x40);
Adafruit_PWMServoDriver board2 = Adafruit_PWMServoDriver(0x41);

// Depending on your servo make, the pulse width min and max may vary, you 
// want these to be as small/large as possible without hitting the hard stop
// for max range. You'll have to tweak them as necessary to match the servos you
// have!
// Watch video V1 to understand the two lines below: http://youtu.be/y8X9X10Tn1k
#define SERVOMIN  125 // this is the 'minimum' pulse length count (out of 4096)
#define SERVOMAX  575 // this is the 'maximum' pulse length count (out of 4096)


int servoNumber = 0;

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);
  //yield();
}

// the code inside loop() has been updated by 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) );
        }
    }
  
// robojax PCA9865 16 channel Servo control
  delay(100);
 
}

/*
 * angleToPulse(int ang)
 * gets angle in degree and returns the pulse width
 * also prints the value on seial monitor
 * written by Ahmad Shamshiri for Robojax, Robojax.com
 */
int angleToPulse(int ang){
   int pulse = map(ang,0, 180, SERVOMIN,SERVOMAX);// map angle of 0 to 180 to Servo min and Servo max 
   Serial.print("Angle: ");Serial.print(ang);
   Serial.print(" pulse: ");Serial.println(pulse);
   return pulse;
}

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

منابع و مراجع

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

فایل‌ها📁

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