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

این آموزش شما را از طریق اجزای سختافزاری لازم، دستورالعملهای سیمکشی و نمای کلی کدی که برای دستیابی به این کنترل نیاز است راهنمایی میکند. برای یک نمایش دقیقتر، به تماشای ویدیوی مربوطه در (در ویدیو در 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 را برای بهینهسازی عملکرد سروو بررسی کنید.
- محدودیتهای عرض پالس را بر اساس مشخصات سروو تنظیم کنید.
- هنگام فعال بودن چند سرو، مراقب جریان برق باشید.
دستورالعملهای سیمکشی

برای اتصال PCA9685 به ESP32، ابتدا تغذیه و زمین را متصل کنید. V را متصل کنیدCCپایه روی PCA9685 را به منبع تغذیه ۵ ولت وصل کنید و پایه GND را به یکی از پایههای GND روی ESP32 متصل کنید. این اطمینان میدهد که هم ماجیول و هم ESP32 یک زمین مشترک دارند.
در مرحله بعد، برای ارتباط I2C، پایه SDA روی PCA9685 را به GPIO 21 روی ESP32 و پایه SCL را به GPIO 22 متصل کنید. این تنظیمات اجازه میدهد که ESP32 با ماجیول 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 متصل هستند بهطور همزمان رخ خواهد داد. اگر هر سرو موتوری پاسخ نداد، منبع تغذیه را بررسی کنید و اطمینان حاصل کنید که تمام اتصالات محکم هستند (در ویدیو در ساعت ۱۲:۳۰).
برچسبهای زمانی ویدیو
- ۰۰:۰۰ شروع
- 00:۳۶ مقدمه
- 04:01 توضیح سیمکشی (فقط ESP32)
- 06:26 آمادهسازی Arduino IDE برای ESP32
- 08:34 شِفر (کود) توضیح داده شده
- ۱۳:۴۰ نمایش اجرای ۳۲ موتور سروو
این آموزش بخشی از: کنترل سروو موتور ۱۶ یا ۳۲ با PCA9685
- شِفر (کود) آردوینو و ویدیو برای کنترلکننده سروو PCA9685، 16 کاناله، 12 بیتی، V1
- کنترل 16 موتور سروو با استفاده از ماجیول PCA9685 و شِفر (کود) آردوینو V2 نمونه #1: یکی یکی
- کنترل ۲۴ موتور سروو با استفاده از ماجیول PCA9685 و شِفر (کود) Arduino V2: کنترل موتور سروو فردی
- Controlling 16 Servo Motors Using a PCA9685 Module and Arduino V2 Sketch #3: All Servos Together
- کنترل یک سروو موتور ۳۲ با استفاده از ماجیول PCA9685 و برنامه آردوینو V3 طرح #۱: همه سرووها با هم
- کنترل ۳۲ سروو از راه Wi-Fi با استفاده از ESP32 و PCA9685 از طریق دسکتاپ یا گوشی موبایل V5
/*
* 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;
}
مواردی که ممکن است به آنها نیاز داشته باشید
-
آمازون
-
ایبیخرید PCA9685 از eBayebay.us
-
علیاکسپرسخرید PCA9685 از علیاکسپرسs.click.aliexpress.com
-
بنگ گودپیش خرید PCA9685 از بانگودbanggood.com
منابع و مراجع
هنوز هیچ منبعی موجود نیست.
فایلها📁
کتابخانههای آردوینو (zip)
-
کتابخانه-درایور-سروو-پیدبلیوام-آدافروت-اصلی
Adafruit-PWM-Servo-Driver-Library-master.zip0.02 MB