ویژگی های ماژول درایور PWM/سروو 12 بیتی 16 کاناله PCA9685
ماژول PCA9685 دارای 16 کانال PWM میباشد. این ماژول بسیار پرکاربرد بوده و زمانی که به تعداد زیادی پین خروجی PWM داریم، مورد استفاده قرار میگیرد. یکی از مهمترین کابردهای این ماژول کنترل سروو موتورها میباشد. با استفاده از این ماژول میتوانیم تعداد زیادی از سروو موتورها را به طور همزمان کنترل کنیم.
همانطور که گفته شد از درایور PCA9685 میتوان برای کنترل 16 سروو موتور استفاده کرد. در واقع این ماژول تنها با استفاده از 2 پین I2C میکروکنترلر این کار را انجام میدهد. در ضمن میتوان با اتصال 62 عدد از این درایور ها به هم، 992 عدد سروو موتور را تنها با استفاده از همان 2 پین میکروکنترلر کنترل کرد.
دیگر ویژگیهای این ماژول :
- فرکانس قابل تنظیم PWM تا حدود 1.6 کیلوهرتز
- رزولوشن 12-bit برای هر خروجی
برای راهاندازی این ماژول از سروو موتور MG-995 استفاده میکنیم. ولتاژ اعمالی این موتور بایستی در بازه 4.8 تا 7.2 ولت باشد. فرکانس این موتور 50 هرتز بوده و دوره زمانی PWM آن 20 میلیثانیه میباشد. این موتور دارای 3 پایه به شرح زیر است:
- PWM: نارنجی
- VCC: قرمز
- GND: قهوهای
دیتاشیت PCA9685 را میتوانید از اینجا دانلود کنید.
معرفی پایه های (Pinout) ماژول درایور PWM/سروو 12 بیتی 16 کاناله PCA9685
ماژول درایور 16 کاناله PCA9685 دارای پایههایی به شرح زیر است:
پایه های قدرت:
- VCC: تغذیه ماژول
- GND: زمین
- +V: تغذیه سروو موتورها- ولتاژ این تغذیه بایستی 5-6 ولت باشد.
- IN2: پایه کنترلی 2
پایه های کنترل:
- SCL: پایه کلاک I2C
- SDA: پایه دیتای I2C
- OE: پایه فعالسازی خروجی – اگر این پایه HIGH باشد، خروجیهای ماژول غیرفعال میشوند.
پایه های خروجی:
- PWM: خروجی PWM
- +V: تغذیه خروجی
- GND: زمین
اخطار
ولتاژ VCC فقط برای تغذیه ماژول میباشد. اگر از سروو موتور یا LED در خروجی استفاده میکنید، +V را به منبع تغذیه مناسب متصل کنید.
پین اوت (Pinout) این ماژول را می توانید در تصویر زیر مشاهده کنید.
لوازمی که به آن احتیاج دارید
قطعات مورد نیاز
نرم افزارهای مورد نیاز
تذکر
راه اندازی ماژول درایور PWM/سروو 12 بیتی 16 کاناله PCA9685 با آردوینو
گام اول: سیم بندی
مطابق مدار زیر ماژول را به آردوینو و سروو موتورها وصل کنید.
اخطار
گام دوم: نصب کتابخانه
به Library manager رفته و کلمه Servo را سرچ کنید و در ادامه مطابق با تصویر زیر کتابخانه آن با نام Adafruit PWM Servo Driver Library را نصب کنید.
گام سوم: کد
کد زیر را روی آردوینو خود آپلود کنید.
/*
PCA9685-16Channel-12bit-PWM-Servo-Driver
modified on 16 Dec 2020
by Amir Mohammad Shojaee @ Electropeak
Home<iframe class="wp-embedded-content" sandbox="allow-scripts" security="restricted" style="position: absolute; clip: rect(1px, 1px, 1px, 1px);" title="“Home” — Electropeak" src="https://electropeak.com/learn/embed/#?secret=h8xUvyXrkF" data-secret="h8xUvyXrkF" width="600" height="338" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
based on Arduino - Adafruit library
*/
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
// called this way, it uses the default address 0x40
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
#define SERVOMIN 150 // This is the 'minimum' pulse length count (out of 4096)
#define SERVOMAX 600 // This is the 'maximum' pulse length count (out of 4096)
#define USMIN 600 // This is the rounded 'minimum' microsecond length based on the minimum pulse of 150
#define USMAX 2400 // This is the rounded 'maximum' microsecond length based on the maximum pulse of 600
#define SERVO_FREQ 50 // Analog servos run at ~50 Hz updates
// our servo # counter
uint8_t servonum = 0;
void setup() {
Serial.begin(9600);
Serial.println("4 channel Servo test!");
pwm.begin();
pwm.setOscillatorFrequency(27000000);
pwm.setPWMFreq(SERVO_FREQ); // Analog servos run at ~50 Hz updates
delay(10);
}
// You can use this function if you'd like to set the pulse length in seconds
// e.g. setServoPulse(0, 0.001) is a ~1 millisecond pulse width. It's not precise!
void setServoPulse(uint8_t n, double pulse) {
double pulselength;
pulselength = 1000000; // 1,000,000 us per second
pulselength /= SERVO_FREQ; // Analog servos run at ~60 Hz updates
Serial.print(pulselength); Serial.println(" us per period");
pulselength /= 4096; // 12 bits of resolution
Serial.print(pulselength); Serial.println(" us per bit");
pulse *= 1000000; // convert input seconds to us
pulse /= pulselength;
Serial.println(pulse);
pwm.setPWM(n, 0, pulse);
}
void loop() {
// Drive each servo one at a time using setPWM()
Serial.println(servonum);
for (uint16_t pulselen = SERVOMIN; pulselen < SERVOMAX; pulselen++) {
pwm.setPWM(servonum, 0, pulselen);
}
delay(500);
for (uint16_t pulselen = SERVOMAX; pulselen > SERVOMIN; pulselen--) {
pwm.setPWM(servonum, 0, pulselen);
}
delay(500);
servonum++;
if (servonum > 3) servonum = 0; // Testing the first 4 servo channels
}
در ابتدای این برنامه دو کتابخانه مورد نیاز پیوست شده است. در ادامه دادههای مربوط به سروو موتور ثبت میشود. در ادامه و در حلقه اصلی برنامه، هر استپر موتور به ترتیب 180 درجه در جهت مستقیم و 180 درجه هم در جهت معکوس میچرخند. فقط دقت داشته باشید اگر از تعداد سروو موتورهای بیشتر یا کمتر از 4 عدد استفاده میکنید، تعداد آن را در خط آخر برنامه تغییر دهید.
تصویر زیر خروجی سریال مانیتور میباشد. زمانی که هر کدام از سروو موتورها به چرخش در میآید، شماره آن نیز در سریال مانیتور ظاهر میگردد.